Use snapshot's environment when stack restore

Using snapshot's enviroment instead of current stack's
enviroment when stack restore.

Change-Id: I7becfbe4b970820bd374560d00fa6f661a85bdab
Closes-Bug: #1430673
This commit is contained in:
huangtianhua 2015-04-08 17:05:22 +08:00
parent 4ee794c495
commit 3a5d124d56
2 changed files with 50 additions and 5 deletions

View File

@ -33,6 +33,7 @@ from heat.common.i18n import _LW
from heat.common import identifier
from heat.common import lifecycle_plugin_utils
from heat.engine import dependencies
from heat.engine import environment
from heat.engine import function
from heat.engine.notification import stack as notification
from heat.engine import parameter_groups as param_groups
@ -1280,9 +1281,14 @@ class Stack(collections.Mapping):
'''
self.updated_time = datetime.datetime.utcnow()
template = tmpl.Template(snapshot.data['template'], env=self.env)
env = environment.Environment(snapshot.data['environment'])
template = tmpl.Template(snapshot.data['template'], env=env)
newstack = self.__class__(self.context, self.name, template,
timeout_mins=self.timeout_mins,
disable_rollback=self.disable_rollback)
for name, defn in six.iteritems(template.resource_definitions(self)):
for name, defn in six.iteritems(
template.resource_definitions(newstack)):
rsrc = resource.Resource(name, defn, self)
data = snapshot.data['resources'].get(name)
handle_restore = getattr(rsrc, 'handle_restore', None)
@ -1290,9 +1296,6 @@ class Stack(collections.Mapping):
defn = handle_restore(defn, data)
template.add_resource(defn, name)
newstack = self.__class__(self.context, self.name, template,
timeout_mins=self.timeout_mins,
disable_rollback=self.disable_rollback)
newstack.parameters.set_stack_id(self.identifier())
updater = scheduler.TaskRunner(self.update_task, newstack,

View File

@ -1774,6 +1774,48 @@ class StackTest(common.HeatTestCase):
self.stack.state)
self.assertEqual(2, len(self.stack.resources))
def test_restore_with_original_env(self):
tmpl = {
'heat_template_version': '2013-05-23',
'parameters': {
'foo': {'type': 'string'}
},
'resources': {
'A': {
'type': 'ResourceWithPropsType',
'properties': {'Foo': {'get_param': 'foo'}}
}
}
}
self.stack = stack.Stack(self.ctx, 'stack_restore_test',
template.Template(
tmpl,
env=environment.Environment(
{'foo': 'abc'})))
self.stack.store()
self.stack.create()
self.assertEqual('abc',
self.stack.resources['A'].properties['Foo'])
data = copy.deepcopy(self.stack.prepare_abandon())
fake_snapshot = collections.namedtuple(
'Snapshot', ('data', 'stack_id'))(data, self.stack.id)
updated_stack = stack.Stack(self.ctx, 'updated_stack',
template.Template(
tmpl,
env=environment.Environment(
{'foo': 'xyz'})))
self.stack.update(updated_stack)
self.assertEqual('xyz',
self.stack.resources['A'].properties['Foo'])
self.stack.restore(fake_snapshot)
self.assertEqual((stack.Stack.RESTORE, stack.Stack.COMPLETE),
self.stack.state)
self.assertEqual('abc',
self.stack.resources['A'].properties['Foo'])
def test_hot_restore(self):
class ResourceWithRestore(generic_rsrc.ResWithComplexPropsAndAttrs):