When shrinking, the newest instances will be removed.
"""
new_template = self._create_template(new_capacity)
- result = self.update_with_template(new_template, {})
- for resource in self.nested():
- if resource.state == ('CREATE', 'FAILED'):
- resource.destroy()
+ try:
+ self.update_with_template(new_template, {})
+ except exception.Error as ex:
+ logger.error('Failed to resize instance group %s. Error: %s' %
+ (self.name, ex))
+ for resource in self.nested():
+ if resource.state == ('CREATE', 'FAILED'):
+ resource.destroy()
self._lb_reload()
- return result
def _lb_reload(self):
'''
environment.Environment(user_params),
timeout_mins=timeout_mins,
disable_rollback=True,
- parent_resource=self)
+ parent_resource=self,
+ owner_id=self.stack.id)
stack.validate()
- return self._nested.update(stack)
+
+ nested_stack = self.nested()
+ if nested_stack is None:
+ raise exception.Error(_('Cannot update %s, stack not created')
+ % self.name)
+
+ if not hasattr(type(self), 'attributes_schema'):
+ self.attributes = None
+ self._outputs_to_attribs(child_template)
+
+ nested_stack.update(stack)
+
+ if nested_stack.state != (nested_stack.UPDATE,
+ nested_stack.COMPLETE):
+ raise exception.Error("Nested stack update failed: %s" %
+ nested_stack.status_reason)
def delete_nested(self):
'''
# License for the specific language governing permissions and limitations
# under the License.
+
+import mox
+
from heat.common import template_format
from heat.common import exception
from heat.engine import environment
self.parent_stack.context, self.stack.id)
self.assertEqual(saved_stack.owner_id, self.parent_stack.id)
+ @utils.stack_delete_after
+ def test_update_with_template_state_err(self):
+ """
+ update_with_template_state_err method should raise error when update
+ task is done but the nested stack is in (UPDATE, FAILED) state.
+ """
+ create_creator = self.parent_resource.create_with_template(
+ self.simple_template, {})
+ create_creator.run_to_completion()
+ self.stack = self.parent_resource.nested()
+
+ new_templ = self.simple_template.copy()
+ inst_snippet = new_templ["Resources"]["WebServer"].copy()
+ new_templ["Resources"]["WebServer2"] = inst_snippet
+
+ def change_state(stack):
+ self.stack.state_set(parser.Stack.UPDATE, parser.Stack.FAILED, '')
+
+ self.m.StubOutWithMock(self.stack, 'update')
+ self.stack.update(mox.IgnoreArg()).WithSideEffects(change_state)
+ self.m.ReplayAll()
+
+ try:
+ self.parent_resource.update_with_template(new_templ, {})
+ except exception.Error as ex:
+ self.assertEqual('Nested stack update failed: ', ex.message)
+
+ self.m.VerifyAll()
+
@utils.stack_delete_after
def test_load_nested_ok(self):
self.parent_resource.create_with_template(self.templ,