13
13
# License for the specific language governing permissions and limitations
14
14
# under the License.
16
from oslo.config import cfg
16
18
from heat.common import exception
17
19
from heat.engine import attributes
18
20
from heat.engine import environment
34
36
def __init__(self, name, json_snippet, stack):
35
37
super(StackResource, self).__init__(name, json_snippet, stack)
36
38
self._nested = None
39
if self.stack.parent_resource:
40
self.recursion_depth = (
41
self.stack.parent_resource.recursion_depth + 1)
43
self.recursion_depth = 0
38
45
def _outputs_to_attribs(self, json_snippet):
39
46
if not self.attributes and 'Outputs' in json_snippet:
64
71
Handle the creation of the nested stack from a given JSON template.
73
if self.recursion_depth >= cfg.CONF.max_nested_stack_depth:
74
raise exception.StackRecursionLimitReached(
75
cfg.CONF.max_nested_stack_depth)
66
76
template = parser.Template(child_template)
67
77
self._outputs_to_attribs(child_template)
69
79
# Note we disable rollback for nested stacks, since they
70
80
# should be rolled back by the parent stack on failure
71
self._nested = parser.Stack(self.context,
72
self.physical_resource_name(),
74
environment.Environment(user_params),
75
timeout_mins=timeout_mins,
76
disable_rollback=True,
79
nested_id = self._nested.store(self.stack)
81
nested = parser.Stack(self.context,
82
self.physical_resource_name(),
84
environment.Environment(user_params),
85
timeout_mins=timeout_mins,
86
disable_rollback=True,
88
owner_id=self.stack.id)
91
nested_id = self._nested.store()
80
92
self.resource_id_set(nested_id)
82
94
stack_creator = scheduler.TaskRunner(self._nested.stack_task,
95
action=self._nested.CREATE)
84
96
stack_creator.start(timeout=self._nested.timeout_secs())
85
97
return stack_creator
111
123
environment.Environment(user_params),
112
124
timeout_mins=timeout_mins,
113
125
disable_rollback=True,
114
parent_resource=self)
115
return self._nested.update(stack)
126
parent_resource=self,
127
owner_id=self.stack.id)
130
nested_stack = self.nested()
131
if nested_stack is None:
132
raise exception.Error(_('Cannot update %s, stack not created')
135
if not hasattr(type(self), 'attributes_schema'):
136
self.attributes = None
137
self._outputs_to_attribs(child_template)
139
updater = scheduler.TaskRunner(nested_stack.update_task, stack)
143
def check_update_complete(self, updater):
147
if not updater.step():
150
nested_stack = self.nested()
151
if nested_stack.state != (nested_stack.UPDATE,
152
nested_stack.COMPLETE):
153
raise exception.Error("Nested stack update failed: %s" %
154
nested_stack.status_reason)
117
157
def delete_nested(self):
124
164
logger.info("Stack not found to delete")
126
166
if stack is not None:
167
delete_task = scheduler.TaskRunner(stack.delete)
171
def check_delete_complete(self, delete_task):
172
if delete_task is None:
175
done = delete_task.step()
177
nested_stack = self.nested()
178
if nested_stack.state != (nested_stack.DELETE,
179
nested_stack.COMPLETE):
180
raise exception.Error(nested_stack.status_reason)
129
184
def handle_suspend(self):
130
185
stack = self.nested()