Use empty list for None values in repeat function
Atrributes would return `None` before the resource is created, hence resource validation would fail when using repeat function. Use empty list instead to avoid it. Change-Id: I93f65d6604944ccae40f65ef52754dcec69e9886 Closes-Bug: #1629899
This commit is contained in:
parent
80b2fb3155
commit
89526b5ea7
|
@ -878,15 +878,19 @@ class Repeat(function.Function):
|
|||
|
||||
def result(self):
|
||||
for_each = function.resolve(self._for_each)
|
||||
if not all(self._valid_arg(l) for l in for_each.values()):
|
||||
keys, lists = six.moves.zip(*for_each.items())
|
||||
|
||||
# use empty list for references(None) else validation will fail
|
||||
values = [[] if value is None else value for value in lists]
|
||||
|
||||
if not all(self._valid_arg(l) for l in values):
|
||||
raise TypeError(_('The values of the "for_each" argument to '
|
||||
'"%s" must be lists') % self.fn_name)
|
||||
|
||||
template = function.resolve(self._template)
|
||||
|
||||
keys, lists = six.moves.zip(*for_each.items())
|
||||
return [self._do_replacement(keys, replacements, template)
|
||||
for replacements in itertools.product(*lists)]
|
||||
for replacements in itertools.product(*values)]
|
||||
|
||||
|
||||
class RepeatWithMap(Repeat):
|
||||
|
|
|
@ -956,6 +956,14 @@ class HOTemplateTest(common.HeatTestCase):
|
|||
self.assertEqual('role1', resolved['role1'])
|
||||
self.assertEqual('role2', resolved['role2'])
|
||||
|
||||
def test_merge_containing_repeat_with_none(self):
|
||||
snippet = {'map_merge': {'repeat': {'template': {'ROLE': 'ROLE'},
|
||||
'for_each': {'ROLE': None}}}}
|
||||
tmpl = template.Template(hot_mitaka_tpl_empty)
|
||||
resolved = self.resolve(snippet, tmpl)
|
||||
|
||||
self.assertEqual({}, resolved)
|
||||
|
||||
def test_map_replace(self):
|
||||
snippet = {'map_replace': [{'f1': 'b1', 'f2': 'b2'},
|
||||
{'keys': {'f1': 'F1'},
|
||||
|
|
Loading…
Reference in New Issue