Make RPC call to abandon nested stack

Due to stacks being processable by multiple engines, resources in a
nested stack cannot be marked for retainment from the parent resource
of the nested stack. This patch makes the parent resource of the nested
stack call stack abandon instead of stack delete through the RPC client
so that nested stacks are deleted while nested stack resources are
retained.

Change-Id: I7103f46d86db35e08b014d9790215740fcae441d
Closes-bug: #1509912
This commit is contained in:
Drago Rosson 2016-04-20 23:09:45 +00:00
parent 633e745aad
commit d19c624e48
2 changed files with 18 additions and 1 deletions

View File

@ -54,6 +54,7 @@ class StackResource(resource.Resource):
def __init__(self, name, json_snippet, stack):
super(StackResource, self).__init__(name, json_snippet, stack)
self.nested_abandon_in_progress = False
self._nested = None
self.resource_info = None
@ -455,7 +456,10 @@ class StackResource(resource.Resource):
stack_identity = dict(stack.identifier())
try:
self.rpc_client().delete_stack(self.context, stack_identity)
if self.nested_abandon_in_progress:
self.rpc_client().abandon_stack(self.context, stack_identity)
else:
self.rpc_client().delete_stack(self.context, stack_identity)
except Exception as ex:
self.rpc_client().ignore_error_named(ex, 'NotFound')
@ -509,6 +513,7 @@ class StackResource(resource.Resource):
return self._check_status_complete(self.CHECK)
def prepare_abandon(self):
self.nested_abandon_in_progress = True
nested_stack = self.nested()
if nested_stack:
return self.nested().prepare_abandon()

View File

@ -200,6 +200,18 @@ class StackResourceTest(StackResourceBaseTest):
ret = self.parent_resource.prepare_abandon()
self.assertEqual({}, ret)
def test_abandon_nested_sends_rpc_abandon(self):
rpcc = mock.Mock()
self.parent_resource.rpc_client = rpcc
self.parent_resource.nested = mock.MagicMock()
self.parent_resource.prepare_abandon()
self.parent_resource.delete_nested()
rpcc.return_value.abandon_stack.assert_called_once_with(
self.parent_resource.context, mock.ANY)
rpcc.return_value.delete_stack.assert_not_called()
def test_propagated_files(self):
"""Test passing of the files map in the top level to the child.