]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Pass before and after snippets to template diff
authorZane Bitter <zbitter@redhat.com>
Thu, 13 Jun 2013 18:03:28 +0000 (20:03 +0200)
committerZane Bitter <zbitter@redhat.com>
Fri, 21 Jun 2013 16:22:48 +0000 (18:22 +0200)
The before template should be passed explicitly, rather than relying on
some state stored in the object.

Change-Id: I5b0af8da2e1df3f6ad3291554cbbc243b51e3fe5

heat/engine/resource.py
heat/tests/test_resource.py

index a77c20ea40334dc033c6370c45b81959c32b67ba..f2bed17232362894bd9129fcfcd69449283e1c1f 100644 (file)
@@ -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:
index 3dc2853b7eaa8f9b01460dcddeff8abddd30523a..330ed9a09c6d9f7585f0df743dd35156d7f4da19 100644 (file)
@@ -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