summaryrefslogtreecommitdiff
path: root/heat
diff options
context:
space:
mode:
authorramishra <ramishra@redhat.com>2021-03-04 09:38:21 +0530
committerramishra <ramishra@redhat.com>2021-03-05 10:40:38 +0530
commit0b593c218d9f87c9b105cd8ac1e92949d73aa592 (patch)
tree5f07e53d76384c340dc6c7e4129939e947667a6a /heat
parent93594c30eca3a52366e8138a583a00dbe5927d7d (diff)
downloadheat-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.py41
-rw-r--r--heat/tests/openstack/nova/fakes.py3
-rw-r--r--heat/tests/openstack/nova/test_server.py51
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)