From 3629e7c444aeaa83d30dd585d95b21a4815b27e2 Mon Sep 17 00:00:00 2001 From: Steve Baker Date: Mon, 4 Mar 2013 10:47:53 +1300 Subject: [PATCH] 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 --- heat/engine/parser.py | 13 +++++++++++++ heat/tests/test_parser.py | 20 ++++++++++++++++++++ 2 files changed, 33 insertions(+) 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'}}} -- 2.45.2