summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Bogott <abogott@wikimedia.org>2020-06-01 10:04:12 -0500
committerErik Olof Gunnar Andersson <eandersson@blizzard.com>2020-10-15 22:39:53 +0000
commit06883ab79ec6567282f86cf3ac90f7dd4d83b1dd (patch)
tree6069b970c8b514ea572c57f3490fe31a2a8c2ac2
parent688987ab44e9dc167ba9d5928d72748313196fc9 (diff)
downloaddesignate-06883ab79ec6567282f86cf3ac90f7dd4d83b1dd.tar.gz
pdns4 backend: check if zone exists before attempting delete
This should prevent us from obsessing over zones that are in the designate DB but not in the pdns backend due to races/incomplete transactions/etc. Bug: 1880230 Change-Id: I00ae6227edf21007c39a7d55221898ae5c10dda2 (cherry picked from commit 5acba9443e2fc1f6e78f9a32cd85eb168d2a7cb2)
-rw-r--r--designate/backend/impl_pdns4.py21
-rw-r--r--designate/tests/unit/backend/test_pdns4.py26
2 files changed, 40 insertions, 7 deletions
diff --git a/designate/backend/impl_pdns4.py b/designate/backend/impl_pdns4.py
index c2e92ddb..15234abd 100644
--- a/designate/backend/impl_pdns4.py
+++ b/designate/backend/impl_pdns4.py
@@ -106,10 +106,17 @@ class PDNS4Backend(base.Backend):
def delete_zone(self, context, zone):
"""Delete a DNS zone"""
- try:
- requests.delete(
- self._build_url(zone.name),
- headers=self.headers
- ).raise_for_status()
- except requests.HTTPError as e:
- raise exceptions.Backend(e)
+ # First verify that the zone exists -- If it's not present
+ # in the backend then we can just declare victory.
+ if self._check_zone_exists(zone):
+ try:
+ requests.delete(
+ self._build_url(zone.name),
+ headers=self.headers
+ ).raise_for_status()
+ except requests.HTTPError as e:
+ raise exceptions.Backend(e)
+ else:
+ LOG.warning("Trying to delete zone %s but that zone is not "
+ "present in the pdns backend. Assuming success.",
+ zone)
diff --git a/designate/tests/unit/backend/test_pdns4.py b/designate/tests/unit/backend/test_pdns4.py
index 2439d7f2..a04a28c8 100644
--- a/designate/tests/unit/backend/test_pdns4.py
+++ b/designate/tests/unit/backend/test_pdns4.py
@@ -285,6 +285,28 @@ class PDNS4BackendTestCase(designate.tests.TestCase):
req_mock.delete(
'%s/localhost/zones/example.com.' % self.base_address,
)
+ req_mock.get(
+ '%s/localhost/zones/%s' % (self.base_address, self.zone.name),
+ status_code=200,
+ )
+
+ self.backend.delete_zone(self.context, self.zone)
+
+ self.assertEqual(
+ req_mock.last_request.headers.get('X-API-Key'), 'api_key'
+ )
+
+ @requests_mock.mock()
+ def test_delete_zone_missing(self, req_mock):
+ req_mock.delete(
+ '%s/localhost/zones/example.com.' % self.base_address,
+ )
+
+ # pdns returns 422 if asked about a zone that doesn't exist.
+ req_mock.get(
+ '%s/localhost/zones/%s' % (self.base_address, self.zone.name),
+ status_code=422,
+ )
self.backend.delete_zone(self.context, self.zone)
@@ -298,6 +320,10 @@ class PDNS4BackendTestCase(designate.tests.TestCase):
'%s/localhost/zones/example.com.' % self.base_address,
status_code=500,
)
+ req_mock.get(
+ '%s/localhost/zones/%s' % (self.base_address, self.zone.name),
+ status_code=200,
+ )
self.assertRaisesRegexp(
exceptions.Backend,