]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Add error handling to property value resolution
authorRandall Burt <randall.burt@rackspace.com>
Fri, 13 Sep 2013 01:07:00 +0000 (20:07 -0500)
committerRandall Burt <randall.burt@rackspace.com>
Fri, 13 Sep 2013 01:37:40 +0000 (20:37 -0500)
Fixes bug 1224746

Change-Id: I990de0159e0fb49e52afdaab546f8d74372422bf

heat/engine/properties.py
heat/tests/test_properties.py

index 19e97271d072460741ebaf4ed899c36b3107e7b4..ac5be5b40b308d801666f503c46274fb411279d4 100644 (file)
@@ -683,10 +683,12 @@ class Properties(collections.Mapping):
         prop = self.props[key]
 
         if key in self.data:
-            value = self.resolve(self.data[key])
             try:
+                value = self.resolve(self.data[key])
                 return prop.validate_data(value)
-            except ValueError as e:
+            # the resolver function could raise any number of exceptions,
+            # so handle this generically
+            except Exception as e:
                 raise ValueError(self.error_prefix + '%s %s' % (key, str(e)))
         elif prop.has_default():
             return prop.default()
index a228c56cd2117cc64bd79b76f1f45628956e707c..faab2dbc77297b1bb703dadc719b5e5d40590437 100644 (file)
@@ -952,7 +952,7 @@ class PropertyTest(testtools.TestCase):
     def test_list_schema_int_bad_data(self):
         list_schema = {'Type': 'Integer'}
         p = properties.Property({'Type': 'List', 'Schema': list_schema})
-        self.assertRaises(TypeError, p.validate_data, [42, 'fish'])
+        self.assertRaises(ValueError, p.validate_data, [42, 'fish'])
 
 
 class PropertiesTest(testtools.TestCase):
@@ -986,7 +986,7 @@ class PropertiesTest(testtools.TestCase):
         self.assertRaises(ValueError, self.props.get, 'required_int')
 
     def test_integer_bad(self):
-        self.assertRaises(TypeError, self.props.get, 'bad_int')
+        self.assertRaises(ValueError, self.props.get, 'bad_int')
 
     def test_missing(self):
         self.assertEqual(self.props['missing'], None)
@@ -1076,6 +1076,16 @@ class PropertiesTest(testtools.TestCase):
         props = properties.Properties(schema, {'foo': None})
         self.assertEqual(['one', 'two'], props['foo'])
 
+    def test_bad_resolver(self):
+        schema = {'foo': {'Type': 'String', 'Default': 'bar'}}
+
+        def bad_resolver(prop):
+            raise Exception('resolution failed!')
+
+        props = properties.Properties(schema, {'foo': 'baz'}, bad_resolver)
+        err = self.assertRaises(ValueError, props.get, 'foo')
+        self.assertEqual('foo resolution failed!', str(err))
+
     def test_schema_from_params(self):
         params_snippet = {
             "DBUsername": {