summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhuangtianhua <huangtianhua@huawei.com>2016-10-17 18:45:19 +0800
committerhuangtianhua <huangtianhua@huawei.com>2016-11-14 02:02:47 +0000
commitd7a81fe64ba0a5a9bcc9eaf5cca82c9d89f62709 (patch)
tree013d6047542e2815b6e8decc14e01cfa1a3876d1
parente0961f0ec4dd6676f7517c9905383381fd0737e3 (diff)
downloadheat-d7a81fe64ba0a5a9bcc9eaf5cca82c9d89f62709.tar.gz
Raise TypeError when a bool property has int value
Change-Id: I0658964f1edb6e28c879b228f8363245edd3170f Closes-Bug: #1634096 (cherry picked from commit 4794cf240cf11cae4ac924a2ae0b381d0832b9ea)
-rw-r--r--heat/engine/properties.py15
-rw-r--r--heat/tests/test_properties.py6
2 files changed, 16 insertions, 5 deletions
diff --git a/heat/engine/properties.py b/heat/engine/properties.py
index 92d4ac4da..87a2e73ad 100644
--- a/heat/engine/properties.py
+++ b/heat/engine/properties.py
@@ -313,15 +313,22 @@ class Property(object):
validate)]
def _get_bool(self, value):
+ """Get value for boolean property.
+
+ Explicitly checking for bool, or string with lower value
+ "true" or "false", to avoid integer values.
+ """
if value is None:
value = self.has_default() and self.default() or False
if isinstance(value, bool):
return value
- normalised = value.lower()
- if normalised not in ['true', 'false']:
- raise ValueError(_('"%s" is not a valid boolean') % normalised)
+ if isinstance(value, six.string_types):
+ normalised = value.lower()
+ if normalised not in ['true', 'false']:
+ raise ValueError(_('"%s" is not a valid boolean') % normalised)
+ return normalised == 'true'
- return normalised == 'true'
+ raise TypeError(_('"%s" is not a valid boolean') % value)
def get_value(self, value, validate=False, template=None):
"""Get value from raw value and sanitize according to data type."""
diff --git a/heat/tests/test_properties.py b/heat/tests/test_properties.py
index 09c8c39fa..ad33b1e82 100644
--- a/heat/tests/test_properties.py
+++ b/heat/tests/test_properties.py
@@ -887,10 +887,14 @@ class PropertyTest(common.HeatTestCase):
self.assertIs(False, p.get_value('false'))
self.assertIs(False, p.get_value(False))
- def test_boolean_invalid(self):
+ def test_boolean_invalid_string(self):
p = properties.Property({'Type': 'Boolean'})
self.assertRaises(ValueError, p.get_value, 'fish')
+ def test_boolean_invalid_int(self):
+ p = properties.Property({'Type': 'Boolean'})
+ self.assertRaises(TypeError, p.get_value, 5)
+
def test_list_string(self):
p = properties.Property({'Type': 'List'})
self.assertRaises(TypeError, p.get_value, 'foo')