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:
rabi 2016-10-04 14:30:22 +05:30
parent 80b2fb3155
commit 89526b5ea7
2 changed files with 15 additions and 3 deletions

View File

@ -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):

View File

@ -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'},