From: Zane Bitter Date: Thu, 13 Jun 2013 18:03:28 +0000 (+0200) Subject: Explicitly pass old json snippet to update X-Git-Tag: 2014.1~408^2 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=c22d7e317af9fbc1140fed0fa496cdb791dd76f1;p=openstack-build%2Fheat-build.git Explicitly pass old json snippet to update Don't use state cached in the resource. Change-Id: Ib6c7830ce40b72c9cd388c054fcb41ff93963b4d --- 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: