Correct stack identity when delete nested

1. Update an aws asg with invalid 'VPCZoneIdentifier',
the stack update failed.
2. Update again, the stack is always in 'UPDATE_IN_PROGRESS'.

We remove the backup resources first when updating,
but the backup of stack_resource can't be deleted,
due we set an incorrect name of stack_identity before
rpc calling 'delete_stack', due the name is not match the
nested_stack's name.

Change-Id: I89966d0124607c233ac9a82f1ce14f4f2deb3f9b
Closes-Bug: #1478480
(cherry picked from commit ab234eb658)
This commit is contained in:
huangtianhua 2015-07-27 18:26:04 +08:00
parent 7e73da580f
commit 4a8282c42c
4 changed files with 24 additions and 9 deletions

View File

@ -398,10 +398,15 @@ class StackResource(resource.Resource):
''' '''
Delete the nested stack. Delete the nested stack.
''' '''
stack_identity = identifier.HeatIdentifier( try:
self.context.tenant_id, stack = self.nested()
self.physical_resource_name(), except exception.NotFound:
self.resource_id) return
if stack is None:
return
stack_identity = stack.identifier()
try: try:
self.rpc_client().delete_stack(self.context, stack_identity) self.rpc_client().delete_stack(self.context, stack_identity)

View File

@ -355,11 +355,12 @@ Outputs:
def test_handle_delete(self): def test_handle_delete(self):
self.res.rpc_client = mock.MagicMock() self.res.rpc_client = mock.MagicMock()
self.res.action = self.res.CREATE self.res.action = self.res.CREATE
self.res.nested = mock.MagicMock()
stack_identity = identifier.HeatIdentifier( stack_identity = identifier.HeatIdentifier(
self.ctx.tenant_id, self.ctx.tenant_id,
self.res.physical_resource_name(), self.res.physical_resource_name(),
self.res.resource_id) self.res.resource_id)
self.res.nested().identifier.return_value = stack_identity
self.res.handle_delete() self.res.handle_delete()
self.res.rpc_client.return_value.delete_stack.assert_called_once_with( self.res.rpc_client.return_value.delete_stack.assert_called_once_with(
self.ctx, stack_identity) self.ctx, self.res.nested().identifier())

View File

@ -924,9 +924,13 @@ class TemplateResourceCrudTest(common.HeatTestCase):
self.res.uuid = six.text_type(uuid.uuid4()) self.res.uuid = six.text_type(uuid.uuid4())
self.res.resource_id = six.text_type(uuid.uuid4()) self.res.resource_id = six.text_type(uuid.uuid4())
self.res.action = self.res.CREATE self.res.action = self.res.CREATE
self.res.nested = mock.MagicMock()
ident = identifier.HeatIdentifier(self.ctx.tenant_id, ident = identifier.HeatIdentifier(self.ctx.tenant_id,
self.res.physical_resource_name(), self.res.physical_resource_name(),
self.res.resource_id) self.res.resource_id)
self.res.nested().identifier.return_value = ident
self.res.handle_delete() self.res.handle_delete()
rpcc = self.res.rpc_client.return_value rpcc = self.res.rpc_client.return_value
rpcc.delete_stack.assert_called_once_with(self.ctx, ident) rpcc.delete_stack.assert_called_once_with(
self.ctx,
self.res.nested().identifier())

View File

@ -496,14 +496,19 @@ class StackResourceTest(common.HeatTestCase):
force_reload=True) force_reload=True)
self.m.VerifyAll() self.m.VerifyAll()
def test_delete_nested_not_found_nested_stack(self): def test_delete_nested_none_nested_stack(self):
self.parent_resource._nested = None self.parent_resource._nested = None
self.assertIsNone(self.parent_resource.delete_nested())
def test_delete_nested_not_found_nested_stack(self):
self.parent_resource._nested = mock.MagicMock()
rpcc = mock.Mock() rpcc = mock.Mock()
self.parent_resource.rpc_client = rpcc self.parent_resource.rpc_client = rpcc
rpcc.return_value.delete_stack = mock.Mock( rpcc.return_value.delete_stack = mock.Mock(
side_effect=exception.NotFound()) side_effect=exception.NotFound())
self.assertIsNone(self.parent_resource.delete_nested()) self.assertIsNone(self.parent_resource.delete_nested())
rpcc.return_value.delete_stack.assert_called_once_with(
self.parent_resource.context, mock.ANY)
def test_need_update_in_failed_state_for_nested_resource(self): def test_need_update_in_failed_state_for_nested_resource(self):
""" """