From 716471f37c04216c10546e30f72888a49a79c05e Mon Sep 17 00:00:00 2001 From: Angus Salkeld Date: Tue, 14 Jul 2015 11:52:42 +1000 Subject: [PATCH] Don't copy exception classes see: http://stackoverflow.com/questions/9541025/how-to-copy-a-python-class https://review.openstack.org/194487 This simplifies the method so it just re-raises local exceptions and if it is Remote, raises ResourceFailure. Closes-Bug: #1474153 Change-Id: I9c4dcadcbcf6abe6ff71dbcdccaae4706b684a83 --- heat/engine/resources/stack_resource.py | 29 ++++++++----------------- heat/tests/test_stack_resource.py | 8 ++++--- 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/heat/engine/resources/stack_resource.py b/heat/engine/resources/stack_resource.py index 92bf457112..91b4372fab 100644 --- a/heat/engine/resources/stack_resource.py +++ b/heat/engine/resources/stack_resource.py @@ -11,7 +11,6 @@ # License for the specific language governing permissions and limitations # under the License. -import copy import hashlib import json @@ -298,20 +297,6 @@ class StackResource(resource.Resource): self.resource_id_set(result['stack_id']) def raise_local_exception(self, ex): - ex_type = ex.__class__.__name__ - - is_remote = ex_type.endswith('_Remote') - if is_remote: - ex_type = ex_type[:-len('_Remote')] - - 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 - if (isinstance(ex, exception.ActionInProgress) and self.stack.action == self.stack.ROLLBACK): # The update was interrupted and the rollback is already in @@ -319,12 +304,16 @@ class StackResource(resource.Resource): # finish return - if hasattr(exception, ex_type): - local_ex = copy.copy(getattr(exception, ex_type)) - local_ex.msg_fmt = "%(message)s" - raise local_ex(message=message) + if not ex.__class__.__name__.endswith('_Remote'): + raise ex + + full_message = six.text_type(ex) + if full_message.find('\n') > -1: + message, msg_trace = full_message.split('\n', 1) else: - raise exception.ResourceFailure(ex, self, 'remote') + message = full_message + + raise exception.ResourceFailure(message, self, action=self.action) 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 ce9751994d..5a31aed001 100644 --- a/heat/tests/test_stack_resource.py +++ b/heat/tests/test_stack_resource.py @@ -868,11 +868,13 @@ class RaiseLocalException(StackResourceBaseTest): def test_messaging_timeout(self): local = msg_exceptions.MessagingTimeout('took too long') - self.assertRaises(exception.ResourceFailure, + self.assertRaises(msg_exceptions.MessagingTimeout, self.parent_resource.raise_local_exception, local) def test_remote_heat_ex(self): - InvalidResourceType_Remote = exception.InvalidResourceType + class InvalidResourceType_Remote(exception.InvalidResourceType): + pass + local = InvalidResourceType_Remote(message='test') - self.assertRaises(exception.InvalidResourceType, + self.assertRaises(exception.ResourceFailure, self.parent_resource.raise_local_exception, local)