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")
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')
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)
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:
if not failed:
try:
res.create()
- except Exception as ex:
+ except exception.ResourceFailure as ex:
logger.exception('create')
failed = True
else:
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)
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
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()
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):
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):
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)
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
resource = vol.Volume('DataVolume',
t['Resources']['DataVolume'],
stack)
- self.assertEqual(resource.create(), 'error')
+ self.assertRaises(exception.ResourceFailure, resource.create)
self.m.VerifyAll()
resource = vol.VolumeAttachment('MountPoint',
t['Resources']['MountPoint'],
stack)
- self.assertEqual(resource.create(), 'error')
+ self.assertRaises(exception.ResourceFailure, resource.create)
self.m.VerifyAll()