So if I dump the arguments in heat/engine/cfn/functions.py where it fails:
class Join(function.Function):
...
try: self._delim, self._strings = self.args
except ValueError:
+ with open("/tmp/test", "w") as f:
+ for i in args:
+ f.write("Arg: %s\n" % i)
+
raise ValueError(_('Incorrect arguments to "%(fn_name)s" ' 'should be: %(example)s') % fmt_data)
So if I dump the arguments in heat/engine/ cfn/functions. py where it fails: Function) :
self. _delim, self._strings = self.args _('Incorrect arguments to "%(fn_name)s" '
'should be: %(example)s') % fmt_data)
class Join(function.
...
try:
except ValueError:
+ with open("/tmp/test", "w") as f:
+ for i in args:
+ f.write("Arg: %s\n" % i)
+
raise ValueError(
I see the following: hot.functions. GetAtt {get_attr: [u'ControllerSe rviceChain' , u'role_data', u'service_names']} -> None> hot.functions. GetAtt {get_attr: [u'ComputeServi ceChain' , u'role_data', u'service_names']} -> None> hot.functions. GetAtt {get_attr: [u'BlockStorage ServiceChain' , u'role_data', u'service_names']} -> None> hot.functions. GetAtt {get_attr: [u'ObjectStorag eServiceChain' , u'role_data', u'service_names']} -> None> hot.functions. GetAtt {get_attr: [u'CephStorageS erviceChain' , u'role_data', u'service_names']} -> None>
Arg: ,
Arg: <heat.engine.
Arg: <heat.engine.
Arg: <heat.engine.
Arg: <heat.engine.
Arg: <heat.engine.
So it seems those functions return None and this confuses the function?