From c22d7e317af9fbc1140fed0fa496cdb791dd76f1 Mon Sep 17 00:00:00 2001 From: Zane Bitter Date: Thu, 13 Jun 2013 20:03:28 +0200 Subject: [PATCH] Explicitly pass old json snippet to update Don't use state cached in the resource. Change-Id: Ib6c7830ce40b72c9cd388c054fcb41ff93963b4d --- heat/engine/parser.py | 4 ---- heat/engine/resource.py | 18 ++++++++---------- heat/engine/update.py | 3 ++- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/heat/engine/parser.py b/heat/engine/parser.py index 3c7ee950..874a704c 100644 --- a/heat/engine/parser.py +++ b/heat/engine/parser.py @@ -370,10 +370,6 @@ class Stack(object): self.state_set(self.UPDATE, self.IN_PROGRESS, 'Stack %s started' % action) - # cache all the resources runtime data. - for r in self: - r.cache_template() - try: update_task = update.StackUpdate(self, newstack) updater = scheduler.TaskRunner(update_task) diff --git a/heat/engine/resource.py b/heat/engine/resource.py index 8a6435c1..d504c71d 100644 --- a/heat/engine/resource.py +++ b/heat/engine/resource.py @@ -396,12 +396,13 @@ class Resource(object): self.name) return self._do_action(self.CREATE, self.properties.validate) - def update(self, json_snippet=None): + def update(self, after, before=None): ''' update the resource. Subclasses should provide a handle_update() method to customise update, the base-class handle_update will fail by default. ''' - assert json_snippet is not None, 'Must specify update json snippet' + if before is None: + before = self.parsed_template() if (self.action, self.status) in ((self.CREATE, self.IN_PROGRESS), (self.UPDATE, self.IN_PROGRESS)): @@ -413,17 +414,14 @@ class Resource(object): try: self.state_set(self.UPDATE, self.IN_PROGRESS) properties = Properties(self.properties_schema, - json_snippet.get('Properties', {}), + after.get('Properties', {}), self.stack.resolve_runtime_data, self.name) properties.validate() - 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) + tmpl_diff = self.update_template_diff(after, before) + prop_diff = self.update_template_diff_properties(after, before) if callable(getattr(self, 'handle_update', None)): - result = self.handle_update(json_snippet, tmpl_diff, prop_diff) + result = self.handle_update(after, tmpl_diff, prop_diff) except UpdateReplace: logger.debug("Resource %s update requires replacement" % self.name) raise @@ -433,7 +431,7 @@ class Resource(object): self.state_set(self.UPDATE, self.FAILED, str(failure)) raise failure else: - self.t = self.stack.resolve_static_data(json_snippet) + self.t = self.stack.resolve_static_data(after) self.state_set(self.UPDATE, self.COMPLETE) def suspend(self): diff --git a/heat/engine/update.py b/heat/engine/update.py index daa3e134..5f0d2e0d 100644 --- a/heat/engine/update.py +++ b/heat/engine/update.py @@ -98,7 +98,8 @@ class StackUpdate(object): if new_snippet != existing_snippet: try: - yield self.existing_stack[res_name].update(new_snippet) + yield self.existing_stack[res_name].update(new_snippet, + existing_snippet) except resource.UpdateReplace: yield self._replace_resource(new_res) else: -- 2.45.2