From 6241f91d153c23e0ffdccd2ff623cdb4b16538a6 Mon Sep 17 00:00:00 2001 From: Davanum Srinivas Date: Thu, 1 Nov 2012 09:53:00 -0400 Subject: [PATCH] Fix to include error message in instance faults port the patch in 1013350 from Bill Darbie (bill-darbie) into latest code base. incorporate one little comment from Russell about not specifying the default value twice added a test case Fixes bug 1013350 Change-Id: Id61f10bf2502fa57d2d26199ba9608e4566e8624 (cherry picked from commit ce41618c9c24a866ccac19461653eba3b8e6dca4) --- nova/compute/utils.py | 7 ++++++- nova/tests/compute/test_compute.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/nova/compute/utils.py b/nova/compute/utils.py index a8a0a654480..b3fef050d27 100644 --- a/nova/compute/utils.py +++ b/nova/compute/utils.py @@ -39,8 +39,13 @@ def add_instance_fault_from_exc(context, instance_uuid, fault, exc_info=None): """Adds the specified fault to the database.""" code = 500 + message = fault.__class__.__name__ + if hasattr(fault, "kwargs"): code = fault.kwargs.get('code', 500) + # get the message from the exception that was thrown + # if that does not exist, use the name of the exception class itself + message = fault.kwargs.get('value', message) details = unicode(fault) if exc_info and code == 500: @@ -50,7 +55,7 @@ def add_instance_fault_from_exc(context, instance_uuid, fault, exc_info=None): values = { 'instance_uuid': instance_uuid, 'code': code, - 'message': fault.__class__.__name__, + 'message': unicode(message), 'details': unicode(details), } db.instance_fault_create(context, values) diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py index e20f1c0fa97..a853849512d 100644 --- a/nova/tests/compute/test_compute.py +++ b/nova/tests/compute/test_compute.py @@ -2343,6 +2343,35 @@ def fake_db_fault_create(ctxt, values): NotImplementedError('test'), exc_info) + def test_add_instance_fault_with_remote_error(self): + exc_info = None + instance_uuid = str(utils.gen_uuid()) + + def fake_db_fault_create(ctxt, values): + self.assertTrue(values['details'].startswith('Remote error')) + self.assertTrue('raise rpc_common.RemoteError' + in values['details']) + del values['details'] + + expected = { + 'code': 500, + 'instance_uuid': instance_uuid, + 'message': 'My Test Message' + } + self.assertEquals(expected, values) + + try: + raise rpc_common.RemoteError('test', 'My Test Message') + except rpc_common.RemoteError as exc: + exc_info = sys.exc_info() + + self.stubs.Set(nova.db, 'instance_fault_create', fake_db_fault_create) + + ctxt = context.get_admin_context() + compute_utils.add_instance_fault_from_exc(ctxt, instance_uuid, + exc, + exc_info) + def test_add_instance_fault_user_error(self): exc_info = None instance_uuid = str(utils.gen_uuid())