From: Steve Baker Date: Sun, 3 Mar 2013 21:47:53 +0000 (+1300) Subject: Convenience method to look up resource by FnGetRefId X-Git-Tag: 2014.1~797^2 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=3629e7c444aeaa83d30dd585d95b21a4815b27e2;p=openstack-build%2Fheat-build.git Convenience method to look up resource by FnGetRefId This assumes that no resource will raise an error when FnGetRefId is called, and any resource that does really needs to be fixed. Change-Id: I5b58a28661e4eb10ccb21e8b50ec131937618d4a --- diff --git a/heat/engine/parser.py b/heat/engine/parser.py index 72c0bf94..f4ff716e 100644 --- a/heat/engine/parser.py +++ b/heat/engine/parser.py @@ -214,6 +214,19 @@ class Stack(object): '''Return a human-readable string representation of the stack''' return 'Stack "%s"' % self.name + def resource_by_refid(self, refid): + ''' + Return the resource in this stack with the specified + refid, or None if not found + ''' + for r in self.resources.values(): + if r.state in ( + r.CREATE_IN_PROGRESS, + r.CREATE_COMPLETE, + r.UPDATE_IN_PROGRESS, + r.UPDATE_COMPLETE) and r.FnGetRefId() == refid: + return r + def validate(self): ''' http://docs.amazonwebservices.com/AWSCloudFormation/latest/\ diff --git a/heat/tests/test_parser.py b/heat/tests/test_parser.py index 0e21d1f2..23de3867 100644 --- a/heat/tests/test_parser.py +++ b/heat/tests/test_parser.py @@ -447,6 +447,26 @@ class StackTest(unittest.TestCase): self.stack.update({}) self.assertEqual(self.stack.state, parser.Stack.UPDATE_FAILED) + @stack_delete_after + def test_resource_by_refid(self): + tmpl = {'Resources': {'AResource': {'Type': 'GenericResourceType'}}} + + self.stack = parser.Stack(self.ctx, 'resource_by_refid_stack', + template.Template(tmpl)) + self.stack.store() + self.stack.create() + self.assertEqual(self.stack.state, parser.Stack.CREATE_COMPLETE) + self.assertTrue('AResource' in self.stack) + resource = self.stack['AResource'] + resource.resource_id_set('aaaa') + self.assertNotEqual(None, resource) + self.assertEqual(resource, self.stack.resource_by_refid('aaaa')) + + resource.state = resource.DELETE_IN_PROGRESS + self.assertEqual(None, self.stack.resource_by_refid('aaaa')) + + self.assertEqual(None, self.stack.resource_by_refid('bbbb')) + @stack_delete_after def test_update_add(self): tmpl = {'Resources': {'AResource': {'Type': 'GenericResourceType'}}}