Merge "Stack updated error if creation fails"

This commit is contained in:
Jenkins 2015-06-18 08:00:14 +00:00 committed by Gerrit Code Review
commit 8c201bd550
8 changed files with 68 additions and 6 deletions

View File

@ -257,7 +257,7 @@ class RackspaceDnsTest(common.HeatTestCase):
ut = rsrc_defn.ResourceDefinition(instance.name,
instance.type(),
uprops)
instance.state_set(instance.CREATE, instance.COMPLETE)
scheduler.TaskRunner(instance.update, ut)()
self.assertEqual((instance.UPDATE, instance.COMPLETE), instance.state)
self.m.VerifyAll()
@ -316,6 +316,7 @@ class RackspaceDnsTest(common.HeatTestCase):
ut = rsrc_defn.ResourceDefinition(instance.name,
instance.type(),
uprops)
instance.state_set(instance.CREATE, instance.COMPLETE)
scheduler.TaskRunner(instance.update, ut)()
self.assertEqual((instance.UPDATE, instance.COMPLETE), instance.state)

View File

@ -754,7 +754,8 @@ class Resource(object):
def _needs_update(self, after, before, after_props, before_props,
prev_resource):
if self.status == self.FAILED:
if self.status == self.FAILED or \
(self.action == self.INIT and self.status == self.COMPLETE):
raise UpdateReplace(self)
if prev_resource is not None:

View File

@ -571,6 +571,7 @@ backend servers
save it to the db.
rely on the cfn-hup to reconfigure HAProxy
'''
new_props = json_snippet.properties(self.properties_schema,
self.context)

View File

@ -85,8 +85,17 @@ class StackResource(resource.Resource):
def _needs_update(self, after, before, after_props, before_props,
prev_resource):
# Always issue an update to the nested stack and let the individual
# Issue an update to the nested stack if the stack resource
# is able to update. If return true, let the individual
# resources in it decide if they need updating.
# FIXME (ricolin): seems currently can not call super here
if self.nested() is None and (
self.status == self.FAILED
or (self.action == self.INIT
and self.status == self.COMPLETE)):
raise resource.UpdateReplace(self)
return True
@scheduler.wrappertask

View File

@ -88,7 +88,8 @@ class LBUtilsTest(common.HeatTestCase):
'LB_1': lb1,
'LB_2': lb2
}
lb1.action = mock.Mock(return_value=lb1.CREATE)
lb2.action = mock.Mock(return_value=lb2.CREATE)
lb1.handle_update = mock.Mock()
lb2.handle_update = mock.Mock()
prop_diff = {'Instances': ['ID1', 'ID2', 'ID3']}
@ -108,6 +109,8 @@ class LBUtilsTest(common.HeatTestCase):
lb1 = self.stack['neutron_lb_1']
lb2 = self.stack['neutron_lb_2']
lb1.action = mock.Mock(return_value=lb1.CREATE)
lb2.action = mock.Mock(return_value=lb2.CREATE)
lbs = {
'LB_1': lb1,
'LB_2': lb2

View File

@ -306,6 +306,7 @@ class LoadbalancerReloadTest(common.HeatTestCase):
stack = utils.parse_stack(t, params=inline_templates.as_params)
lb = stack['ElasticLoadBalancer']
lb.state_set(lb.CREATE, lb.COMPLETE)
lb.handle_update = mock.Mock(return_value=None)
group = stack['WebServerGroup']
group._lb_reload()

View File

@ -298,6 +298,7 @@ class ResourceTest(common.HeatTestCase):
stored_time = res.updated_time
utmpl = rsrc_defn.ResourceDefinition('test_resource', 'Foo')
res.state_set(res.CREATE, res.COMPLETE)
scheduler.TaskRunner(res.update, utmpl)()
self.assertIsNotNone(res.updated_time)
self.assertNotEqual(res.updated_time, stored_time)
@ -823,6 +824,18 @@ class ResourceTest(common.HeatTestCase):
six.text_type(ex))
self.m.VerifyAll()
def test_need_update_in_init_complete_state_for_resource(self):
tmpl = rsrc_defn.ResourceDefinition('test_resource',
'GenericResourceType',
{'Foo': 'abc'})
res = generic_rsrc.ResourceWithProps('test_resource', tmpl, self.stack)
res.update_allowed_properties = ('Foo',)
self.assertEqual((res.INIT, res.COMPLETE), res.state)
prop = {'Foo': 'abc'}
self.assertRaises(resource.UpdateReplace,
res._needs_update, tmpl, tmpl, prop, prop, res)
def test_update_fail_missing_req_prop(self):
tmpl = rsrc_defn.ResourceDefinition('test_resource',
'GenericResourceType',

View File

@ -517,11 +517,12 @@ class StackResourceTest(StackResourceBaseTest):
side_effect=exception.NotFound())
self.assertIsNone(self.parent_resource.delete_nested())
def test_need_update_in_failed_state_for_nested_resource(self):
def test_need_update_for_nested_resource(self):
"""
The resource in any state and has nested stack,
The resource in Create or Update state and has nested stack,
should need update.
"""
self.parent_resource.action = self.parent_resource.CREATE
need_update = self.parent_resource._needs_update(
self.parent_resource.t,
self.parent_resource.t,
@ -531,6 +532,38 @@ class StackResourceTest(StackResourceBaseTest):
self.assertEqual(True, need_update)
def test_need_update_in_failed_state_for_nested_resource(self):
"""
The resource in failed state and has no nested stack,
should need update with UpdateReplace.
"""
self.parent_resource.state_set(self.parent_resource.INIT,
self.parent_resource.FAILED)
self.parent_resource._nested = None
self.assertRaises(resource.UpdateReplace,
self.parent_resource._needs_update,
self.parent_resource.t,
self.parent_resource.t,
self.parent_resource.properties,
self.parent_resource.properties,
self.parent_resource)
def test_need_update_in_init_complete_state_for_nested_resource(self):
"""
The resource in failed state and has no nested stack,
should need update with UpdateReplace.
"""
self.parent_resource.state_set(self.parent_resource.INIT,
self.parent_resource.COMPLETE)
self.parent_resource._nested = None
self.assertRaises(resource.UpdateReplace,
self.parent_resource._needs_update,
self.parent_resource.t,
self.parent_resource.t,
self.parent_resource.properties,
self.parent_resource.properties,
self.parent_resource)
class StackResourceLimitTest(StackResourceBaseTest):
scenarios = [