diff options
author | huangtianhua <huangtianhua@huawei.com> | 2017-09-14 10:16:01 +0800 |
---|---|---|
committer | Zane Bitter <zbitter@redhat.com> | 2017-11-13 21:46:44 +0000 |
commit | 647c0df185a6bf20f1ddf1e83fb591adb090d200 (patch) | |
tree | 6ab61e5e9d733c3b73ddacbe483247a711b9bf7e | |
parent | e671d93b1508650d1da3587f96a2f8561825e24c (diff) | |
download | heat-647c0df185a6bf20f1ddf1e83fb591adb090d200.tar.gz |
Remove the existing snapshots from the backend
We only have to remove the existing snapshots
for resources when stack delete.
Change-Id: Ia195f3c3380fe71e0888c8291209dd4562318951
Closes-Bug: #1716612
(cherry picked from commit 1861ad88670581e0658c8010950edd54ea4de422)
-rw-r--r-- | heat/engine/stack.py | 3 | ||||
-rw-r--r-- | heat/tests/generic_resource.py | 3 | ||||
-rw-r--r-- | heat/tests/test_stack_delete.py | 40 |
3 files changed, 45 insertions, 1 deletions
diff --git a/heat/engine/stack.py b/heat/engine/stack.py index 3f8fbc7be..d6758475d 100644 --- a/heat/engine/stack.py +++ b/heat/engine/stack.py @@ -1895,7 +1895,8 @@ class Stack(collections.Mapping): snapshot_data = snapshot.data if snapshot_data: data = snapshot.data['resources'].get(name) - scheduler.TaskRunner(rsrc.delete_snapshot, data)() + if data: + scheduler.TaskRunner(rsrc.delete_snapshot, data)() def restore_data(self, snapshot): env = environment.Environment(snapshot.data['environment']) diff --git a/heat/tests/generic_resource.py b/heat/tests/generic_resource.py index bbe17a281..75fa6b77c 100644 --- a/heat/tests/generic_resource.py +++ b/heat/tests/generic_resource.py @@ -378,6 +378,9 @@ class ResourceWithRestoreType(ResWithComplexPropsAndAttrs): props['a_string'] = value return defn.freeze(properties=props) + def handle_delete_snapshot(self, snapshot): + return snapshot['resource_data'].get('a_string') + class DynamicSchemaResource(resource.Resource): """Resource with an attribute not registered in the attribute schema.""" diff --git a/heat/tests/test_stack_delete.py b/heat/tests/test_stack_delete.py index 2193c5f2c..a88d86309 100644 --- a/heat/tests/test_stack_delete.py +++ b/heat/tests/test_stack_delete.py @@ -84,6 +84,46 @@ class StackTest(common.HeatTestCase): self.assertEqual([], snapshot_object.Snapshot.get_all( self.ctx, stack_id)) + def test_delete_with_snapshot_after_stack_add_resource(self): + tpl = {'heat_template_version': 'ocata', + 'resources': + {'A': {'type': 'ResourceWithRestoreType'}}} + self.stack = stack.Stack(self.ctx, 'stack_delete_with_snapshot', + template.Template(tpl)) + stack_id = self.stack.store() + self.stack.create() + + data = copy.deepcopy(self.stack.prepare_abandon()) + data['resources']['A']['resource_data']['a_string'] = 'foo' + snapshot_fake = { + 'tenant': self.ctx.tenant_id, + 'name': 'Snapshot', + 'stack_id': stack_id, + 'status': 'COMPLETE', + 'data': data + } + snapshot_object.Snapshot.create(self.ctx, snapshot_fake) + + self.assertIsNotNone(snapshot_object.Snapshot.get_all( + self.ctx, stack_id)) + + new_tmpl = {'heat_template_version': 'ocata', + 'resources': + {'A': {'type': 'ResourceWithRestoreType'}, + 'B': {'type': 'ResourceWithRestoreType'}}} + updated_stack = stack.Stack(self.ctx, 'update_stack_add_res', + template.Template(new_tmpl)) + self.stack.update(updated_stack) + self.assertEqual(2, len(self.stack.resources)) + + self.stack.delete() + db_s = stack_object.Stack.get_by_id(self.ctx, stack_id) + self.assertIsNone(db_s) + self.assertEqual((stack.Stack.DELETE, stack.Stack.COMPLETE), + self.stack.state) + self.assertEqual([], snapshot_object.Snapshot.get_all( + self.ctx, stack_id)) + def test_delete_user_creds(self): self.stack = stack.Stack(self.ctx, 'delete_test', self.tmpl) stack_id = self.stack.store() |