From 55a7492c6c530130db93baca1b69d5521c2c5d45 Mon Sep 17 00:00:00 2001 From: Pavlo Shchelokovskyy Date: Mon, 12 Feb 2018 20:48:32 +0200 Subject: [PATCH] Ignore dns domain NotFound when deleting record when the domain is deleted, all its records are deleted as well. Not ignoring such NotFound can lead to undeletable stacks if they have a Designate::Record resource that references a deleted Designate Domain. Change-Id: If56f84b0b86f4d8136a1f83683a4a9eee5d89759 Closes-Bug: #1748953 --- heat/engine/clients/os/designate.py | 5 ++++- heat/tests/clients/test_designate_client.py | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/heat/engine/clients/os/designate.py b/heat/engine/clients/os/designate.py index 262b464e24..6df4785a26 100644 --- a/heat/engine/clients/os/designate.py +++ b/heat/engine/clients/os/designate.py @@ -97,7 +97,10 @@ class DesignateClientPlugin(client_plugin.ClientPlugin): return self.client().records.update(record.domain_id, record) def record_delete(self, **kwargs): - domain_id = self.get_domain_id(kwargs.pop('domain')) + try: + domain_id = self.get_domain_id(kwargs.pop('domain')) + except heat_exception.EntityNotFound: + return return self.client().records.delete(domain_id, kwargs.pop('id')) diff --git a/heat/tests/clients/test_designate_client.py b/heat/tests/clients/test_designate_client.py index e3dbe29ab5..8bc2e02cce 100644 --- a/heat/tests/clients/test_designate_client.py +++ b/heat/tests/clients/test_designate_client.py @@ -283,6 +283,24 @@ class DesignateClientPluginRecordTest(common.HeatTestCase): self.sample_domain_id, self.sample_uuid) + @mock.patch.object(client.DesignateClientPlugin, 'client') + @mock.patch('designateclient.v1.records.Record') + def test_record_delete_domain_not_found(self, mock_record, + client_designate): + self._client.records.delete.return_value = None + self.client_plugin.get_domain_id.side_effect = ( + heat_exception.EntityNotFound) + client_designate.return_value = self._client + + record = dict( + id=self.sample_uuid, + domain=self.sample_domain_id + ) + + self.client_plugin.record_delete(**record) + + self.assertFalse(self._client.records.delete.called) + @mock.patch.object(client.DesignateClientPlugin, 'client') @mock.patch('designateclient.v1.records.Record') def test_record_show(self, mock_record, client_designate):