From 03b00ae02fede4ee7f347001f50baab1d79ffa0a Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Thu, 4 Jun 2020 12:10:09 +0100 Subject: [PATCH] Add reproducer for bug #1881455 The 'nova.compute.manager._reschedule_resize_or_reraise' function can end up calling 'from_exc_and_traceback' class method of the 'ExecutionPayload' versioned notification object via the following call stack: nova.compute.manager._reschedule_resize_or_reraise nova.compute.utils.notify_about_instance_action nova.compute._get_fault_and_priority_from_exc_and_tb nova.notification.objects.exception.ExceptionPayload.from_exc_and_traceback The 'from_exc_and_traceback' class method uses 'inspect.trace()' to get more information about the provided execution in order to report information such as module and function name of the function raising the exception in the notification. 'inspect.trace()' must be called inside the context of an exception handler otherwise it returns an empty list. However, we are using '_reschedule_resize_or_reraise' to re-raise a previously raised and captured exception, which means we're not executing from such a context. This results in the following warning: IndexError: list index out of range A future change will resolve this but for now, prove the issue. Change-Id: I5baaa698c2627a3438eb1d9990eb8091f37253ca Signed-off-by: Stephen Finucane Related-Bug: #1881455 --- .../notifications/objects/test_exception.py | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 nova/tests/unit/notifications/objects/test_exception.py diff --git a/nova/tests/unit/notifications/objects/test_exception.py b/nova/tests/unit/notifications/objects/test_exception.py new file mode 100644 index 000000000000..ae6f4485e487 --- /dev/null +++ b/nova/tests/unit/notifications/objects/test_exception.py @@ -0,0 +1,61 @@ +# Copyright 2020 Red Hat, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import sys +import traceback +import unittest + +from nova.notifications.objects import exception +from nova import test + + +class TestExceptionPayload(test.NoDBTestCase): + + # Failing due to bug #1881455 + @unittest.expectedFailure + def test_from_exc_and_traceback(self): + try: + raise Exception('foo') + except Exception: + exc_info = sys.exc_info() + tb = traceback.format_exc() + + payload = exception.ExceptionPayload.from_exc_and_traceback( + exc_info[1], tb) + + self.assertEqual( + 'nova.tests.unit.notifications.objects.test_exception', + payload.module_name, + ) + self.assertEqual( + 'test_from_exc_and_traceback', payload.function_name) + self.assertEqual('foo', payload.exception_message) + + def test_from_exc_and_traceback_nested(self): + try: + raise Exception('foo') + except Exception: + exc_info = sys.exc_info() + tb = traceback.format_exc() + + payload = exception.ExceptionPayload.from_exc_and_traceback( + exc_info[1], tb) + + self.assertEqual( + 'nova.tests.unit.notifications.objects.test_exception', + payload.module_name, + ) + self.assertEqual( + 'test_from_exc_and_traceback_nested', payload.function_name) + self.assertEqual('foo', payload.exception_message)