Merge "Add a Fn::Split function to aid provider templates"
This commit is contained in:
commit
3a980a0ca0
|
@ -575,6 +575,7 @@ def resolve_runtime_data(template, resources, snippet):
|
||||||
resources=resources),
|
resources=resources),
|
||||||
functools.partial(template.resolve_attributes,
|
functools.partial(template.resolve_attributes,
|
||||||
resources=resources),
|
resources=resources),
|
||||||
|
template.resolve_split,
|
||||||
template.resolve_select,
|
template.resolve_select,
|
||||||
template.resolve_joins,
|
template.resolve_joins,
|
||||||
template.resolve_replace,
|
template.resolve_replace,
|
||||||
|
|
|
@ -281,6 +281,31 @@ class Template(collections.Mapping):
|
||||||
|
|
||||||
return _resolve(lambda k, v: k == 'Fn::Join', handle_join, s)
|
return _resolve(lambda k, v: k == 'Fn::Join', handle_join, s)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def resolve_split(s):
|
||||||
|
'''
|
||||||
|
Split strings in Fn::Split to a list of sub strings
|
||||||
|
eg the following
|
||||||
|
{ "Fn::Split" : [ ",", "str1,str2,str3,str4"]}
|
||||||
|
is reduced to
|
||||||
|
{["str1", "str2", "str3", "str4"]}
|
||||||
|
'''
|
||||||
|
def handle_split(args):
|
||||||
|
if not isinstance(args, (list, tuple)):
|
||||||
|
raise TypeError('Arguments to "Fn::Split" must be a list')
|
||||||
|
|
||||||
|
example = '"Fn::Split" : [ ",", "str1, str2"]]'
|
||||||
|
try:
|
||||||
|
delim, strings = args
|
||||||
|
except ValueError as ex:
|
||||||
|
raise ValueError('Incorrect arguments to "Fn::Split" %s: %s' %
|
||||||
|
('should be', example))
|
||||||
|
if not isinstance(strings, basestring):
|
||||||
|
raise TypeError('Incorrect arguments to "Fn::Split" %s: %s' %
|
||||||
|
('should be', example))
|
||||||
|
return strings.split(delim)
|
||||||
|
return _resolve(lambda k, v: k == 'Fn::Split', handle_split, s)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def resolve_replace(s):
|
def resolve_replace(s):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -332,6 +332,24 @@ class TemplateTest(HeatTestCase):
|
||||||
self.assertRaises(TypeError, parser.Template.resolve_joins,
|
self.assertRaises(TypeError, parser.Template.resolve_joins,
|
||||||
join3)
|
join3)
|
||||||
|
|
||||||
|
def test_split_ok(self):
|
||||||
|
data = {"Fn::Split": [";", "foo; bar; achoo"]}
|
||||||
|
self.assertEqual(parser.Template.resolve_split(data),
|
||||||
|
['foo', ' bar', ' achoo'])
|
||||||
|
|
||||||
|
def test_split_no_delim_in_str(self):
|
||||||
|
data = {"Fn::Split": [";", "foo, bar, achoo"]}
|
||||||
|
self.assertEqual(parser.Template.resolve_split(data),
|
||||||
|
['foo, bar, achoo'])
|
||||||
|
|
||||||
|
def test_split_no_delim(self):
|
||||||
|
data = {"Fn::Split": ["foo, bar, achoo"]}
|
||||||
|
self.assertRaises(ValueError, parser.Template.resolve_split, data)
|
||||||
|
|
||||||
|
def test_split_no_list(self):
|
||||||
|
data = {"Fn::Split": "foo, bar, achoo"}
|
||||||
|
self.assertRaises(TypeError, parser.Template.resolve_split, data)
|
||||||
|
|
||||||
def test_base64(self):
|
def test_base64(self):
|
||||||
snippet = {"Fn::Base64": "foobar"}
|
snippet = {"Fn::Base64": "foobar"}
|
||||||
# For now, the Base64 function just returns the original text, and
|
# For now, the Base64 function just returns the original text, and
|
||||||
|
|
Loading…
Reference in New Issue