Bypass list length check for None values in repeat function

Attributes may return "None" before the resource is created,
so the length check for for_each lists in repeat function will fail.
Bybass the length check for the None list

Change-Id: Ida81060e62340b3ea37ba0fdd7443dc88ba6c5aa
Closes-bug: #1732934
This commit is contained in:
Khaled Qarout 2017-12-12 01:37:33 -05:00
parent d03514e3c8
commit 89643db005
2 changed files with 18 additions and 4 deletions

View File

@ -947,11 +947,15 @@ class Repeat(function.Function):
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]
value_lens = []
for arg in values:
self._valid_arg(arg)
value_lens.append(len(arg))
values = []
for value in lists:
if value is None:
values.append([])
else:
self._valid_arg(value)
values.append(value)
value_lens.append(len(value))
if not self._nested_loop:
if len(set(value_lens)) != 1:
raise ValueError(_('For %s, the length of for_each values '

View File

@ -1105,6 +1105,16 @@ class HOTemplateTest(common.HeatTestCase):
self.assertEqual({}, resolved)
def test_merge_containing_repeat_multi_list_no_nested_loop_with_none(self):
snippet = {'map_merge': {'repeat': {
'template': {'ROLE': 'ROLE', 'NAME': 'NAME'},
'for_each': {'ROLE': None, 'NAME': ['n1', 'n2']},
'permutations': 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'},