From d9099ee332b7dace9f0b73c8131ccd960cff5eaa Mon Sep 17 00:00:00 2001 From: Andrew Bogott Date: Thu, 3 May 2012 02:38:48 -0500 Subject: Find context arg by type rather than by name. This requires changes to all the tests that were passing in a string as a bogus context; that seems like an improvement. Change-Id: Ib8fc83cbda25a1cfa8794b72dc13f666549ef892 --- nova/exception.py | 24 +++++++++++------------- nova/tests/test_exception.py | 6 ++++-- nova/tests/test_notifier.py | 25 +++++++++++++++---------- 3 files changed, 30 insertions(+), 25 deletions(-) diff --git a/nova/exception.py b/nova/exception.py index df2f79e3d..87eaca243 100644 --- a/nova/exception.py +++ b/nova/exception.py @@ -25,7 +25,7 @@ SHOULD include dedicated exception logging. """ import functools -import inspect +import itertools import sys import webob.exc @@ -1073,19 +1073,17 @@ class CouldNotFetchImage(NovaException): def get_context_from_function_and_args(function, args, kwargs): - """Find an arg named 'context' and return the value. + """Find an arg of type RequestContext and return it. This is useful in a couple of decorators where we don't know much about the function we're wrapping. """ - context = None - if 'context' in kwargs.keys(): - context = kwargs['context'] - else: - (iargs, _iva, _ikw, _idf) = inspect.getargspec(function) - if 'context' in iargs: - index = iargs.index('context') - if len(args) > index: - context = args[index] - - return context + + # import here to avoid circularity: + from nova import context + + for arg in itertools.chain(kwargs.values(), args): + if isinstance(arg, context.RequestContext): + return arg + + return None diff --git a/nova/tests/test_exception.py b/nova/tests/test_exception.py index 34f4f1829..2d8b2c391 100644 --- a/nova/tests/test_exception.py +++ b/nova/tests/test_exception.py @@ -18,6 +18,7 @@ from nova import test from nova import exception +from nova import context class EC2APIErrorTestCase(test.TestCase): @@ -82,12 +83,13 @@ class WrapExceptionTestCase(test.TestCase): notifier = FakeNotifier() wrapped = exception.wrap_exception(notifier, "publisher", "event", "level") + ctxt = context.get_admin_context() self.assertRaises(test.TestingException, - wrapped(bad_function_exception), context="context") + wrapped(bad_function_exception), context=ctxt) self.assertEquals(notifier.provided_publisher, "publisher") self.assertEquals(notifier.provided_event, "event") self.assertEquals(notifier.provided_priority, "level") - self.assertEquals(notifier.provided_context, "context") + self.assertEquals(notifier.provided_context, ctxt) for key in ['exception', 'args']: self.assertTrue(key in notifier.provided_payload.keys()) diff --git a/nova/tests/test_notifier.py b/nova/tests/test_notifier.py index c0d49163c..b558763a9 100644 --- a/nova/tests/test_notifier.py +++ b/nova/tests/test_notifier.py @@ -14,6 +14,7 @@ # under the License. import nova +from nova import context from nova import flags from nova import log import nova.notifier.no_op_notifier @@ -21,6 +22,10 @@ from nova.notifier import api as notifier_api from nova import test +ctxt = context.get_admin_context() +ctxt2 = context.get_admin_context() + + class NotifierTestCase(test.TestCase): """Test case for notifications""" def setUp(self): @@ -36,7 +41,7 @@ class NotifierTestCase(test.TestCase): self.stubs.Set(nova.notifier.no_op_notifier, 'notify', mock_notify) - notifier_api.notify('contextarg', 'publisher_id', 'event_type', + notifier_api.notify(ctxt, 'publisher_id', 'event_type', nova.notifier.api.WARN, dict(a=3)) self.assertEqual(self.notify_called, True) @@ -53,11 +58,11 @@ class NotifierTestCase(test.TestCase): self.assertEqual(message[k], v) self.assertTrue(len(message['message_id']) > 0) self.assertTrue(len(message['timestamp']) > 0) - self.assertEqual(context, 'contextarg') + self.assertEqual(context, ctxt) self.stubs.Set(nova.notifier.no_op_notifier, 'notify', message_assert) - notifier_api.notify('contextarg', 'publisher_id', 'event_type', + notifier_api.notify(ctxt, 'publisher_id', 'event_type', nova.notifier.api.WARN, dict(a=3)) def test_send_rabbit_notification(self): @@ -69,14 +74,14 @@ class NotifierTestCase(test.TestCase): self.mock_notify = True self.stubs.Set(nova.rpc, 'notify', mock_notify) - notifier_api.notify('contextarg', 'publisher_id', 'event_type', + notifier_api.notify(ctxt, 'publisher_id', 'event_type', nova.notifier.api.WARN, dict(a=3)) self.assertEqual(self.mock_notify, True) def test_invalid_priority(self): self.assertRaises(nova.notifier.api.BadPriorityException, - notifier_api.notify, 'contextarg', 'publisher_id', + notifier_api.notify, ctxt, 'publisher_id', 'event_type', 'not a priority', dict(a=3)) def test_rabbit_priority_queue(self): @@ -92,7 +97,7 @@ class NotifierTestCase(test.TestCase): self.test_topic = topic self.stubs.Set(nova.rpc, 'notify', mock_notify) - notifier_api.notify('contextarg', 'publisher_id', + notifier_api.notify(ctxt, 'publisher_id', 'event_type', 'DEBUG', dict(a=3)) self.assertEqual(self.test_topic, 'testnotify.debug') @@ -161,17 +166,17 @@ class NotifierTestCase(test.TestCase): mock_notify) # Test positional context - self.assertEqual(3, example_api(1, 2, "contextname")) + self.assertEqual(3, example_api(1, 2, ctxt)) self.assertEqual(self.notify_called, True) - self.assertEqual(self.context_arg, "contextname") + self.assertEqual(self.context_arg, ctxt) self.notify_called = False self.context_arg = None # Test named context - self.assertEqual(3, example_api2(1, 2, context="contextname2")) + self.assertEqual(3, example_api2(1, 2, context=ctxt2)) self.assertEqual(self.notify_called, True) - self.assertEqual(self.context_arg, "contextname2") + self.assertEqual(self.context_arg, ctxt2) # Test missing context self.assertEqual(3, example_api2(1, 2, bananas="delicious")) -- cgit