engine : move update_template_diff functions into Resource

Move the update_template_diff and update_template_diff_properties
functions into resource.Resource - since they now raise
resource.UpdateReplace we can avoid ever calling handle_update if
the resource update will result in replacement

Note a further cleanup will probably be to combine the two diff
functions into one recursive diff, which will further simplify this

Change-Id: I839f0c4448a2d869f35e0a4f19d17f31c5c6f9af
This commit is contained in:
Steven Hardy 2013-05-23 11:21:16 +01:00
parent 369b7faee7
commit 0eaeeac888
21 changed files with 170 additions and 142 deletions

View File

@ -386,8 +386,10 @@ class Resource(object):
self.stack.resolve_runtime_data,
self.name)
properties.validate()
tmpl_diff = self.update_template_diff(json_snippet)
prop_diff = self.update_template_diff_properties(json_snippet)
if callable(getattr(self, 'handle_update', None)):
result = self.handle_update(json_snippet)
result = self.handle_update(json_snippet, tmpl_diff, prop_diff)
except UpdateReplace:
logger.debug("Resource %s update requires replacement" % self.name)
raise
@ -575,7 +577,7 @@ class Resource(object):
'''
return base64.b64encode(data)
def handle_update(self, json_snippet=None):
def handle_update(self, json_snippet=None, tmpl_diff=None, prop_diff=None):
raise UpdateReplace(self.name)
def metadata_update(self, new_metadata=None):

View File

@ -90,10 +90,7 @@ class InstanceGroup(resource.Resource):
if creator is not None:
creator.run_to_completion()
def handle_update(self, json_snippet):
tmpl_diff = self.update_template_diff(json_snippet)
prop_diff = self.update_template_diff_properties(json_snippet)
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
# If Properties has changed, update self.properties, so we
# get the new values during any subsequent adjustment
if prop_diff:
@ -280,10 +277,7 @@ class AutoScalingGroup(InstanceGroup, CooldownMixin):
return self._adjust(num_to_create)
def handle_update(self, json_snippet):
tmpl_diff = self.update_template_diff(json_snippet)
prop_diff = self.update_template_diff_properties(json_snippet)
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
# If Properties has changed, update self.properties, so we
# get the new values during any subsequent adjustment
if prop_diff:
@ -411,10 +405,7 @@ class ScalingPolicy(resource.Resource, CooldownMixin):
def __init__(self, name, json_snippet, stack):
super(ScalingPolicy, self).__init__(name, json_snippet, stack)
def handle_update(self, json_snippet):
tmpl_diff = self.update_template_diff(json_snippet)
prop_diff = self.update_template_diff_properties(json_snippet)
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
# If Properties has changed, update self.properties, so we
# get the new values during any subsequent adjustment
if prop_diff:

View File

@ -90,10 +90,7 @@ class CloudWatchAlarm(resource.Resource):
stack_id=self.stack.id)
wr.store()
def handle_update(self, json_snippet):
self.update_template_diff(json_snippet)
prop_diff = self.update_template_diff_properties(json_snippet)
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
# If Properties has changed, update self.properties, so we
# get the new values during any subsequent adjustment
if prop_diff:

View File

@ -385,9 +385,7 @@ class Instance(resource.Resource):
vol['VolumeId'])
scheduler.TaskRunner(detach_task)()
def handle_update(self, json_snippet):
tmpl_diff = self.update_template_diff(json_snippet)
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
if 'Metadata' in tmpl_diff:
self.metadata = tmpl_diff.get('Metadata', {})

View File

@ -28,5 +28,5 @@ class GenericResource(resource.Resource):
def handle_create(self):
logger.warning('Creating generic resource (Type "%s")' % self.type())
def handle_update(self, json_snippet=None):
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
logger.warning('Updating generic resource (Type "%s")' % self.type())

View File

@ -138,7 +138,7 @@ class AutoScalingTest(HeatTestCase):
for x in range(nmeta):
Metadata.__set__(mox.IgnoreArg(), expected).AndReturn(None)
def test_scaling_group_update(self):
def test_scaling_group_update_replace(self):
t = template_format.parse(as_template)
stack = parse_stack(t)
@ -151,8 +151,10 @@ class AutoScalingTest(HeatTestCase):
self.assertEqual('WebServerGroup', rsrc.FnGetRefId())
self.assertEqual('WebServerGroup-0', rsrc.resource_id)
update_snippet = copy.deepcopy(rsrc.parsed_template())
update_snippet['Properties']['LaunchConfigurationName'] = 'foo'
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, {})
rsrc.update, update_snippet)
rsrc.delete()
self.m.VerifyAll()
@ -175,9 +177,11 @@ class AutoScalingTest(HeatTestCase):
# Reduce the max size to 2, should complete without adjusting
update_snippet = copy.deepcopy(rsrc.parsed_template())
update_snippet['Properties']['MaxSize'] = '2'
self.assertEqual(None, rsrc.handle_update(update_snippet))
self.assertEqual(None, rsrc.update(update_snippet))
self.assertEqual('WebServerGroup-0', rsrc.resource_id)
self.assertEqual('2', rsrc.properties['MaxSize'])
rsrc.delete()
self.m.VerifyAll()
@ -204,9 +208,10 @@ class AutoScalingTest(HeatTestCase):
update_snippet = copy.deepcopy(rsrc.parsed_template())
update_snippet['Properties']['MinSize'] = '2'
self.assertEqual(None, rsrc.handle_update(update_snippet))
self.assertEqual(None, rsrc.update(update_snippet))
self.assertEqual('WebServerGroup-0,WebServerGroup-1',
rsrc.resource_id)
self.assertEqual('2', rsrc.properties['MinSize'])
rsrc.delete()
self.m.VerifyAll()
@ -234,10 +239,12 @@ class AutoScalingTest(HeatTestCase):
update_snippet = copy.deepcopy(rsrc.parsed_template())
update_snippet['Properties']['DesiredCapacity'] = '2'
self.assertEqual(None, rsrc.handle_update(update_snippet))
self.assertEqual(None, rsrc.update(update_snippet))
self.assertEqual('WebServerGroup-0,WebServerGroup-1',
rsrc.resource_id)
self.assertEqual('2', rsrc.properties['DesiredCapacity'])
rsrc.delete()
self.m.VerifyAll()
@ -260,10 +267,12 @@ class AutoScalingTest(HeatTestCase):
# have no effect, it's an optional parameter
update_snippet = copy.deepcopy(rsrc.parsed_template())
del(update_snippet['Properties']['DesiredCapacity'])
self.assertEqual(None, rsrc.handle_update(update_snippet))
self.assertEqual(None, rsrc.update(update_snippet))
self.assertEqual('WebServerGroup-0,WebServerGroup-1',
rsrc.resource_id)
self.assertEqual(None, rsrc.properties['DesiredCapacity'])
rsrc.delete()
self.m.VerifyAll()
@ -284,7 +293,8 @@ class AutoScalingTest(HeatTestCase):
self.assertEqual('WebServerGroup-0', rsrc.resource_id)
update_snippet = copy.deepcopy(rsrc.parsed_template())
update_snippet['Properties']['Cooldown'] = '61'
self.assertEqual(None, rsrc.handle_update(update_snippet))
self.assertEqual(None, rsrc.update(update_snippet))
self.assertEqual('61', rsrc.properties['Cooldown'])
rsrc.delete()
self.m.VerifyAll()
@ -854,8 +864,7 @@ class AutoScalingTest(HeatTestCase):
# Update scaling policy
update_snippet = copy.deepcopy(up_policy.parsed_template())
update_snippet['Properties']['ScalingAdjustment'] = '2'
self.assertEqual(None,
up_policy.handle_update(update_snippet))
self.assertEqual(None, up_policy.update(update_snippet))
self.assertEqual('2',
up_policy.properties['ScalingAdjustment'])

View File

@ -91,7 +91,7 @@ class CloudWatchAlarmTest(HeatTestCase):
snippet['Properties']['Statistic'] = 'Maximum'
snippet['Properties']['Threshold'] = '39'
self.assertEqual(None, rsrc.handle_update(snippet))
self.assertEqual(None, rsrc.update(snippet))
rsrc.delete()
self.m.VerifyAll()
@ -118,7 +118,7 @@ class CloudWatchAlarmTest(HeatTestCase):
snippet['Properties']['MetricName'] = 'temp'
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, snippet)
rsrc.update, snippet)
rsrc.delete()
self.m.VerifyAll()

View File

@ -94,7 +94,7 @@ class EIPTest(HeatTestCase):
self.assertEqual('1', rsrc.FnGetAtt('AllocationId'))
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, {})
rsrc.handle_update, {}, {}, {})
self.assertRaises(eip.exception.InvalidTemplateAttribute,
rsrc.FnGetAtt, 'Foo')

View File

@ -100,8 +100,6 @@ class InstanceGroupTest(HeatTestCase):
self.assertEqual('JobServerGroup', rsrc.FnGetRefId())
self.assertEqual('1.2.3.4', rsrc.FnGetAtt('InstanceList'))
self.assertEqual('JobServerGroup-0', rsrc.resource_id)
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, {})
rsrc.delete()
self.m.VerifyAll()
@ -127,7 +125,7 @@ class InstanceGroupTest(HeatTestCase):
self.m.VerifyAll()
def test_update_size(self):
def test_handle_update_size(self):
t = template_format.parse(ig_template)
properties = t['Resources']['JobServerGroup']['Properties']
properties['Size'] = '2'
@ -155,7 +153,10 @@ class InstanceGroupTest(HeatTestCase):
update_snippet = copy.deepcopy(rsrc.parsed_template())
update_snippet['Properties']['Size'] = '5'
self.assertEqual(None, rsrc.handle_update(update_snippet))
tmpl_diff = {'Properties': {'Size': '5'}}
prop_diff = {'Size': '5'}
self.assertEqual(None, rsrc.handle_update(update_snippet, tmpl_diff,
prop_diff))
assert_str = ','.join(['JobServerGroup-%s' % x for x in range(5)])
self.assertEqual(assert_str,
rsrc.resource_id)
@ -164,3 +165,47 @@ class InstanceGroupTest(HeatTestCase):
rsrc.delete()
self.m.VerifyAll()
def test_update_fail_badkey(self):
t = template_format.parse(ig_template)
properties = t['Resources']['JobServerGroup']['Properties']
properties['Size'] = '2'
stack = parse_stack(t)
self._stub_create(2)
self.m.ReplayAll()
rsrc = self.create_instance_group(t, stack, 'JobServerGroup')
self.assertEqual('JobServerGroup-0,JobServerGroup-1',
rsrc.resource_id)
self.m.ReplayAll()
update_snippet = copy.deepcopy(rsrc.parsed_template())
update_snippet['Metadata'] = 'notallowedforupdate'
self.assertRaises(resource.UpdateReplace,
rsrc.update, update_snippet)
rsrc.delete()
self.m.VerifyAll()
def test_update_fail_badprop(self):
t = template_format.parse(ig_template)
properties = t['Resources']['JobServerGroup']['Properties']
properties['Size'] = '2'
stack = parse_stack(t)
self._stub_create(2)
self.m.ReplayAll()
rsrc = self.create_instance_group(t, stack, 'JobServerGroup')
self.assertEqual('JobServerGroup-0,JobServerGroup-1',
rsrc.resource_id)
self.m.ReplayAll()
update_snippet = copy.deepcopy(rsrc.parsed_template())
update_snippet['Properties']['LaunchConfigurationName'] = 'wibble'
self.assertRaises(resource.UpdateReplace,
rsrc.update, update_snippet)
rsrc.delete()
self.m.VerifyAll()

View File

@ -170,7 +170,7 @@ class LoadBalancerTest(HeatTestCase):
pass
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, {})
rsrc.handle_update, {}, {}, {})
self.m.VerifyAll()

View File

@ -78,7 +78,7 @@ Outputs:
'arn:openstack:heat::aaaa:stacks/test_stack.the_nested/'))
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, {})
rsrc.handle_update, {}, {}, {})
self.assertEqual('bar', rsrc.FnGetAtt('Outputs.Foo'))
self.assertRaises(

View File

@ -560,11 +560,10 @@ class StackTest(HeatTestCase):
updated_stack = parser.Stack(self.ctx, 'updated_stack',
template.Template(tmpl2))
# patch in a dummy handle_update
self.m.StubOutWithMock(generic_rsrc.GenericResource, 'handle_update')
generic_rsrc.GenericResource.handle_update(
tmpl2['Resources']['AResource']).AndRaise(
resource.UpdateReplace)
# Calls to GenericResource.handle_update will raise
# resource.UpdateReplace because we've not specified the modified
# key/property in update_allowed_keys/update_allowed_properties
self.m.ReplayAll()
self.stack.update(updated_stack)
@ -588,6 +587,10 @@ class StackTest(HeatTestCase):
self.stack.create()
self.assertEqual(self.stack.state, parser.Stack.CREATE_COMPLETE)
res = self.stack['AResource']
res.update_allowed_keys = ('Properties',)
res.update_allowed_properties = ('Foo',)
tmpl2 = {'Resources': {'AResource': {'Type': 'GenericResourceType',
'Properties': {'Foo': 'xyz'}}}}
@ -596,8 +599,11 @@ class StackTest(HeatTestCase):
# patch in a dummy handle_update
self.m.StubOutWithMock(generic_rsrc.GenericResource, 'handle_update')
tmpl_diff = {'Properties': {'Foo': 'xyz'}}
prop_diff = {'Foo': 'xyz'}
generic_rsrc.GenericResource.handle_update(
tmpl2['Resources']['AResource']).AndRaise(Exception("Foo"))
tmpl2['Resources']['AResource'], tmpl_diff,
prop_diff).AndRaise(Exception("Foo"))
self.m.ReplayAll()
self.stack.update(updated_stack)
@ -626,11 +632,9 @@ class StackTest(HeatTestCase):
updated_stack = parser.Stack(self.ctx, 'updated_stack',
template.Template(tmpl2))
# patch in a dummy handle_update
self.m.StubOutWithMock(generic_rsrc.GenericResource, 'handle_update')
generic_rsrc.GenericResource.handle_update(
tmpl2['Resources']['AResource']).AndRaise(
resource.UpdateReplace)
# Calls to GenericResource.handle_update will raise
# resource.UpdateReplace because we've not specified the modified
# key/property in update_allowed_keys/update_allowed_properties
# make the update fail deleting the existing resource
self.m.StubOutWithMock(resource.Resource, 'destroy')
@ -666,11 +670,9 @@ class StackTest(HeatTestCase):
updated_stack = parser.Stack(self.ctx, 'updated_stack',
template.Template(tmpl2))
# patch in a dummy handle_update
self.m.StubOutWithMock(generic_rsrc.GenericResource, 'handle_update')
generic_rsrc.GenericResource.handle_update(
tmpl2['Resources']['AResource']).AndRaise(
resource.UpdateReplace)
# Calls to GenericResource.handle_update will raise
# resource.UpdateReplace because we've not specified the modified
# key/property in update_allowed_keys/update_allowed_properties
# patch in a dummy handle_create making the replace fail creating
self.m.StubOutWithMock(generic_rsrc.GenericResource, 'handle_create')
@ -734,15 +736,9 @@ class StackTest(HeatTestCase):
updated_stack = parser.Stack(self.ctx, 'updated_stack',
template.Template(tmpl2))
# There will be two calls to handle_update, one for the new template
# then another (with the initial template) for rollback
self.m.StubOutWithMock(generic_rsrc.GenericResource, 'handle_update')
generic_rsrc.GenericResource.handle_update(
tmpl2['Resources']['AResource']).AndRaise(
resource.UpdateReplace)
generic_rsrc.GenericResource.handle_update(
tmpl['Resources']['AResource']).AndRaise(
resource.UpdateReplace)
# Calls to GenericResource.handle_update will raise
# resource.UpdateReplace because we've not specified the modified
# key/property in update_allowed_keys/update_allowed_properties
# patch in a dummy handle_create making the replace fail when creating
# the replacement rsrc, but succeed the second call (rollback)
@ -778,15 +774,9 @@ class StackTest(HeatTestCase):
updated_stack = parser.Stack(self.ctx, 'updated_stack',
template.Template(tmpl2))
# There will be two calls to handle_update, one for the new template
# then another (with the initial template) for rollback
self.m.StubOutWithMock(generic_rsrc.GenericResource, 'handle_update')
generic_rsrc.GenericResource.handle_update(
tmpl2['Resources']['AResource']).AndRaise(
resource.UpdateReplace)
generic_rsrc.GenericResource.handle_update(
tmpl['Resources']['AResource']).AndRaise(
resource.UpdateReplace)
# Calls to GenericResource.handle_update will raise
# resource.UpdateReplace because we've not specified the modified
# key/property in update_allowed_keys/update_allowed_properties
# patch in a dummy handle_create making the replace fail when creating
# the replacement rsrc, and again on the second call (rollback)
@ -891,15 +881,9 @@ class StackTest(HeatTestCase):
self.assertEqual(self.stack['BResource'].properties['Foo'],
'AResource')
self.m.StubOutWithMock(generic_rsrc.GenericResource, 'handle_update')
generic_rsrc.GenericResource.handle_update(
tmpl2['Resources']['AResource']).AndRaise(
resource.UpdateReplace)
br2_snip = {'Type': 'GenericResourceType',
'Properties': {'Foo': 'inst-007'}}
generic_rsrc.GenericResource.handle_update(
br2_snip).AndRaise(resource.UpdateReplace)
# Calls to GenericResource.handle_update will raise
# resource.UpdateReplace because we've not specified the modified
# key/property in update_allowed_keys/update_allowed_properties
self.m.StubOutWithMock(generic_rsrc.GenericResource, 'FnGetRefId')
generic_rsrc.GenericResource.FnGetRefId().AndReturn(
@ -949,25 +933,19 @@ class StackTest(HeatTestCase):
self.assertEqual(self.stack['BResource'].properties['Foo'],
'AResource')
self.m.StubOutWithMock(generic_rsrc.GenericResource, 'handle_update')
self.m.StubOutWithMock(generic_rsrc.GenericResource, 'FnGetRefId')
self.m.StubOutWithMock(generic_rsrc.GenericResource, 'handle_create')
# mocks for first (failed update)
generic_rsrc.GenericResource.handle_update(
tmpl2['Resources']['AResource']).AndRaise(
resource.UpdateReplace)
# Calls to GenericResource.handle_update will raise
# resource.UpdateReplace because we've not specified the modified
# key/property in update_allowed_keys/update_allowed_properties
generic_rsrc.GenericResource.FnGetRefId().AndReturn(
'AResource')
# mock to make the replace fail when creating the replacement resource
generic_rsrc.GenericResource.handle_create().AndRaise(Exception)
# mocks for second rollback update
generic_rsrc.GenericResource.handle_update(
tmpl['Resources']['AResource']).AndRaise(
resource.UpdateReplace)
generic_rsrc.GenericResource.handle_create().AndReturn(None)
generic_rsrc.GenericResource.FnGetRefId().MultipleTimes().AndReturn(
'AResource')
@ -1016,18 +994,12 @@ class StackTest(HeatTestCase):
self.assertEqual(self.stack['BResource'].properties['Foo'],
'AResource')
self.m.StubOutWithMock(generic_rsrc.GenericResource, 'handle_update')
self.m.StubOutWithMock(generic_rsrc.GenericResource, 'FnGetRefId')
self.m.StubOutWithMock(generic_rsrc.GenericResource, 'handle_create')
# mocks for first and second (failed update)
generic_rsrc.GenericResource.handle_update(
tmpl2['Resources']['AResource']).AndRaise(
resource.UpdateReplace)
br2_snip = {'Type': 'GenericResourceType',
'Properties': {'Foo': 'inst-007'}}
generic_rsrc.GenericResource.handle_update(
br2_snip).AndRaise(resource.UpdateReplace)
# Calls to GenericResource.handle_update will raise
# resource.UpdateReplace because we've not specified the modified
# key/property in update_allowed_keys/update_allowed_properties
generic_rsrc.GenericResource.FnGetRefId().AndReturn(
'AResource')
@ -1054,14 +1026,9 @@ class StackTest(HeatTestCase):
generic_rsrc.GenericResource.handle_create().AndReturn(None)
generic_rsrc.GenericResource.handle_create().AndRaise(Exception)
# mocks for second rollback update
generic_rsrc.GenericResource.handle_update(
tmpl['Resources']['AResource']).AndRaise(
resource.UpdateReplace)
br2_snip = {'Type': 'GenericResourceType',
'Properties': {'Foo': 'AResource'}}
generic_rsrc.GenericResource.handle_update(
br2_snip).AndRaise(resource.UpdateReplace)
# Calls to GenericResource.handle_update will raise
# resource.UpdateReplace because we've not specified the modified
# key/property in update_allowed_keys/update_allowed_properties
# self.state_set(self.DELETE_IN_PROGRESS)
generic_rsrc.GenericResource.FnGetRefId().AndReturn(

View File

@ -289,7 +289,7 @@ class QuantumNetTest(HeatTestCase):
rsrc.FnGetAtt('id'))
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, {})
rsrc.handle_update, {}, {}, {})
rsrc.delete()
rsrc.state_set(rsrc.CREATE_COMPLETE, 'to delete again')
@ -386,7 +386,7 @@ class QuantumSubnetTest(HeatTestCase):
rsrc.FnGetAtt('id'))
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, {})
rsrc.handle_update, {}, {}, {})
self.assertEqual(rsrc.delete(), None)
rsrc.state_set(rsrc.CREATE_COMPLETE, 'to delete again')
@ -514,7 +514,7 @@ class QuantumRouterTest(HeatTestCase):
rsrc.FnGetAtt('id'))
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, {})
rsrc.handle_update, {}, {}, {})
self.assertEqual(rsrc.delete(), None)
rsrc.state_set(rsrc.CREATE_COMPLETE, 'to delete again')
@ -639,7 +639,7 @@ class QuantumFloatingIPTest(HeatTestCase):
self.assertEqual('fc68ea2c-b60b-4b4f-bd82-94ec81110766',
fip.FnGetAtt('id'))
self.assertRaises(resource.UpdateReplace,
fip.handle_update, {})
fip.handle_update, {}, {}, {})
self.assertEqual(fip.delete(), None)
fip.state_set(fip.CREATE_COMPLETE, 'to delete again')
self.assertEqual(fip.delete(), None)
@ -707,7 +707,7 @@ class QuantumFloatingIPTest(HeatTestCase):
p.FnGetAtt('id'))
self.assertRaises(resource.UpdateReplace,
p.handle_update, {})
p.handle_update, {}, {}, {})
self.m.VerifyAll()
@ -800,7 +800,7 @@ class QuantumFloatingIPTest(HeatTestCase):
port_id = p.FnGetRefId()
self.assertEqual('%s:%s' % (fip_id, port_id), fipa_id)
self.assertRaises(resource.UpdateReplace,
fipa.handle_update, {})
fipa.handle_update, {}, {}, {})
self.assertEqual(fipa.delete(), None)
self.assertEqual(p.delete(), None)

View File

@ -262,12 +262,17 @@ class ResourceTest(HeatTestCase):
tmpl = {'Type': 'GenericResourceType', 'Properties': {'Foo': 'abc'}}
res = generic_rsrc.GenericResource('test_resource', tmpl, self.stack)
res.update_allowed_keys = ('Properties',)
res.update_allowed_properties = ('Foo',)
scheduler.TaskRunner(res.create)()
self.assertEqual(res.CREATE_COMPLETE, res.state)
utmpl = {'Type': 'GenericResourceType', 'Properties': {'Foo': 'xyz'}}
tmpl_diff = {'Properties': {'Foo': 'xyz'}}
prop_diff = {'Foo': 'xyz'}
self.m.StubOutWithMock(generic_rsrc.GenericResource, 'handle_update')
generic_rsrc.GenericResource.handle_update(utmpl).AndReturn(None)
generic_rsrc.GenericResource.handle_update(
utmpl, tmpl_diff, prop_diff).AndReturn(None)
self.m.ReplayAll()
self.assertEqual(None, res.update(utmpl))
@ -281,13 +286,17 @@ class ResourceTest(HeatTestCase):
tmpl = {'Type': 'GenericResourceType', 'Properties': {'Foo': 'abc'}}
res = generic_rsrc.GenericResource('test_resource', tmpl, self.stack)
res.update_allowed_keys = ('Properties',)
res.update_allowed_properties = ('Foo',)
scheduler.TaskRunner(res.create)()
self.assertEqual(res.CREATE_COMPLETE, res.state)
utmpl = {'Type': 'GenericResourceType', 'Properties': {'Foo': 'xyz'}}
self.m.StubOutWithMock(generic_rsrc.GenericResource, 'handle_update')
generic_rsrc.GenericResource.handle_update(utmpl).AndRaise(
resource.UpdateReplace())
tmpl_diff = {'Properties': {'Foo': 'xyz'}}
prop_diff = {'Foo': 'xyz'}
generic_rsrc.GenericResource.handle_update(
utmpl, tmpl_diff, prop_diff).AndRaise(resource.UpdateReplace())
self.m.ReplayAll()
# should be re-raised so parser.Stack can handle replacement
self.assertRaises(resource.UpdateReplace, res.update, utmpl)
@ -300,6 +309,8 @@ class ResourceTest(HeatTestCase):
tmpl = {'Type': 'GenericResourceType', 'Properties': {'Foo': 'abc'}}
res = generic_rsrc.GenericResource('test_resource', tmpl, self.stack)
res.update_allowed_keys = ('Properties',)
res.update_allowed_properties = ('Foo',)
scheduler.TaskRunner(res.create)()
self.assertEqual(res.CREATE_COMPLETE, res.state)
@ -315,6 +326,8 @@ class ResourceTest(HeatTestCase):
tmpl = {'Type': 'GenericResourceType', 'Properties': {'Foo': 'abc'}}
res = generic_rsrc.GenericResource('test_resource', tmpl, self.stack)
res.update_allowed_keys = ('Properties',)
res.update_allowed_properties = ('Foo',)
scheduler.TaskRunner(res.create)()
self.assertEqual(res.CREATE_COMPLETE, res.state)
@ -330,13 +343,17 @@ class ResourceTest(HeatTestCase):
tmpl = {'Type': 'GenericResourceType', 'Properties': {'Foo': 'abc'}}
res = generic_rsrc.GenericResource('test_resource', tmpl, self.stack)
res.update_allowed_keys = ('Properties',)
res.update_allowed_properties = ('Foo',)
scheduler.TaskRunner(res.create)()
self.assertEqual(res.CREATE_COMPLETE, res.state)
utmpl = {'Type': 'GenericResourceType', 'Properties': {'Foo': 'xyz'}}
tmpl_diff = {'Properties': {'Foo': 'xyz'}}
prop_diff = {'Foo': 'xyz'}
self.m.StubOutWithMock(generic_rsrc.GenericResource, 'handle_update')
generic_rsrc.GenericResource.handle_update(utmpl).AndRaise(
NotImplemented)
generic_rsrc.GenericResource.handle_update(utmpl, tmpl_diff, prop_diff
).AndRaise(NotImplemented)
self.m.ReplayAll()
self.assertRaises(exception.ResourceFailure, res.update, utmpl)
self.assertEqual(res.UPDATE_FAILED, res.state)

View File

@ -119,7 +119,7 @@ class s3Test(HeatTestCase):
pass
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, {})
rsrc.handle_update, {}, {}, {})
rsrc.delete()
self.m.VerifyAll()

View File

@ -193,7 +193,7 @@ Resources:
stack = self.create_stack(self.test_template_nova)
sg = stack['the_sg']
self.assertRaises(resource.UpdateReplace, sg.handle_update, {})
self.assertRaises(resource.UpdateReplace, sg.handle_update, {}, {}, {})
self.assertResourceState(sg, 'the_sg')
@ -266,7 +266,7 @@ Resources:
stack = self.create_stack(self.test_template_nova)
sg = stack['the_sg']
self.assertRaises(resource.UpdateReplace, sg.handle_update, {})
self.assertRaises(resource.UpdateReplace, sg.handle_update, {}, {}, {})
self.assertResourceState(sg, 'the_sg')
@ -410,7 +410,7 @@ Resources:
stack = self.create_stack(self.test_template_quantum)
sg = stack['the_sg']
self.assertRaises(resource.UpdateReplace, sg.handle_update, {})
self.assertRaises(resource.UpdateReplace, sg.handle_update, {}, {}, {})
self.assertResourceState(sg, 'the_sg')
@ -526,7 +526,7 @@ Resources:
stack = self.create_stack(self.test_template_quantum)
sg = stack['the_sg']
self.assertRaises(resource.UpdateReplace, sg.handle_update, {})
self.assertRaises(resource.UpdateReplace, sg.handle_update, {}, {}, {})
self.assertResourceState(sg, 'the_sg')

View File

@ -155,7 +155,7 @@ class swiftTest(HeatTestCase):
pass
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, {})
rsrc.handle_update, {}, {}, {})
rsrc.delete()
self.m.VerifyAll()

View File

@ -124,7 +124,7 @@ class UserTest(UserPolicyTestCase):
self.assertEqual('CREATE_COMPLETE', rsrc.state)
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, {})
rsrc.handle_update, {}, {}, {})
rsrc.resource_id = None
self.assertEqual(None, rsrc.delete())
@ -279,7 +279,7 @@ class AccessKeyTest(UserPolicyTestCase):
rsrc = self.create_access_key(t, stack, 'HostKeys')
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, {})
rsrc.handle_update, {}, {}, {})
self.assertEqual(self.fc.access,
rsrc.resource_id)
@ -379,7 +379,7 @@ class AccessPolicyTest(UserPolicyTestCase):
t['Resources'][resource_name],
stack)
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, {})
rsrc.handle_update, {}, {}, {})
def test_accesspolicy_access_allowed(self):
t = template_format.parse(user_policy_template)

View File

@ -133,7 +133,7 @@ class VolumeTest(HeatTestCase):
self.assertEqual(fv.status, 'available')
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, {})
rsrc.handle_update, {}, {}, {})
fv.status = 'in-use'
self.assertRaises(exception.ResourceFailure, rsrc.destroy)
@ -251,7 +251,7 @@ class VolumeTest(HeatTestCase):
rsrc = self.create_attachment(t, stack, 'MountPoint')
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, {})
rsrc.handle_update, {}, {}, {})
self.assertEqual(rsrc.delete(), None)
@ -556,7 +556,8 @@ class VolumeTest(HeatTestCase):
scheduler.TaskRunner(rsrc.create)()
self.assertEqual(rsrc.state, vol.VolumeAttachment.CREATE_COMPLETE)
self.assertRaises(resource.UpdateReplace, rsrc.handle_update, {})
self.assertRaises(resource.UpdateReplace, rsrc.handle_update,
{}, {}, {})
self.assertEqual(rsrc.delete(), None)

View File

@ -229,7 +229,7 @@ Resources:
'router_id': 'bbbb',
'all_router_ids': ['bbbb']})
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, {})
rsrc.handle_update, {}, {}, {})
self.assertEqual(None, rsrc.delete())
self.m.VerifyAll()
@ -274,7 +274,7 @@ Resources:
'default_router_id': 'bbbb'})
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, {})
rsrc.handle_update, {}, {}, {})
self.assertRaises(
exception.InvalidTemplateAttribute,
rsrc.FnGetAtt,
@ -446,7 +446,7 @@ Resources:
self.assertResourceState(rsrc, 'dddd')
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, {})
rsrc.handle_update, {}, {}, {})
finally:
stack.delete()
@ -564,12 +564,13 @@ Resources:
gateway = stack['the_gateway']
self.assertResourceState(gateway, 'the_gateway', {
'external_network_id': 'eeee'})
self.assertRaises(resource.UpdateReplace, gateway.handle_update, {})
self.assertRaises(resource.UpdateReplace, gateway.handle_update,
{}, {}, {})
attachment = stack['the_attachment']
self.assertResourceState(attachment, 'the_attachment')
self.assertRaises(resource.UpdateReplace,
attachment.handle_update, {})
attachment.handle_update, {}, {}, {})
stack.delete()
self.m.VerifyAll()
@ -653,13 +654,13 @@ Resources:
self.assertResourceState(route_table, 'ffff', {})
self.assertRaises(
resource.UpdateReplace,
route_table.handle_update, {})
route_table.handle_update, {}, {}, {})
association = stack['the_association']
self.assertResourceState(association, 'the_association', {})
self.assertRaises(
resource.UpdateReplace,
association.handle_update, {})
association.handle_update, {}, {}, {})
association.delete()
route_table.delete()

View File

@ -243,7 +243,7 @@ class WaitConditionTest(HeatTestCase):
self.assertTrue(reason.startswith('WaitConditionTimeout:'))
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, {})
rsrc.handle_update, {}, {}, {})
self.m.VerifyAll()
@stack_delete_after
@ -450,7 +450,7 @@ class WaitConditionHandleTest(HeatTestCase):
self.assertEqual(expected_url, rsrc.FnGetRefId())
self.assertRaises(resource.UpdateReplace,
rsrc.handle_update, {})
rsrc.handle_update, {}, {}, {})
self.m.VerifyAll()
@stack_delete_after