Make sure to delete the credentials when stack deletion

If enable convergence, make sure to delete the
credentials when deleting stack.

Change-Id: I93096d691503bd914d1c059db3203d4f8ac5aec2
Closes-Bug: #1558964
This commit is contained in:
huangtianhua 2016-03-18 18:31:12 +08:00
parent ff75d3a111
commit 8f3d8273e4
2 changed files with 41 additions and 1 deletions

View File

@ -882,7 +882,7 @@ class Stack(collections.Mapping):
exp_trvsl=self.current_traversal) exp_trvsl=self.current_traversal)
return updated return updated
else: else:
stack.update_and_save(values) stack.update_and_save(values)
def _send_notification_and_add_event(self): def _send_notification_and_add_event(self):
notification.send(self) notification.send(self)
@ -1956,6 +1956,15 @@ class Stack(collections.Mapping):
sync_point.delete_all(self.context, self.id, self.current_traversal) sync_point.delete_all(self.context, self.id, self.current_traversal)
if (self.action, self.status) == (self.DELETE, self.COMPLETE): if (self.action, self.status) == (self.DELETE, self.COMPLETE):
if not self.owner_id:
status, reason = self._delete_credentials(
self.status,
self.status_reason,
False)
if status == self.FAILED:
# something wrong when delete credentials, set FAILED
self.state_set(self.action, status, reason)
return
try: try:
stack_object.Stack.delete(self.context, self.id) stack_object.Stack.delete(self.context, self.id)
except exception.NotFound: except exception.NotFound:

View File

@ -379,6 +379,37 @@ class StackConvergenceCreateUpdateDeleteTest(common.HeatTestCase):
stack.purge_db() stack.purge_db()
self.assertTrue(mock_tmpl_delete.called) self.assertTrue(mock_tmpl_delete.called)
@mock.patch.object(parser.Stack, '_delete_credentials')
@mock.patch.object(stack_object.Stack, 'delete')
def test_purge_db_deletes_creds(self, mock_delete_stack,
mock_creds_delete, mock_cr):
stack = tools.get_stack('test_stack', utils.dummy_context(),
template=tools.string_template_five,
convergence=True)
reason = 'stack delete complete'
mock_creds_delete.return_value = (stack.COMPLETE, reason)
stack.state_set(stack.DELETE, stack.COMPLETE, reason)
stack.purge_db()
self.assertTrue(mock_creds_delete.called)
self.assertTrue(mock_delete_stack.called)
@mock.patch.object(parser.Stack, '_delete_credentials')
@mock.patch.object(stack_object.Stack, 'delete')
def test_purge_db_deletes_creds_failed(self, mock_delete_stack,
mock_creds_delete, mock_cr):
stack = tools.get_stack('test_stack', utils.dummy_context(),
template=tools.string_template_five,
convergence=True)
reason = 'stack delete complete'
failed_reason = 'Error deleting trust'
mock_creds_delete.return_value = (stack.FAILED, failed_reason)
stack.state_set(stack.DELETE, stack.COMPLETE, reason)
stack.purge_db()
self.assertTrue(mock_creds_delete.called)
self.assertFalse(mock_delete_stack.called)
self.assertEqual((stack.DELETE, stack.FAILED), stack.state)
@mock.patch.object(raw_template_object.RawTemplate, 'delete') @mock.patch.object(raw_template_object.RawTemplate, 'delete')
def test_purge_db_does_not_delete_previous_template_when_stack_fails( def test_purge_db_does_not_delete_previous_template_when_stack_fails(
self, mock_tmpl_delete, mock_cr): self, mock_tmpl_delete, mock_cr):