diff options
author | ramishra <ramishra@redhat.com> | 2021-03-04 09:38:21 +0530 |
---|---|---|
committer | ramishra <ramishra@redhat.com> | 2021-03-05 10:40:38 +0530 |
commit | 0b593c218d9f87c9b105cd8ac1e92949d73aa592 (patch) | |
tree | 5f07e53d76384c340dc6c7e4129939e947667a6a /heat | |
parent | 93594c30eca3a52366e8138a583a00dbe5927d7d (diff) | |
download | heat-0b593c218d9f87c9b105cd8ac1e92949d73aa592.tar.gz |
Allow deleting Server/DeployedServer without swift/zaqar
When swift and zaqar used for software_config_transport
are removed/disabled in the deployment, we should be
able to delete Server/DeplpyedServer resources.
Change-Id: I4c9e0729f338de67b4b598fcd0e72646289d5025
Task: 2008685
Diffstat (limited to 'heat')
-rw-r--r-- | heat/engine/resources/server_base.py | 41 | ||||
-rw-r--r-- | heat/tests/openstack/nova/fakes.py | 3 | ||||
-rw-r--r-- | heat/tests/openstack/nova/test_server.py | 51 |
3 files changed, 76 insertions, 19 deletions
diff --git a/heat/engine/resources/server_base.py b/heat/engine/resources/server_base.py index cce356b0b..50a04e0a2 100644 --- a/heat/engine/resources/server_base.py +++ b/heat/engine/resources/server_base.py @@ -240,11 +240,8 @@ class BaseServer(stack_user.StackUser): def _update_software_config_transport(self, prop_diff): if not self.user_data_software_config(): return - try: - self._delete_queue() - self._delete_temp_url() - except Exception: - pass + self._delete_queue() + self._delete_temp_url() metadata = self.metadata_get(True) or {} self._create_transport_credentials(prop_diff) @@ -276,15 +273,18 @@ class BaseServer(stack_user.StackUser): object_name = self.data().get('metadata_object_name') if not object_name: return - with self.client_plugin('swift').ignore_not_found: - container = self.properties[self.DEPLOYMENT_SWIFT_DATA].get( - 'container') - container = container or self.physical_resource_name() - swift = self.client('swift') - swift.delete_object(container, object_name) - headers = swift.head_container(container) - if int(headers['x-container-object-count']) == 0: - swift.delete_container(container) + endpoint_exists = self.client_plugin().does_endpoint_exist( + 'swift', 'object-store') + if endpoint_exists: + with self.client_plugin('swift').ignore_not_found: + container = self.properties[self.DEPLOYMENT_SWIFT_DATA].get( + 'container') + container = container or self.physical_resource_name() + swift = self.client('swift') + swift.delete_object(container, object_name) + headers = swift.head_container(container) + if int(headers['x-container-object-count']) == 0: + swift.delete_container(container) self.data_delete('metadata_object_name') self.data_delete('metadata_put_url') @@ -292,11 +292,14 @@ class BaseServer(stack_user.StackUser): queue_id = self.data().get('metadata_queue_id') if not queue_id: return - client_plugin = self.client_plugin('zaqar') - zaqar = client_plugin.create_for_tenant( - self.stack.stack_user_project_id, self._user_token()) - with client_plugin.ignore_not_found: - zaqar.queue(queue_id).delete() + endpoint_exists = self.client_plugin().does_endpoint_exist( + 'zaqar', 'messaging') + if endpoint_exists: + client_plugin = self.client_plugin('zaqar') + zaqar = client_plugin.create_for_tenant( + self.stack.stack_user_project_id, self._user_token()) + with client_plugin.ignore_not_found: + zaqar.queue(queue_id).delete() self.data_delete('metadata_queue_id') def handle_snapshot_delete(self, state): diff --git a/heat/tests/openstack/nova/fakes.py b/heat/tests/openstack/nova/fakes.py index 115a9910e..6bfbf4672 100644 --- a/heat/tests/openstack/nova/fakes.py +++ b/heat/tests/openstack/nova/fakes.py @@ -321,6 +321,9 @@ class FakeSessionClient(base_client.SessionClient): def delete_servers_1234(self, **kw): return (202, None) + def delete_servers_5678(self, **kw): + return (202, None) + def get_servers_9999(self, **kw): r = {'server': self.get_servers_detail()[1]['servers'][4]} return (200, r) diff --git a/heat/tests/openstack/nova/test_server.py b/heat/tests/openstack/nova/test_server.py index f4aec2a81..794081481 100644 --- a/heat/tests/openstack/nova/test_server.py +++ b/heat/tests/openstack/nova/test_server.py @@ -1073,6 +1073,43 @@ class ServersTest(common.HeatTestCase): 'deployments': [] }, server.metadata_get()) + def test_delete_swift_service_removed(self): + self.patchobject(nova.NovaClientPlugin, 'client', + return_value=self.fc) + return_server = self.fc.servers.list()[1] + stack_name = 'software_config_s' + (tmpl, stack) = self._setup_test_stack(stack_name) + + props = tmpl.t['Resources']['WebServer']['Properties'] + props['user_data_format'] = 'SOFTWARE_CONFIG' + props['software_config_transport'] = 'POLL_TEMP_URL' + self.server_props = props + + resource_defns = tmpl.resource_definitions(stack) + server = servers.Server('WebServer', + resource_defns['WebServer'], stack) + self.patchobject(server, 'store_external_ports') + + sc = mock.Mock() + sc.head_account.return_value = { + 'x-account-meta-temp-url-key': 'secrit' + } + sc.url = 'http://192.0.2.2' + + self.patchobject(swift.SwiftClientPlugin, '_create', + return_value=sc) + self.patchobject(self.fc.servers, 'create', + return_value=return_server) + scheduler.TaskRunner(server.create)() + self.assertEqual((server.CREATE, server.COMPLETE), server.state) + self.patchobject(server.client_plugin(), + 'does_endpoint_exist', + return_value=False) + side_effect = [server, fakes_nova.fake_exception()] + self.patchobject(self.fc.servers, 'get', side_effect=side_effect) + scheduler.TaskRunner(server.delete)() + self.assertEqual((server.DELETE, server.COMPLETE), server.state) + def _prepare_for_server_create(self, md=None): self.patchobject(nova.NovaClientPlugin, 'client', return_value=self.fc) @@ -1165,6 +1202,20 @@ class ServersTest(common.HeatTestCase): scheduler.TaskRunner(server.delete)() self.assertEqual((server.DELETE, server.COMPLETE), server.state) + def test_delete_zaqar_service_removed(self): + zcc = self.patchobject(zaqar.ZaqarClientPlugin, 'create_for_tenant') + zcc.return_value = mock.Mock() + server, stack = self._prepare_for_server_create() + scheduler.TaskRunner(server.create)() + self.assertEqual((server.CREATE, server.COMPLETE), server.state) + self.patchobject(server.client_plugin(), + 'does_endpoint_exist', + return_value=False) + side_effect = [server, fakes_nova.fake_exception()] + self.patchobject(self.fc.servers, 'get', side_effect=side_effect) + scheduler.TaskRunner(server.delete)() + self.assertEqual((server.DELETE, server.COMPLETE), server.state) + def test_server_create_software_config_zaqar_metadata(self): md = {'os-collect-config': {'polling_interval': 10}} queue_id, server = self._server_create_software_config_zaqar(md=md) |