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:
parent
4ee794c495
commit
3a5d124d56
|
@ -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,
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue