Try deleting stack if not soft deleted yet

If an engine is stopped before a stack is soft deleted but marked
DELETE COMPLETE (updated with ian empty template in convergence),
the empty stack can't be soft deleted anymore and would always end
up in the stack list.

Keeps the nested stack behaviour same by returning EnitityNotFound
as before.

Change-Id: Idc541fe0cd12d03e2d9b3cc11a1e7b0046be9d25
Story: #2002921
Task: 22901
This commit is contained in:
rabi 2018-07-10 10:25:59 +05:30
parent ce7d2174db
commit 5aef2518e7
2 changed files with 16 additions and 8 deletions

View File

@ -1341,13 +1341,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 and cfg.CONF.convergence_engine:
def convergence_delete():

View File

@ -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