]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Add a Fn::Split function to aid provider templates
authorAngus Salkeld <asalkeld@redhat.com>
Tue, 18 Jun 2013 00:15:41 +0000 (10:15 +1000)
committerAngus Salkeld <asalkeld@redhat.com>
Tue, 18 Jun 2013 00:15:41 +0000 (10:15 +1000)
This needed to convert a parameter in CommaDelimedList into
a property of type List.

part of blueprint provider-resource
Change-Id: Id77a2c6be47427360a2be89ca1fea3c097807bac

heat/engine/parser.py
heat/engine/template.py
heat/tests/test_parser.py

index 974b8eb1c0b5bf66c73e8f564d7954bf45b4b4ae..c3b7c0793a7c7787f0660c713c11ac8f85eb135c 100644 (file)
@@ -574,6 +574,7 @@ def resolve_runtime_data(template, resources, snippet):
                                         resources=resources),
                       functools.partial(template.resolve_attributes,
                                         resources=resources),
+                      template.resolve_split,
                       template.resolve_select,
                       template.resolve_joins,
                       template.resolve_replace,
index 77ca03f2f10f6a345b5fec0367d818f7d68824d3..182b33d23449d318f082c7f2e854a2e84bd1e5a8 100644 (file)
@@ -281,6 +281,31 @@ class Template(collections.Mapping):
 
         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
     def resolve_replace(s):
         """
index d628d576f94eaad32d6865d0f89476033af408a8..8bba47346eceb4f98fd216926aadd351a3d6e8b1 100644 (file)
@@ -332,6 +332,24 @@ class TemplateTest(HeatTestCase):
         self.assertRaises(TypeError, parser.Template.resolve_joins,
                           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):
         snippet = {"Fn::Base64": "foobar"}
         # For now, the Base64 function just returns the original text, and