]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
heat engine : WaitCondition FnGetAtt return correct signal data
authorSteven Hardy <shardy@redhat.com>
Tue, 15 Jan 2013 11:43:50 +0000 (11:43 +0000)
committerSteven Hardy <shardy@redhat.com>
Tue, 15 Jan 2013 11:43:50 +0000 (11:43 +0000)
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 <shardy@redhat.com>
heat/engine/resources/wait_condition.py
heat/tests/test_waitcondition.py

index fb18e371bad823bf70f4897d655e2c242a35c453..84f70afd118707db6641e9b8defc9e60fe70ae3b 100644 (file)
@@ -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():
index d134d1770cd4fb9d5095245299fa767c74a72d64..6a6d2c9965f183ca5233ce65726c9f6904e65793 100644 (file)
@@ -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')