diff --git a/heat/engine/resources/stack_resource.py b/heat/engine/resources/stack_resource.py index 381603133b..eb2d13cc69 100644 --- a/heat/engine/resources/stack_resource.py +++ b/heat/engine/resources/stack_resource.py @@ -297,6 +297,8 @@ class StackResource(resource.Resource): full_message = six.text_type(ex) if full_message.find('\n') > -1 and is_remote: message, msg_trace = full_message.split('\n', 1) + elif isinstance(ex, exception.HeatException): + message = ex.message else: message = full_message @@ -307,11 +309,12 @@ class StackResource(resource.Resource): # finish return - if isinstance(ex, exception.HeatException): - message = ex.message - local_ex = copy.copy(getattr(exception, ex_type)) - local_ex.msg_fmt = "%(message)s" - raise local_ex(message=message) + if hasattr(exception, ex_type): + local_ex = copy.copy(getattr(exception, ex_type)) + local_ex.msg_fmt = "%(message)s" + raise local_ex(message=message) + else: + raise exception.ResourceFailure(ex, self, 'remote') def check_create_complete(self, cookie=None): return self._check_status_complete(resource.Resource.CREATE) diff --git a/heat/tests/test_stack_resource.py b/heat/tests/test_stack_resource.py index 09a3f1917d..86eba770c4 100644 --- a/heat/tests/test_stack_resource.py +++ b/heat/tests/test_stack_resource.py @@ -16,6 +16,7 @@ import uuid import mock from oslo_config import cfg +from oslo_messaging import exceptions as msg_exceptions import six from heat.common import exception @@ -799,3 +800,22 @@ class WithTemplateTest(StackResourceBaseTest): rpcc.return_value.update_stack.assert_called_once_with( self.ctx, 'stack_identifier', self.empty_temp.t, child_env, {}, {'timeout_mins': self.timeout_mins}) + + +class RaiseLocalException(StackResourceBaseTest): + + def test_heat_exception(self): + local = exception.InvalidResourceType(message='test') + self.assertRaises(exception.InvalidResourceType, + self.parent_resource.raise_local_exception, local) + + def test_messaging_timeout(self): + local = msg_exceptions.MessagingTimeout('took too long') + self.assertRaises(exception.ResourceFailure, + self.parent_resource.raise_local_exception, local) + + def test_remote_heat_ex(self): + InvalidResourceType_Remote = exception.InvalidResourceType + local = InvalidResourceType_Remote(message='test') + self.assertRaises(exception.InvalidResourceType, + self.parent_resource.raise_local_exception, local)