]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Propagate creation errors with exceptions
authorZane Bitter <zbitter@redhat.com>
Tue, 23 Apr 2013 11:36:47 +0000 (13:36 +0200)
committerZane Bitter <zbitter@redhat.com>
Tue, 23 Apr 2013 11:36:51 +0000 (13:36 +0200)
Change-Id: I567f1901e1203930d282620112368ac32440b9ed

heat/common/exception.py
heat/engine/parser.py
heat/engine/resource.py
heat/engine/resources/autoscaling.py
heat/tests/test_instance_group.py
heat/tests/test_resource.py
heat/tests/test_user.py
heat/tests/test_volume.py

index 875b4287a2264549ac3e2d93b2e6fce367c0d497..1e2f85e51ae0ba8dda7a302ffe342cfc021d87dd 100644 (file)
@@ -246,5 +246,17 @@ class WatchRuleNotFound(OpenstackException):
     message = _("The Watch Rule (%(watch_name)s) could not be found.")
 
 
+class ResourceFailure(OpenstackException):
+    message = _("%(exc_type)s: %(message)s")
+
+    def __init__(self, exception):
+        if isinstance(exception, ResourceFailure):
+            exception = getattr(exception, 'exc', exception)
+        self.exc = exception
+        exc_type = type(exception).__name__
+        super(ResourceFailure, self).__init__(exc_type=exc_type,
+                                              message=str(exception))
+
+
 class NestedResourceFailure(OpenstackException):
     message = _("%(message)s")
index 203c5bc8649164cd822c51df9aca34fdfee73fd5..257f3d11d8f7311481311bcb255ebfd5d3eaebdb 100644 (file)
@@ -275,12 +275,12 @@ class Stack(object):
             try:
                 for res in self:
                     if stack_status != self.CREATE_FAILED:
-                        result = res.create()
-                        if result:
+                        try:
+                            res.create()
+                        except exception.ResourceFailure as ex:
                             stack_status = self.CREATE_FAILED
                             reason = 'Resource %s failed with: %s' % (str(res),
-                                                                      result)
-
+                                                                      str(ex))
                     else:
                         res.state_set(res.CREATE_FAILED,
                                       'Stack creation aborted')
@@ -366,10 +366,11 @@ class Stack(object):
                         self[res.name] = res
                         self.dependencies = self._get_dependencies(
                             self.resources.itervalues())
-                        result = self[res.name].create()
-                        if result:
+                        try:
+                            self[res.name].create()
+                        except exception.ResourceFailure as ex:
                             logger.error("Failed to add %s : %s" %
-                                         (res.name, result))
+                                         (res.name, str(ex)))
                             raise exception.ResourceUpdateFailed(
                                 resource_name=res.name)
 
@@ -418,10 +419,11 @@ class Stack(object):
                                 self[res.name] = res
                                 self.dependencies = self._get_dependencies(
                                     self.resources.itervalues())
-                                result = self[res.name].create()
-                                if result:
+                                try:
+                                    self[res.name].create()
+                                except exception.ResourceFailure as ex:
                                     logger.error("Failed to create %s : %s" %
-                                                 (res.name, result))
+                                                 (res.name, str(ex)))
                                     raise exception.ResourceUpdateFailed(
                                         resource_name=res.name)
                         else:
@@ -541,7 +543,7 @@ class Stack(object):
             if not failed:
                 try:
                     res.create()
-                except Exception as ex:
+                except exception.ResourceFailure as ex:
                     logger.exception('create')
                     failed = True
             else:
index bd63cf5b0f693807787e1e59912df54c5c739147..3a60c0a31a4fe2839cb252d6b5bfc64b6f518227 100644 (file)
@@ -324,8 +324,9 @@ class Resource(object):
             raise
         except Exception as ex:
             logger.exception('create %s', str(self))
-            self.state_set(self.CREATE_FAILED, str(ex))
-            return str(ex) or "Error : %s" % type(ex)
+            failure = exception.ResourceFailure(ex)
+            self.state_set(self.CREATE_FAILED, str(failure))
+            raise failure
         else:
             self.state_set(self.CREATE_COMPLETE)
 
index ec716d542bc4414152868348f2836ad08e10d48b..ed1ca5c5dec5d1fa756de01d6044cae01a1119ec 100644 (file)
@@ -192,9 +192,11 @@ class InstanceGroup(resource.Resource):
             self.resource_id_set(','.join(inst_list))
             logger.info('Creating Autoscaling instance %s' % name)
 
-            error_str = inst.create()
-            if raise_on_error and error_str is not None:
-                raise exception.NestedResourceFailure(message=error_str)
+            try:
+                inst.create()
+            except exception.ResourceFailure as ex:
+                if raise_on_error:
+                    raise
 
             return inst
 
index bcf4faa2950b8f1e46ff4e46e8ceda5be880286b..ecd3c87b9043181b0fcf84588e1d0a71c5a1cee4 100644 (file)
@@ -121,7 +121,7 @@ class InstanceGroupTest(unittest.TestCase):
 
         self.m.ReplayAll()
 
-        self.assertNotEqual(resource.create(), None)
+        self.assertRaises(exception.ResourceFailure, resource.create)
         self.assertEqual(asc.InstanceGroup.CREATE_FAILED, resource.state)
 
         self.m.VerifyAll()
index ced23c920a3f932028c327ff8292c3d989b0a1ce..fc38b1b0ab6c22d0e00e75d2023bd539777a4155 100644 (file)
@@ -242,7 +242,7 @@ class ResourceTest(unittest.TestCase):
         res = generic_rsrc.GenericResource(rname, tmpl, self.stack)
 
         estr = 'Property error : test_resource: Property Foo not assigned'
-        self.assertEqual(estr, res.create())
+        self.assertRaises(exception.ResourceFailure, res.create)
         self.assertEqual(res.CREATE_FAILED, res.state)
 
     def test_create_fail_prop_typo(self):
@@ -255,7 +255,7 @@ class ResourceTest(unittest.TestCase):
         res = generic_rsrc.GenericResource(rname, tmpl, self.stack)
 
         estr = 'Property error : test_resource: Property Foo not assigned'
-        self.assertEqual(estr, res.create())
+        self.assertRaises(exception.ResourceFailure, res.create)
         self.assertEqual(res.CREATE_FAILED, res.state)
 
     def test_update_ok(self):
index 52fc616364df62c6d4349935a05d0e5f47928154..a81ffbafabcad1dff25b0d8c64400d853e2d1c04 100644 (file)
@@ -329,8 +329,7 @@ class AccessKeyTest(unittest.TestCase):
         resource = user.AccessKey('HostKeys',
                                   t['Resources']['HostKeys'],
                                   stack)
-        self.assertEqual('could not find user test_stack.NoExist',
-                         resource.create())
+        self.assertRaises(exception.ResourceFailure, resource.create)
         self.assertEqual(user.AccessKey.CREATE_FAILED,
                          resource.state)
 
index 28c1fef3aa6f089306377a76deff6f189c4ccfa0..079d1e93ae9b1862f3374b9ac630d6c1c2df1ac3 100644 (file)
@@ -22,6 +22,7 @@ import unittest
 from nose.plugins.attrib import attr
 
 from heat.common import context
+from heat.common import exception
 from heat.common import template_format
 from heat.engine import parser
 from heat.engine.resources import volume as vol
@@ -147,7 +148,7 @@ class VolumeTest(unittest.TestCase):
         resource = vol.Volume('DataVolume',
                               t['Resources']['DataVolume'],
                               stack)
-        self.assertEqual(resource.create(), 'error')
+        self.assertRaises(exception.ResourceFailure, resource.create)
 
         self.m.VerifyAll()
 
@@ -184,7 +185,7 @@ class VolumeTest(unittest.TestCase):
         resource = vol.VolumeAttachment('MountPoint',
                                         t['Resources']['MountPoint'],
                                         stack)
-        self.assertEqual(resource.create(), 'error')
+        self.assertRaises(exception.ResourceFailure, resource.create)
 
         self.m.VerifyAll()