diff --git a/heat/engine/function.py b/heat/engine/function.py index 5b1a63e636..0dac9f86a5 100644 --- a/heat/engine/function.py +++ b/heat/engine/function.py @@ -246,6 +246,8 @@ class Macro(Function): """ if isinstance(self.parsed, Function): return self.parsed.__reduce__() + if self.parsed is None: + return lambda x: None, (None,) return type(self.parsed), (self.parsed,) def _repr_result(self): diff --git a/heat/tests/test_hot.py b/heat/tests/test_hot.py index 08b10f1c6e..da5965fa4e 100644 --- a/heat/tests/test_hot.py +++ b/heat/tests/test_hot.py @@ -1413,6 +1413,15 @@ class HOTemplateTest(common.HeatTestCase): resolved = self.resolve(snippet, tmpl, stack) self.assertEqual('value_if_false', resolved) + def test_if_null_return(self): + snippet = {'if': [True, None, 'value_if_false']} + # when condition is true, if function resolve to value_if_true + tmpl = template.Template(hot_newton_tpl_empty) + stack = parser.Stack(utils.dummy_context(), + 'test_if_null_return', tmpl) + resolved = self.resolve(snippet, tmpl, stack) + self.assertIsNone(resolved) + def test_if_using_condition_function(self): tmpl_with_conditions = template_format.parse(''' heat_template_version: 2016-10-14 @@ -1429,6 +1438,54 @@ conditions: resolved = self.resolve(snippet, tmpl, stack) self.assertEqual('value_if_true', resolved) + def test_if_referenced_by_resource(self): + tmpl_with_conditions = template_format.parse(''' +heat_template_version: pike +conditions: + create_prod: False +resources: + AResource: + type: ResourceWithPropsType + properties: + Foo: + if: + - create_prod + - "one" + - "two" +''') + tmpl = template.Template(tmpl_with_conditions) + self.stack = parser.Stack(utils.dummy_context(), + 'test_if_referenced_by_resource', tmpl) + self.stack.store() + self.stack.create() + self.assertEqual((parser.Stack.CREATE, parser.Stack.COMPLETE), + self.stack.state) + self.assertEqual('two', self.stack['AResource'].properties['Foo']) + + def test_if_referenced_by_resource_null(self): + tmpl_with_conditions = template_format.parse(''' +heat_template_version: pike +conditions: + create_prod: True +resources: + AResource: + type: ResourceWithPropsType + properties: + Foo: + if: + - create_prod + - null + - "two" +''') + tmpl = template.Template(tmpl_with_conditions) + self.stack = parser.Stack(utils.dummy_context(), + 'test_if_referenced_by_resource_null', tmpl) + self.stack.store() + self.stack.create() + self.assertEqual((parser.Stack.CREATE, parser.Stack.COMPLETE), + self.stack.state) + self.assertEqual('', self.stack['AResource'].properties['Foo']) + def test_if_invalid_args(self): snippet = {'if': ['create_prod', 'one_value']} tmpl = template.Template(hot_newton_tpl_empty)