From 4c556ae9334ab3edda1c57c022d75ec7013c4b7d Mon Sep 17 00:00:00 2001 From: Zane Bitter Date: Fri, 31 May 2013 12:52:30 +0200 Subject: [PATCH] Make Fn::GetAtt add a dependency 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 | 7 +++++-- heat/tests/test_metadata_refresh.py | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/heat/engine/resource.py b/heat/engine/resource.py index c6676c645a..40eb70049d 100644 --- a/heat/engine/resource.py +++ b/heat/engine/resource.py @@ -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: diff --git a/heat/tests/test_metadata_refresh.py b/heat/tests/test_metadata_refresh.py index daa80945a3..26c1101520 100644 --- a/heat/tests/test_metadata_refresh.py +++ b/heat/tests/test_metadata_refresh.py @@ -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()