Explicitly pass old json snippet to update

Don't use state cached in the resource.

Change-Id: Ib6c7830ce40b72c9cd388c054fcb41ff93963b4d
This commit is contained in:
Zane Bitter 2013-06-13 20:03:28 +02:00 committed by Steven Hardy
parent aef9899002
commit c22d7e317a
3 changed files with 10 additions and 15 deletions

View File

@ -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)

View File

@ -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):

View File

@ -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: