]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Make Fn::GetAtt add a dependency
authorZane Bitter <zbitter@redhat.com>
Fri, 31 May 2013 10:52:30 +0000 (12:52 +0200)
committerSteve Baker <sbaker@redhat.com>
Wed, 5 Jun 2013 23:10:12 +0000 (11:10 +1200)
This will ensure that resources which get attributes from other resources
are not created until the latter resources are available.

An audit of all the templates in the heat-templates repo revealed that in
only one case did this cause a circular reference, and it was the template
that appeared to be incorrect (it has since been fixed).

Change-Id: Ibd51acdda55c24f665c5ca887040f3564d952c0e

heat/engine/resource.py
heat/tests/test_metadata_refresh.py

index c6676c645a63ae2382780079bfc61f54edc24e73..40eb70049df6e0a463b1a459805cef2f8409e09e 100644 (file)
@@ -273,7 +273,10 @@ class Resource(object):
     def _add_dependencies(self, deps, head, fragment):
         if isinstance(fragment, dict):
             for key, value in fragment.items():
-                if key in ('DependsOn', 'Ref'):
+                if key in ('DependsOn', 'Ref', 'Fn::GetAtt'):
+                    if key == 'Fn::GetAtt':
+                        value, head = value
+
                     try:
                         target = self.stack.resources[value]
                     except KeyError:
@@ -282,7 +285,7 @@ class Resource(object):
                             key=head)
                     if key == 'DependsOn' or target.strict_dependency:
                         deps += (self, target)
-                elif key != 'Fn::GetAtt':
+                else:
                     self._add_dependencies(deps, key, value)
         elif isinstance(fragment, list):
             for item in fragment:
index daa80945a3c2c40f8d2aa7cfe0acc7832715b833..26c11015200285e6d3c0bf7057b8966e2b5af5ae 100644 (file)
@@ -156,6 +156,7 @@ class MetadataRefreshTest(HeatTestCase):
             instance.Instance.handle_create().AndReturn(cookie)
             create_complete = instance.Instance.check_create_complete(cookie)
             create_complete.InAnyOrder().AndReturn(True)
+        scheduler.TaskRunner._sleep(mox.IsA(int)).AndReturn(None)
         self.m.StubOutWithMock(instance.Instance, 'FnGetAtt')
 
         return stack
@@ -260,6 +261,7 @@ class WaitCondMetadataUpdateTest(HeatTestCase):
 
         scheduler.TaskRunner._sleep(mox.IsA(int)).WithSideEffects(check_empty)
         scheduler.TaskRunner._sleep(mox.IsA(int)).WithSideEffects(post_success)
+        scheduler.TaskRunner._sleep(mox.IsA(int)).AndReturn(None)
 
         self.m.ReplayAll()
         self.stack.create()