summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Galkin <galkindmitrii@gmail.com>2022-02-10 10:40:35 +0100
committerSven Kieske <s.kieske@mittwald.de>2022-06-24 04:39:05 +0000
commita74c2389bf587fc6a36c72d87fba6c958cef2141 (patch)
tree5c9abf1338790d8694e2d35819f2c974b0bf81b1
parent61097e4652d13e7b6d305ae029ee3baf00a31a51 (diff)
downloaddesignate-a74c2389bf587fc6a36c72d87fba6c958cef2141.tar.gz
Fix zone update when adding new Bind9 target to pool.
When a new Bind9 is added to the pool, Designate will trigger 'modzone' rndc command that will fail, unless zone is already present on the backend. This change will first verify that the zone is present on the backend, before an update attempt. If zone is not present - zone creation will be triggered. Closes-Bug: 1958409 Co-authored-by: Kiran Pawar <kinpaa@gmail.com> Change-Id: I782bf38a68f24a2e7133ff2afad7c96e2ae6b7f0 (cherry picked from commit 66cc876eadd9a4ded3afa35aed675c15c60f149d)
-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 b1b7d65e..3f23d846 100644
--- a/designate/backend/impl_bind9.py
+++ b/designate/backend/impl_bind9.py
@@ -104,6 +104,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.
@@ -131,14 +153,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 8e4abfa6..80686333 100644
--- a/designate/tests/unit/backend/test_bind9.py
+++ b/designate/tests/unit/backend/test_bind9.py
@@ -78,6 +78,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.