From 4c980cde140d562dc2d1051d295cfddebe849760 Mon Sep 17 00:00:00 2001 From: Steven Hardy Date: Tue, 15 Jan 2013 11:43:50 +0000 Subject: [PATCH] heat engine : WaitCondition FnGetAtt return correct signal data FnGetAtt for WaitCondition should return data in the format described in the AWS docs, currently it always returns "None" fixes bug 1097786 Change-Id: Ifb8e89a58fedbab8815fe1197acb138afbc8d2a3 Signed-off-by: Steven Hardy --- heat/engine/resources/wait_condition.py | 17 +++++++-------- heat/tests/test_waitcondition.py | 29 +++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/heat/engine/resources/wait_condition.py b/heat/engine/resources/wait_condition.py index fb18e371..84f70afd 100644 --- a/heat/engine/resources/wait_condition.py +++ b/heat/engine/resources/wait_condition.py @@ -17,6 +17,7 @@ import eventlet import time import urllib import urlparse +import json from heat.common import exception from heat.common import identifier @@ -262,21 +263,19 @@ class WaitCondition(resource.Resource): handle.metadata = {} def FnGetAtt(self, key): - res = None + res = {} + handle_res_name = self._get_handle_resource_name() + handle = self.stack[handle_res_name] if key == 'Data': - try: - meta = self.metadata - if meta and 'Data' in meta: - res = meta['Data'] - except Exception as ex: - pass - + meta = handle.metadata + # Note, can't use a dict generator on python 2.6, hence: + res = dict([(k, meta[k]['Data']) for k in meta]) else: raise exception.InvalidTemplateAttribute(resource=self.name, key=key) logger.debug('%s.GetAtt(%s) == %s' % (self.name, key, res)) - return unicode(res) + return unicode(json.dumps(res)) def resource_mapping(): diff --git a/heat/tests/test_waitcondition.py b/heat/tests/test_waitcondition.py index d134d177..6a6d2c99 100644 --- a/heat/tests/test_waitcondition.py +++ b/heat/tests/test_waitcondition.py @@ -220,6 +220,35 @@ class WaitConditionTest(unittest.TestCase): self.assertEqual(wc.WaitCondition.UPDATE_REPLACE, resource.handle_update()) + def test_FnGetAtt(self): + self.stack = self.create_stack() + wc.WaitCondition._create_timeout().AndReturn(eventlet.Timeout(5)) + wc.WaitConditionHandle.get_status().AndReturn(['SUCCESS']) + + self.m.ReplayAll() + self.stack.create() + + resource = self.stack.resources['WaitForTheHandle'] + self.assertEqual(resource.state, 'CREATE_COMPLETE') + + wc_att = resource.FnGetAtt('Data') + self.assertEqual(wc_att, unicode({})) + + handle = self.stack.resources['WaitHandle'] + self.assertEqual(handle.state, 'CREATE_COMPLETE') + + test_metadata = {'Data': 'foo', 'Reason': 'bar', + 'Status': 'SUCCESS', 'UniqueId': '123'} + handle.metadata_update(test_metadata) + wc_att = resource.FnGetAtt('Data') + self.assertEqual(wc_att, '{"123": "foo"}') + + test_metadata = {'Data': 'dog', 'Reason': 'cat', + 'Status': 'SUCCESS', 'UniqueId': '456'} + handle.metadata_update(test_metadata) + wc_att = resource.FnGetAtt('Data') + self.assertEqual(wc_att, u'{"123": "foo", "456": "dog"}') + @attr(tag=['unit', 'resource', 'WaitConditionHandle']) @attr(speed='fast') -- 2.45.2