diff options
author | Zuul <zuul@review.opendev.org> | 2020-10-13 14:53:47 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2020-10-13 14:53:47 +0000 |
commit | ff66d36dd5c351b8874e4776f6d8115c6bee96b7 (patch) | |
tree | 6f51cf9d355dc884b9515b7ec19d011aa05ab3c9 | |
parent | 925216339eac31746feafa97b81490365921d7f1 (diff) | |
parent | 4aafceb3798df94abf236f7f3abb5dcf6c425bb3 (diff) | |
download | heat-ff66d36dd5c351b8874e4776f6d8115c6bee96b7.tar.gz |
Merge "Lazily cache parsed value of list/json parameters" into stable/ussuri
-rw-r--r-- | heat/engine/parameters.py | 39 | ||||
-rw-r--r-- | heat/tests/test_parameters.py | 4 |
2 files changed, 21 insertions, 22 deletions
diff --git a/heat/engine/parameters.py b/heat/engine/parameters.py index 044773815..4aced043b 100644 --- a/heat/engine/parameters.py +++ b/heat/engine/parameters.py @@ -369,32 +369,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() - - 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) + self._parsed = None + + @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 @@ -436,11 +436,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 f438c37fb..9ced8e25e 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)) |