From 054185d79580fb05d9278dddfe76eb0a270e6818 Mon Sep 17 00:00:00 2001 From: Zane Bitter Date: Thu, 13 Jun 2013 20:03:28 +0200 Subject: [PATCH] Pass before and after snippets to template diff The before template should be passed explicitly, rather than relying on some state stored in the object. Change-Id: I5b0af8da2e1df3f6ad3291554cbbc243b51e3fe5 --- heat/engine/resource.py | 48 ++++++++++++++++++------------------- heat/tests/test_resource.py | 20 ++++++++-------- 2 files changed, 33 insertions(+), 35 deletions(-) diff --git a/heat/engine/resource.py b/heat/engine/resource.py index a77c20ea40..f2bed17232 100644 --- a/heat/engine/resource.py +++ b/heat/engine/resource.py @@ -221,50 +221,45 @@ class Resource(object): ''' self.cached_t = self.stack.resolve_runtime_data(self.t) - def update_template_diff(self, json_snippet=None): + def update_template_diff(self, after, before): ''' - Returns the difference between json_template and self.t - If something has been removed in json_snippet which exists - in self.t we set it to None. If any keys have changed which - are not in update_allowed_keys, raises UpdateReplace if the - differing keys are not in update_allowed_keys + Returns the difference between the before and after json snippets. If + something has been removed in after which exists in before we set it to + None. If any keys have changed which are not in update_allowed_keys, + raises UpdateReplace if the differing keys are not in + update_allowed_keys ''' update_allowed_set = set(self.update_allowed_keys) # Create a set containing the keys in both current and update template - current_template = self.parsed_template(cached=True) - - template_keys = set(current_template.keys()) - new_template = self.stack.resolve_runtime_data(json_snippet) - template_keys.update(set(new_template.keys())) + template_keys = set(before.keys()) + template_keys.update(set(after.keys())) # Create a set of keys which differ (or are missing/added) changed_keys_set = set([k for k in template_keys - if current_template.get(k) != - new_template.get(k)]) + if before.get(k) != after.get(k)]) if not changed_keys_set.issubset(update_allowed_set): badkeys = changed_keys_set - update_allowed_set raise UpdateReplace(self.name) - return dict((k, new_template.get(k)) for k in changed_keys_set) + return dict((k, after.get(k)) for k in changed_keys_set) - def update_template_diff_properties(self, json_snippet=None): + def update_template_diff_properties(self, after, before): ''' - Returns the changed Properties between json_template and self.t - If a property has been removed in json_snippet which exists - in self.t we set it to None. If any properties have changed which - are not in update_allowed_properties, raises UpdateReplace if the - modified properties are not in the update_allowed_properties + Returns the changed Properties between the before and after json + snippets. If a property has been removed in after which exists in + before we set it to None. If any properties have changed which are not + in update_allowed_properties, raises UpdateReplace if the modified + properties are not in the update_allowed_properties ''' update_allowed_set = set(self.update_allowed_properties) # Create a set containing the keys in both current and update template - tmpl = self.parsed_template(cached=True) - current_properties = tmpl.get('Properties', {}) + current_properties = before.get('Properties', {}) template_properties = set(current_properties.keys()) - updated_properties = json_snippet.get('Properties', {}) + updated_properties = after.get('Properties', {}) template_properties.update(set(updated_properties.keys())) # Create a set of keys which differ (or are missing/added) @@ -415,8 +410,11 @@ class Resource(object): self.stack.resolve_runtime_data, self.name) properties.validate() - tmpl_diff = self.update_template_diff(json_snippet) - prop_diff = self.update_template_diff_properties(json_snippet) + old_json_snippet = self.parsed_template(cached=True) + tmpl_diff = self.update_template_diff(json_snippet, + old_json_snippet) + prop_diff = self.update_template_diff_properties(json_snippet, + old_json_snippet) if callable(getattr(self, 'handle_update', None)): result = self.handle_update(json_snippet, tmpl_diff, prop_diff) except UpdateReplace: diff --git a/heat/tests/test_resource.py b/heat/tests/test_resource.py index 3dc2853b7e..330ed9a09c 100644 --- a/heat/tests/test_resource.py +++ b/heat/tests/test_resource.py @@ -171,21 +171,21 @@ class ResourceTest(HeatTestCase): update_snippet = {} res = generic_rsrc.GenericResource('test_resource', tmpl, self.stack) self.assertRaises(resource.UpdateReplace, res.update_template_diff, - update_snippet) + update_snippet, tmpl) def test_update_template_diff_changed_notallowed(self): tmpl = {'Type': 'Foo'} update_snippet = {'Type': 'Bar'} res = generic_rsrc.GenericResource('test_resource', tmpl, self.stack) self.assertRaises(resource.UpdateReplace, res.update_template_diff, - update_snippet) + update_snippet, tmpl) def test_update_template_diff_changed_modified(self): tmpl = {'Type': 'Foo', 'Metadata': {'foo': 123}} update_snippet = {'Type': 'Foo', 'Metadata': {'foo': 456}} res = generic_rsrc.GenericResource('test_resource', tmpl, self.stack) res.update_allowed_keys = ('Metadata',) - diff = res.update_template_diff(json_snippet=update_snippet) + diff = res.update_template_diff(update_snippet, tmpl) self.assertEqual(diff, {'Metadata': {'foo': 456}}) def test_update_template_diff_changed_add(self): @@ -193,7 +193,7 @@ class ResourceTest(HeatTestCase): update_snippet = {'Type': 'Foo', 'Metadata': {'foo': 123}} res = generic_rsrc.GenericResource('test_resource', tmpl, self.stack) res.update_allowed_keys = ('Metadata',) - diff = res.update_template_diff(json_snippet=update_snippet) + diff = res.update_template_diff(update_snippet, tmpl) self.assertEqual(diff, {'Metadata': {'foo': 123}}) def test_update_template_diff_changed_remove(self): @@ -201,14 +201,14 @@ class ResourceTest(HeatTestCase): update_snippet = {'Type': 'Foo'} res = generic_rsrc.GenericResource('test_resource', tmpl, self.stack) res.update_allowed_keys = ('Metadata',) - diff = res.update_template_diff(json_snippet=update_snippet) + diff = res.update_template_diff(update_snippet, tmpl) self.assertEqual(diff, {'Metadata': None}) def test_update_template_diff_properties_none(self): tmpl = {'Type': 'Foo'} update_snippet = {'Type': 'Foo'} res = generic_rsrc.GenericResource('test_resource', tmpl, self.stack) - diff = res.update_template_diff_properties(json_snippet=update_snippet) + diff = res.update_template_diff_properties(update_snippet, tmpl) self.assertEqual(diff, {}) def test_update_template_diff_properties_added(self): @@ -216,7 +216,7 @@ class ResourceTest(HeatTestCase): update_snippet = {'Type': 'Foo', 'Properties': {'Bar': 123}} res = generic_rsrc.GenericResource('test_resource', tmpl, self.stack) res.update_allowed_properties = ('Bar',) - diff = res.update_template_diff_properties(json_snippet=update_snippet) + diff = res.update_template_diff_properties(update_snippet, tmpl) self.assertEqual(diff, {'Bar': 123}) def test_update_template_diff_properties_removed(self): @@ -224,7 +224,7 @@ class ResourceTest(HeatTestCase): update_snippet = {'Type': 'Foo', 'Properties': {}} res = generic_rsrc.GenericResource('test_resource', tmpl, self.stack) res.update_allowed_properties = ('Bar',) - diff = res.update_template_diff_properties(json_snippet=update_snippet) + diff = res.update_template_diff_properties(update_snippet, tmpl) self.assertEqual(diff, {'Bar': None}) def test_update_template_diff_properties_changed(self): @@ -232,7 +232,7 @@ class ResourceTest(HeatTestCase): update_snippet = {'Type': 'Foo', 'Properties': {'Bar': 456}} res = generic_rsrc.GenericResource('test_resource', tmpl, self.stack) res.update_allowed_properties = ('Bar',) - diff = res.update_template_diff_properties(json_snippet=update_snippet) + diff = res.update_template_diff_properties(update_snippet, tmpl) self.assertEqual(diff, {'Bar': 456}) def test_update_template_diff_properties_notallowed(self): @@ -242,7 +242,7 @@ class ResourceTest(HeatTestCase): res.update_allowed_properties = ('Cat',) self.assertRaises(resource.UpdateReplace, res.update_template_diff_properties, - update_snippet) + update_snippet, tmpl) def test_resource(self): # patch in a dummy property schema for GenericResource