97
89
super(StackResourceTest, self).setUp()
90
utils.setup_dummy_db()
99
91
resource._register_class('some_magic_type',
101
93
resource._register_class('GenericResource',
102
94
generic_rsrc.GenericResource)
103
95
t = parser.Template({template.RESOURCES:
104
96
{"provider_resource": ws_res_snippet}})
105
self.parent_stack = parser.Stack(dummy_context(), 'test_stack', t,
106
stack_id=uuidutils.generate_uuid())
97
self.parent_stack = parser.Stack(utils.dummy_context(), 'test_stack',
98
t, stack_id=uuidutils.generate_uuid())
107
99
self.parent_resource = MyStackResource('test',
109
101
self.parent_stack)
110
self.templ = template_format.parse(wp_template)
111
self.generic_template = template_format.parse(generic_template)
102
self.templ = template_format.parse(param_template)
103
self.simple_template = template_format.parse(simple_template)
105
@utils.stack_delete_after
114
106
def test_create_with_template_ok(self):
115
107
self.parent_resource.create_with_template(self.templ,
116
108
{"KeyName": "key"})
122
114
self.assertEqual(self.templ, self.stack.t.t)
123
115
self.assertEqual(self.stack.id, self.parent_resource.resource_id)
117
@utils.stack_delete_after
118
def test_create_with_template_validates(self):
120
Creating a stack with a template validates the created stack, so that
121
an invalid template will cause an error to be raised.
123
# Make a parameter key with the same name as the resource to cause a
124
# simple validation error
125
template = self.simple_template.copy()
126
template['Parameters']['WebServer'] = {'Type': 'String'}
128
exception.StackValidationFailed,
129
self.parent_resource.create_with_template,
130
template, {'WebServer': 'foo'})
132
@utils.stack_delete_after
133
def test_update_with_template_validates(self):
134
"""Updating a stack with a template validates the created stack."""
135
create_result = self.parent_resource.create_with_template(
136
self.simple_template, {})
137
while not create_result.step():
140
template = self.simple_template.copy()
141
template['Parameters']['WebServer'] = {'Type': 'String'}
143
exception.StackValidationFailed,
144
self.parent_resource.update_with_template,
145
template, {'WebServer': 'foo'})
147
@utils.stack_delete_after
126
148
def test_update_with_template_ok(self):
128
150
The update_with_template method updates the nested stack with the
129
151
given template and user parameters.
131
153
create_result = self.parent_resource.create_with_template(
132
self.generic_template, {})
154
self.simple_template, {})
133
155
while not create_result.step():
135
157
self.stack = self.parent_resource.nested()
137
new_templ = self.generic_template.copy()
159
new_templ = self.simple_template.copy()
138
160
inst_snippet = new_templ["Resources"]["WebServer"].copy()
139
161
new_templ["Resources"]["WebServer2"] = inst_snippet
140
update_result = self.parent_resource.update_with_template(
162
updater = self.parent_resource.update_with_template(
164
updater.run_to_completion()
165
self.assertEqual(True,
166
self.parent_resource.check_update_complete(updater))
142
167
self.assertEqual(self.stack.state, ('UPDATE', 'COMPLETE'))
143
168
self.assertEqual(set(self.stack.resources.keys()),
144
169
set(["WebServer", "WebServer2"]))
171
# The stack's owner_id is maintained.
172
saved_stack = parser.Stack.load(
173
self.parent_stack.context, self.stack.id)
174
self.assertEqual(saved_stack.owner_id, self.parent_stack.id)
176
@utils.stack_delete_after
177
def test_update_with_template_state_err(self):
179
update_with_template_state_err method should raise error when update
180
task is done but the nested stack is in (UPDATE, FAILED) state.
182
create_creator = self.parent_resource.create_with_template(
183
self.simple_template, {})
184
create_creator.run_to_completion()
185
self.stack = self.parent_resource.nested()
187
new_templ = self.simple_template.copy()
188
inst_snippet = new_templ["Resources"]["WebServer"].copy()
189
new_templ["Resources"]["WebServer2"] = inst_snippet
193
self.stack.state_set(parser.Stack.UPDATE, parser.Stack.FAILED, '')
195
self.m.StubOutWithMock(self.stack, 'update_task')
196
self.stack.update_task(mox.IgnoreArg()).AndReturn(update_task())
199
updater = self.parent_resource.update_with_template(new_templ, {})
200
updater.run_to_completion()
201
self.assertEqual((self.stack.UPDATE, self.stack.FAILED),
203
ex = self.assertRaises(exception.Error,
204
self.parent_resource.check_update_complete,
206
self.assertEqual('Nested stack update failed: ', str(ex))
210
@utils.stack_delete_after
147
211
def test_load_nested_ok(self):
148
212
self.parent_resource.create_with_template(self.templ,
149
213
{"KeyName": "key"})