diff --git a/heat/engine/service.py b/heat/engine/service.py index d1fe36d71e..ae807b232e 100644 --- a/heat/engine/service.py +++ b/heat/engine/service.py @@ -1388,6 +1388,7 @@ class EngineService(service.ServiceBase): def convergence_delete(): stack.thread_group_mgr = self.thread_group_mgr self.worker_service.stop_all_workers(stack) + stack.delete_all_snapshots() template = templatem.Template.create_empty_template( from_template=stack.t) stack.converge_stack(template=template, action=stack.DELETE) diff --git a/heat/engine/stack.py b/heat/engine/stack.py index f89cfc9f43..e997ab8731 100644 --- a/heat/engine/stack.py +++ b/heat/engine/stack.py @@ -1304,14 +1304,6 @@ class Stack(collections.Mapping): LOG.info('convergence_dependencies: %s', self.convergence_dependencies) - # Delete all the snapshots before starting delete operation - if self.action == self.DELETE: - snapshots = snapshot_object.Snapshot.get_all(self.context, - self.id) - for snapshot in snapshots: - self.delete_snapshot(snapshot) - snapshot_object.Snapshot.delete(self.context, snapshot.id) - # create sync_points for resources in DB for rsrc_id, is_update in self.convergence_dependencies: sync_point.create(self.context, rsrc_id, @@ -1788,11 +1780,7 @@ class Stack(collections.Mapping): 'Failed to %s : %s' % (action, failure)) return - snapshots = snapshot_object.Snapshot.get_all(self.context, - self.id) - for snapshot in snapshots: - self.delete_snapshot(snapshot) - snapshot_object.Snapshot.delete(self.context, snapshot.id) + self.delete_all_snapshots() if not backup: try: @@ -1904,6 +1892,13 @@ class Stack(collections.Mapping): pre_completion_func=save_snapshot_func) sus_task(timeout=self.timeout_secs()) + def delete_all_snapshots(self): + """Remove all snapshots for this stack.""" + snapshots = snapshot_object.Snapshot.get_all(self.context, self.id) + for snapshot in snapshots: + self.delete_snapshot(snapshot) + snapshot_object.Snapshot.delete(self.context, snapshot.id) + @profiler.trace('Stack.delete_snapshot', hide_args=False) def delete_snapshot(self, snapshot): """Remove a snapshot from the backends.""" diff --git a/heat/tests/test_convg_stack.py b/heat/tests/test_convg_stack.py index 003e8950bd..bcc80c4b82 100644 --- a/heat/tests/test_convg_stack.py +++ b/heat/tests/test_convg_stack.py @@ -21,7 +21,6 @@ from heat.engine import stack as parser from heat.engine import template as templatem from heat.objects import raw_template as raw_template_object from heat.objects import resource as resource_objects -from heat.objects import snapshot as snapshot_objects from heat.objects import stack as stack_object from heat.objects import sync_point as sync_point_object from heat.rpc import worker_client @@ -553,37 +552,6 @@ class StackConvergenceCreateUpdateDeleteTest(common.HeatTestCase): self.assertTrue(mock_syncpoint_del.called) self.assertTrue(mock_ccu.called) - def test_snapshot_delete(self, mock_cr): - tmpl = {'HeatTemplateFormatVersion': '2012-12-12', - 'Resources': {'R1': {'Type': 'GenericResourceType'}}} - stack = parser.Stack(utils.dummy_context(), 'updated_time_test', - templatem.Template(tmpl)) - stack.current_traversal = 'prev_traversal' - stack.action, stack.status = stack.CREATE, stack.COMPLETE - stack.store() - stack.thread_group_mgr = tools.DummyThreadGroupManager() - snapshot_values = { - 'stack_id': stack.id, - 'name': 'fake_snapshot', - 'tenant': stack.context.tenant_id, - 'status': 'COMPLETE', - 'data': None - } - snapshot_objects.Snapshot.create(stack.context, snapshot_values) - - # Ensure that snapshot is not deleted on stack update - stack.converge_stack(template=stack.t, action=stack.UPDATE) - db_snapshot_obj = snapshot_objects.Snapshot.get_all( - stack.context, stack.id) - self.assertEqual('fake_snapshot', db_snapshot_obj[0].name) - self.assertEqual(stack.id, db_snapshot_obj[0].stack_id) - - # Ensure that snapshot is deleted on stack delete - stack.converge_stack(template=stack.t, action=stack.DELETE) - self.assertEqual([], snapshot_objects.Snapshot.get_all( - stack.context, stack.id)) - self.assertTrue(mock_cr.called) - @mock.patch.object(parser.Stack, '_persist_state') class TestConvgStackStateSet(common.HeatTestCase):