summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2022-06-03 07:35:12 +0000
committerGerrit Code Review <review@openstack.org>2022-06-03 07:35:12 +0000
commite7b4bae696349a5e5a65c23cecea16369885c79e (patch)
tree66143b771b553cb890632efd0b386ef9464900db
parent95bfb28926f388eeebaf8404fc057bb832b55559 (diff)
parent5b1b404e359a516ab468e3568412f4c69a7a0f5b (diff)
downloaddesignate-e7b4bae696349a5e5a65c23cecea16369885c79e.tar.gz
Merge "Fix zone update when adding new Bind9 target to pool." into stable/xena
-rw-r--r--designate/backend/impl_bind9.py31
-rw-r--r--designate/tests/unit/backend/test_bind9.py9
-rw-r--r--releasenotes/notes/Fix-update-zone-create-zone-ada1fd81de479492.yaml4
3 files changed, 43 insertions, 1 deletions
diff --git a/designate/backend/impl_bind9.py b/designate/backend/impl_bind9.py
index 8f04bfdc..060c8f9c 100644
--- a/designate/backend/impl_bind9.py
+++ b/designate/backend/impl_bind9.py
@@ -108,6 +108,28 @@ class Bind9Backend(base.Backend):
context, zone, self._host, self._port, self.timeout,
self.retry_interval, self.max_retries, self.delay)
+ def get_zone(self, context, zone):
+ """Returns True if zone exists and False if not"""
+ LOG.debug('Get Zone')
+
+ view = 'in %s' % self._view if self._view else ''
+
+ rndc_op = [
+ 'showzone',
+ '%s %s' % (zone['name'].rstrip('.'), view),
+ ]
+ try:
+ self._execute_rndc(rndc_op)
+ except exceptions.Backend as e:
+ if "not found" in str(e):
+ LOG.debug('Zone %s not found on the backend', zone['name'])
+ return False
+ else:
+ LOG.warning('RNDC call failure: %s', e)
+ raise e
+
+ return True
+
def delete_zone(self, context, zone):
"""Delete a new Zone by executin rndc
Do not raise exceptions if the zone does not exist.
@@ -135,14 +157,21 @@ class Bind9Backend(base.Backend):
"""
Update a DNS zone.
- This will execute a rndc modzone as the zone
+ This will execute a rndc modzone if the zone
already exists but masters might need to be refreshed.
+ Or, will create the zone if it does not exist.
:param context: Security context information.
:param zone: the DNS zone.
"""
LOG.debug('Update Zone')
+ if not self.get_zone(context, zone):
+ # If zone does not exist yet, create it
+ self.create_zone(context, zone)
+ # Newly created zone won't require an update
+ return
+
masters = []
for master in self.masters:
host = master['host']
diff --git a/designate/tests/unit/backend/test_bind9.py b/designate/tests/unit/backend/test_bind9.py
index c1189e84..272569ae 100644
--- a/designate/tests/unit/backend/test_bind9.py
+++ b/designate/tests/unit/backend/test_bind9.py
@@ -80,6 +80,15 @@ class Bind9BackendTestCase(designate.tests.TestCase):
)
@mock.patch.object(impl_bind9.Bind9Backend, '_execute_rndc')
+ def test_get_zone(self, mock_execute):
+ with fixtures.random_seed(0):
+ self.backend.get_zone(self.admin_context, self.zone)
+
+ mock_execute.assert_called_with(
+ ['showzone', 'example.com ']
+ )
+
+ @mock.patch.object(impl_bind9.Bind9Backend, '_execute_rndc')
def test_create_zone_with_view(self, mock_execute):
self.target['options'].append(
{'key': 'view', 'value': 'guest'},
diff --git a/releasenotes/notes/Fix-update-zone-create-zone-ada1fd81de479492.yaml b/releasenotes/notes/Fix-update-zone-create-zone-ada1fd81de479492.yaml
new file mode 100644
index 00000000..600ec937
--- /dev/null
+++ b/releasenotes/notes/Fix-update-zone-create-zone-ada1fd81de479492.yaml
@@ -0,0 +1,4 @@
+---
+fixes:
+ - |
+ Fixed an issue where new BIND9 pool instances may fail on zone update.