diff --git a/heat/engine/parameters.py b/heat/engine/parameters.py index 168ac3e59c..ffdb1e7c02 100644 --- a/heat/engine/parameters.py +++ b/heat/engine/parameters.py @@ -372,32 +372,32 @@ class StringParam(Parameter): class ParsedParameter(Parameter): """A template parameter with cached parsed value.""" - __slots__ = ('parsed',) + __slots__ = ('_parsed',) def __init__(self, name, schema, value=None): super(ParsedParameter, self).__init__(name, schema, value) - self._update_parsed() + self._parsed = None - def set_default(self, value): - super(ParsedParameter, self).set_default(value) - self._update_parsed() - - def _update_parsed(self): - if self.has_value(): - if self.user_value is not None: - self.parsed = self.parse(self.user_value) + @property + def parsed(self): + if self._parsed is None: + if self.has_value(): + if self.user_value is not None: + self._parsed = self.parse(self.user_value) + else: + self._parsed = self.parse(self.default()) else: - self.parsed = self.parse(self.default()) + self._parsed = self.default_parsed() + return self._parsed class CommaDelimitedListParam(ParsedParameter, collections.Sequence): """A template parameter of type "CommaDelimitedList".""" - __slots__ = ('parsed',) + __slots__ = tuple() - def __init__(self, name, schema, value=None): - self.parsed = [] - super(CommaDelimitedListParam, self).__init__(name, schema, value) + def default_parsed(self): + return [] def parse(self, value): # only parse when value is not already a list @@ -439,11 +439,10 @@ class CommaDelimitedListParam(ParsedParameter, collections.Sequence): class JsonParam(ParsedParameter): """A template parameter who's value is map or list.""" - __slots__ = ('parsed',) + __slots__ = tuple() - def __init__(self, name, schema, value=None): - self.parsed = {} - super(JsonParam, self).__init__(name, schema, value) + def default_parsed(self): + return {} def parse(self, value): try: diff --git a/heat/tests/test_parameters.py b/heat/tests/test_parameters.py index f438c37fba..9ced8e25eb 100644 --- a/heat/tests/test_parameters.py +++ b/heat/tests/test_parameters.py @@ -380,7 +380,7 @@ class ParameterTestSpecific(common.HeatTestCase): schema = {'Type': 'Json', 'ConstraintDescription': 'wibble'} val = {"foo": "bar", "not_json": len} - err = self.assertRaises(ValueError, + err = self.assertRaises(exception.StackValidationFailed, new_parameter, 'p', schema, val) self.assertIn('Value must be valid JSON', six.text_type(err)) @@ -398,7 +398,7 @@ class ParameterTestSpecific(common.HeatTestCase): schema = {'Type': 'Json', 'ConstraintDescription': 'wibble'} val = "I am not a map" - err = self.assertRaises(ValueError, + err = self.assertRaises(exception.StackValidationFailed, new_parameter, 'p', schema, val) self.assertIn('Value must be valid JSON', six.text_type(err))