summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2020-10-13 14:53:47 +0000
committerGerrit Code Review <review@openstack.org>2020-10-13 14:53:47 +0000
commitff66d36dd5c351b8874e4776f6d8115c6bee96b7 (patch)
tree6f51cf9d355dc884b9515b7ec19d011aa05ab3c9
parent925216339eac31746feafa97b81490365921d7f1 (diff)
parent4aafceb3798df94abf236f7f3abb5dcf6c425bb3 (diff)
downloadheat-ff66d36dd5c351b8874e4776f6d8115c6bee96b7.tar.gz
Merge "Lazily cache parsed value of list/json parameters" into stable/ussuri
-rw-r--r--heat/engine/parameters.py39
-rw-r--r--heat/tests/test_parameters.py4
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))