summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--heat/engine/service.py9
-rw-r--r--heat/tests/test_engine_service.py15
2 files changed, 16 insertions, 8 deletions
diff --git a/heat/engine/service.py b/heat/engine/service.py
index ce1b33add..38ee7291b 100644
--- a/heat/engine/service.py
+++ b/heat/engine/service.py
@@ -1415,13 +1415,14 @@ class EngineService(service.ServiceBase):
"""
st = self._get_stack(cnxt, stack_identity)
- if (st.status == parser.Stack.COMPLETE and
- st.action == parser.Stack.DELETE):
- raise exception.EntityNotFound(entity='Stack', name=st.name)
-
LOG.info('Deleting stack %s', st.name)
stack = parser.Stack.load(cnxt, stack=st)
self.resource_enforcer.enforce_stack(stack, is_registered_policy=True)
+ if (stack.status == stack.COMPLETE and stack.action == stack.DELETE):
+ # In convergence try to soft delete the stack again
+ if stack.convergence:
+ self.thread_group_mgr.start(stack.id, stack.purge_db)
+ raise exception.EntityNotFound(entity='Stack', name=stack.name)
if stack.convergence:
stack.thread_group_mgr = self.thread_group_mgr
diff --git a/heat/tests/test_engine_service.py b/heat/tests/test_engine_service.py
index 671c65a2c..4c25f2b9f 100644
--- a/heat/tests/test_engine_service.py
+++ b/heat/tests/test_engine_service.py
@@ -956,15 +956,22 @@ class StackServiceTest(common.HeatTestCase):
self.assertEqual([], outputs)
def test_stack_delete_complete_is_not_found(self):
- mock_get_stack = self.patchobject(self.eng, '_get_stack')
- mock_get_stack.return_value = mock.MagicMock()
- mock_get_stack.return_value.status = parser.Stack.COMPLETE
- mock_get_stack.return_value.action = parser.Stack.DELETE
+ t = template_format.parse(tools.wp_template)
+ tmpl = templatem.Template(t)
+ stack = parser.Stack(self.ctx, 'delete_complete_stack', tmpl)
+ self.patchobject(self.eng, '_get_stack')
+ self.patchobject(parser.Stack, 'load', return_value=stack)
+ stack.status = stack.COMPLETE
+ stack.action = stack.DELETE
+ stack.convergence = True
+ self.eng.thread_group_mgr.start = mock.MagicMock()
ex = self.assertRaises(dispatcher.ExpectedException,
self.eng.delete_stack,
'irrelevant',
'irrelevant')
self.assertEqual(exception.EntityNotFound, ex.exc_info[0])
+ self.eng.thread_group_mgr.start.assert_called_once_with(
+ None, stack.purge_db)
def test_get_environment(self):
# Setup