summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhuangtianhua <huangtianhua@huawei.com>2017-09-14 10:16:01 +0800
committerZane Bitter <zbitter@redhat.com>2017-11-13 21:46:44 +0000
commit647c0df185a6bf20f1ddf1e83fb591adb090d200 (patch)
tree6ab61e5e9d733c3b73ddacbe483247a711b9bf7e
parente671d93b1508650d1da3587f96a2f8561825e24c (diff)
downloadheat-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.py3
-rw-r--r--heat/tests/generic_resource.py3
-rw-r--r--heat/tests/test_stack_delete.py40
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()