Not all exceptions from remote stacks are internal exceptions

The code in stack_resource assumed all exceptions raised in the
remote stack were from heat/common/exceptions.py but oslo messaging
also raises exceptions (timeout).

Change-Id: I91e1497ebf731a69fa86a574b42cccfe59430df1
Closes-bug: #1459837
This commit is contained in:
Angus Salkeld 2015-06-18 09:54:18 +10:00
parent 65b8c87e48
commit c1bb5fb384
2 changed files with 28 additions and 5 deletions

View File

@ -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
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)

View File

@ -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)