]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Convenience method to look up resource by FnGetRefId
authorSteve Baker <sbaker@redhat.com>
Sun, 3 Mar 2013 21:47:53 +0000 (10:47 +1300)
committerSteve Baker <sbaker@redhat.com>
Thu, 7 Mar 2013 00:32:02 +0000 (13:32 +1300)
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
heat/tests/test_parser.py

index 72c0bf94551557bf364ce9c583a1cc4a72d9baaf..f4ff716ede3b2502c4230ce9d16ab2f8950cbecd 100644 (file)
@@ -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/\
index 0e21d1f2b929e76754b3244ce17c66e30c4430be..23de3867072c4f4afdb6fa84754c7ed2ca98fa99 100644 (file)
@@ -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'}}}