diff --git a/openstack/orchestration/util/event_utils.py b/openstack/orchestration/util/event_utils.py index 5d56bf66a..6ae36a39d 100644 --- a/openstack/orchestration/util/event_utils.py +++ b/openstack/orchestration/util/event_utils.py @@ -60,7 +60,8 @@ def poll_for_events( msg_template = "\n Stack %(name)s %(status)s \n" def is_stack_event(event): - if event.get('resource_name', '') != stack_name: + if (event.get('resource_name', '') != stack_name + and event.get('physical_resource_id', '') != stack_name): return False phys_id = event.get('physical_resource_id', '') diff --git a/openstack/tests/unit/cloud/test_stack.py b/openstack/tests/unit/cloud/test_stack.py index 7ee2047d3..72335f740 100644 --- a/openstack/tests/unit/cloud/test_stack.py +++ b/openstack/tests/unit/cloud/test_stack.py @@ -183,9 +183,66 @@ class TestStack(base.TestCase): self.cloud.delete_stack(self.stack_id) self.assert_calls() - def test_delete_stack_wait(self): + def test_delete_stack_by_name_wait(self): marker_event = fakes.make_fake_stack_event( - self.stack_id, self.stack_name, status='CREATE_COMPLETE') + self.stack_id, self.stack_name, status='CREATE_COMPLETE', + resource_name='name') + marker_qs = 'marker={e_id}&sort_dir=asc'.format( + e_id=marker_event['id']) + resolve = 'resolve_outputs=False' + self.register_uris([ + dict(method='GET', + uri='{endpoint}/stacks/{name}?{resolve}'.format( + endpoint=fakes.ORCHESTRATION_ENDPOINT, + name=self.stack_name, + resolve=resolve), + status_code=302, + headers=dict( + location='{endpoint}/stacks/{name}/{id}?{resolve}'.format( + endpoint=fakes.ORCHESTRATION_ENDPOINT, + id=self.stack_id, name=self.stack_name, + resolve=resolve))), + dict(method='GET', + uri='{endpoint}/stacks/{name}/{id}?{resolve}'.format( + endpoint=fakes.ORCHESTRATION_ENDPOINT, + id=self.stack_id, name=self.stack_name, resolve=resolve), + json={"stack": self.stack}), + dict(method='GET', + uri='{endpoint}/stacks/{name}/events?{qs}'.format( + endpoint=fakes.ORCHESTRATION_ENDPOINT, + name=self.stack_name, + qs='limit=1&sort_dir=desc'), + complete_qs=True, + json={"events": [marker_event]}), + dict(method='DELETE', + uri='{endpoint}/stacks/{id}'.format( + endpoint=fakes.ORCHESTRATION_ENDPOINT, + id=self.stack_id)), + dict(method='GET', + uri='{endpoint}/stacks/{name}/events?{qs}'.format( + endpoint=fakes.ORCHESTRATION_ENDPOINT, + name=self.stack_name, + qs=marker_qs), + complete_qs=True, + json={"events": [ + fakes.make_fake_stack_event( + self.stack_id, self.stack_name, + status='DELETE_COMPLETE', resource_name='name'), + ]}), + dict(method='GET', + uri='{endpoint}/stacks/{name}?{resolve}'.format( + endpoint=fakes.ORCHESTRATION_ENDPOINT, + id=self.stack_id, name=self.stack_name, resolve=resolve), + status_code=404), + ]) + + self.assertTrue(self.cloud.delete_stack(self.stack_name, wait=True)) + self.assert_calls() + + def test_delete_stack_by_id_wait(self): + marker_event = fakes.make_fake_stack_event( + self.stack_id, self.stack_name, status='CREATE_COMPLETE', + resource_name='name') marker_qs = 'marker={e_id}&sort_dir=asc'.format( e_id=marker_event['id']) resolve = 'resolve_outputs=False'