import time
import urllib
import urlparse
+import json
from heat.common import exception
from heat.common import identifier
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():
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')