Merge "Use a StackDefinition to store the stack definition"

This commit is contained in:
Jenkins 2017-04-05 14:21:35 +00:00 committed by Gerrit Code Review
commit eddf19c52f
4 changed files with 67 additions and 25 deletions

View File

@ -45,6 +45,7 @@ from heat.engine import parent_rsrc
from heat.engine import resource from heat.engine import resource
from heat.engine import resources from heat.engine import resources
from heat.engine import scheduler from heat.engine import scheduler
from heat.engine import stk_defn
from heat.engine import sync_point from heat.engine import sync_point
from heat.engine import template as tmpl from heat.engine import template as tmpl
from heat.engine import update from heat.engine import update
@ -155,7 +156,6 @@ class Stack(collections.Mapping):
self.id = stack_id self.id = stack_id
self.owner_id = owner_id self.owner_id = owner_id
self.context = context self.context = context
self.t = tmpl
self.name = stack_name self.name = stack_name
self.action = (self.ADOPT if adopt_stack_data else self.action = (self.ADOPT if adopt_stack_data else
self.CREATE if action is None else action) self.CREATE if action is None else action)
@ -163,9 +163,6 @@ class Stack(collections.Mapping):
self.status_reason = status_reason self.status_reason = status_reason
self.timeout_mins = timeout_mins self.timeout_mins = timeout_mins
self.disable_rollback = disable_rollback self.disable_rollback = disable_rollback
self._parent_info = parent_rsrc.ParentResourceProxy(context,
parent_resource,
owner_id)
self._outputs = None self._outputs = None
self._resources = None self._resources = None
self._dependencies = None self._dependencies = None
@ -220,12 +217,15 @@ class Stack(collections.Mapping):
resources.initialise() resources.initialise()
if self.t is not None: parent_info = parent_rsrc.ParentResourceProxy(context,
self.parameters = self.t.parameters( parent_resource,
self.identifier(), owner_id)
user_params=self.env.params, if tmpl is not None:
param_defaults=self.env.param_defaults) self.defn = stk_defn.StackDefinition(context, tmpl,
self._set_param_stackid() self.identifier(), {},
parent_info)
else:
self.defn = None
@property @property
def tags(self): def tags(self):
@ -247,16 +247,31 @@ class Stack(collections.Mapping):
self._worker_client = rpc_worker_client.WorkerClient() self._worker_client = rpc_worker_client.WorkerClient()
return self._worker_client return self._worker_client
@property
def t(self):
"""The stack template."""
if self.defn is None:
return None
return self.defn.t
@t.setter
def t(self, tmpl):
"""Set the stack template."""
self.defn = self.defn.clone_with_new_template(tmpl, self.identifier())
@property
def parameters(self):
return self.defn.parameters
@property @property
def env(self): def env(self):
"""This is a helper to allow resources to access stack.env.""" """The stack environment"""
return self.t.env return self.defn.env
@property @property
def parent_resource_name(self): def parent_resource_name(self):
if self._parent_info is None: parent_info = self.defn.parent_resource
return None return parent_info and parent_info.name
return self._parent_info.name
@property @property
def parent_resource(self): def parent_resource(self):
@ -264,10 +279,12 @@ class Stack(collections.Mapping):
Note: this should only be used by "Fn::ResourceFacade" Note: this should only be used by "Fn::ResourceFacade"
""" """
return self._parent_info return self.defn.parent_resource
def set_parent_stack(self, parent_stack): def set_parent_stack(self, parent_stack):
parent_rsrc.use_parent_stack(self._parent_info, parent_stack) parent_info = self.defn.parent_resource
if parent_info is not None:
parent_rsrc.use_parent_stack(parent_info, parent_stack)
def stored_context(self): def stored_context(self):
if self.user_creds_id: if self.user_creds_id:
@ -706,7 +723,7 @@ class Stack(collections.Mapping):
resource.t = definition resource.t = definition
resource.reparse() resource.reparse()
self.resources[resource.name] = resource self.resources[resource.name] = resource
self.t.add_resource(definition) stk_defn.add_resource(self.defn, definition)
if self.t.id is not None: if self.t.id is not None:
self.t.store(self.context) self.t.store(self.context)
resource.store() resource.store()
@ -714,7 +731,7 @@ class Stack(collections.Mapping):
def remove_resource(self, resource_name): def remove_resource(self, resource_name):
"""Remove the resource with the specified name.""" """Remove the resource with the specified name."""
del self.resources[resource_name] del self.resources[resource_name]
self.t.remove_resource(resource_name) stk_defn.remove_resource(self.defn, resource_name)
if self.t.id is not None: if self.t.id is not None:
self.t.store(self.context) self.t.store(self.context)
@ -1228,7 +1245,7 @@ class Stack(collections.Mapping):
self.disable_rollback = new_stack.disable_rollback self.disable_rollback = new_stack.disable_rollback
self.timeout_mins = new_stack.timeout_mins self.timeout_mins = new_stack.timeout_mins
self.parameters = new_stack.parameters self.defn = new_stack.defn
self._set_param_stackid() self._set_param_stackid()
self.tags = new_stack.tags self.tags = new_stack.tags
@ -1494,9 +1511,9 @@ class Stack(collections.Mapping):
try: try:
updater = scheduler.TaskRunner(update_task) updater = scheduler.TaskRunner(update_task)
self.parameters = newstack.parameters self.defn.parameters = newstack.defn.parameters
self.t.files = newstack.t.files self.defn.t.files = newstack.defn.t.files
self.t.env = newstack.t.env self.defn.t.env = newstack.defn.t.env
self.disable_rollback = newstack.disable_rollback self.disable_rollback = newstack.disable_rollback
self.timeout_mins = newstack.timeout_mins self.timeout_mins = newstack.timeout_mins
self._set_param_stackid() self._set_param_stackid()

View File

@ -217,3 +217,28 @@ class ResourceProxy(status.ResourceStatus):
all_attrs = self._res_data().attributes() all_attrs = self._res_data().attributes()
return dict((k, v) for k, v in six.iteritems(all_attrs) return dict((k, v) for k, v in six.iteritems(all_attrs)
if k != attributes.SHOW_ATTR) if k != attributes.SHOW_ATTR)
def add_resource(stack_definition, resource_definition):
"""Insert the given resource definition into the stack definition.
Add the resource to the template and store any temporary data.
"""
resource_name = resource_definition.name
stack_definition._resources.pop(resource_name, None)
stack_definition._resource_data.pop(resource_name, None)
stack_definition.t.add_resource(resource_definition)
if stack_definition._resource_defns is not None:
stack_definition._resource_defns[resource_name] = resource_definition
def remove_resource(stack_definition, resource_name):
"""Remove the named resource from the stack definition.
Remove the resource from the template and eliminate references to it.
"""
stack_definition.t.remove_resource(resource_name)
if stack_definition._resource_defns is not None:
stack_definition._resource_defns.pop(resource_name, None)
stack_definition._resource_data.pop(resource_name, None)
stack_definition._resources.pop(resource_name, None)

View File

@ -285,7 +285,7 @@ class FormatTest(common.HeatTestCase):
def test_format_stack_resource_with_parent_stack(self): def test_format_stack_resource_with_parent_stack(self):
res = self.stack['generic1'] res = self.stack['generic1']
res.stack._parent_info = parent_rsrc.ParentResourceProxy( res.stack.defn._parent_info = parent_rsrc.ParentResourceProxy(
self.stack.context, 'foobar', None) self.stack.context, 'foobar', None)
formatted = api.format_stack_resource(res, False) formatted = api.format_stack_resource(res, False)

View File

@ -889,7 +889,7 @@ class TemplateTest(common.HeatTestCase):
tmpl = template.Template(parameter_template, env=env) tmpl = template.Template(parameter_template, env=env)
stk = stack.Stack(self.ctx, 'test', tmpl) stk = stack.Stack(self.ctx, 'test', tmpl)
tmpl.env = environment.Environment({}) tmpl.env = environment.Environment({})
stk.parameters = cfn_p.CfnParameters(stk.identifier(), tmpl) stk.defn.parameters = cfn_p.CfnParameters(stk.identifier(), tmpl)
snippet = {"Ref": "foo"} snippet = {"Ref": "foo"}
self.assertRaises(exception.UserParameterMissing, self.assertRaises(exception.UserParameterMissing,
self.resolve, self.resolve,