From ed149bae81cd6131b91404efc8f28efc0b0f1324 Mon Sep 17 00:00:00 2001 From: Balazs Gibizer <balazs.gibizer@ericsson.com> Date: Fri, 3 Mar 2017 17:40:34 +0100 Subject: [PATCH] Allow checking if notifier is enabled Generating the payload of a notificatiton might be expensive due to database access. This expensive step is unnecessary if the notification driver is set to noop because it means that the generated payload will not be sent. This patch makes it possible for the user of the notifier to check if the notifier will emit any notification before the payload is generated. Cinder already implemented similar behavior in I77f655d3ef90088ce71304da5d4ea7b543991e90 and nova also plans to do it in I3e6741d59df49e1e58409314008c2ed609fdedc1 Change-Id: Ib992f5c20fef85224fb00823e1d8d9c6cff19bec --- oslo_messaging/notify/notifier.py | 8 ++++++++ oslo_messaging/tests/notify/test_notifier.py | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/oslo_messaging/notify/notifier.py b/oslo_messaging/notify/notifier.py index cb23aef0a..caf04aba4 100644 --- a/oslo_messaging/notify/notifier.py +++ b/oslo_messaging/notify/notifier.py @@ -415,6 +415,14 @@ class Notifier(object): """ self._notify(ctxt, event_type, payload, 'SAMPLE') + def is_enabled(self): + """Check if the notifier will emit notifications anywhere. + + :return: false if the driver of the notifier is set only to noop, true + otherwise + """ + return self._driver_mgr.names() != ['noop'] + class _SubNotifier(Notifier): diff --git a/oslo_messaging/tests/notify/test_notifier.py b/oslo_messaging/tests/notify/test_notifier.py index d63198030..31e62472d 100755 --- a/oslo_messaging/tests/notify/test_notifier.py +++ b/oslo_messaging/tests/notify/test_notifier.py @@ -226,6 +226,8 @@ class TestMessagingNotifier(test_utils.BaseTestCase): uuid.uuid4.assert_called_once_with() transport._send_notification.assert_has_calls(calls, any_order=True) + self.assertTrue(notifier.is_enabled()) + TestMessagingNotifier.generate_scenarios() @@ -337,6 +339,8 @@ class TestLogNotifier(test_utils.BaseTestCase): 'notification.test.notify') logger.info.assert_called_once_with(JsonMessageMatcher(message)) + self.assertTrue(notifier.is_enabled()) + def test_sample_priority(self): # Ensure logger drops sample-level notifications. driver = _impl_log.LogDriver(None, None, None) @@ -379,6 +383,8 @@ class TestRoutingNotifier(test_utils.BaseTestCase): self.notifier = oslo_messaging.Notifier(transport) self.router = self.notifier._driver_mgr['routing'].obj + self.assertTrue(self.notifier.is_enabled()) + def _fake_extension_manager(self, ext): return extension.ExtensionManager.make_test_instance( [extension.Extension('test', None, None, ext), ]) @@ -593,3 +599,16 @@ group_1: {}, mock.ANY, 'INFO', None) rpc2_driver.notify.assert_called_once_with( {}, mock.ANY, 'INFO', None) + + +class TestNoOpNotifier(test_utils.BaseTestCase): + + def test_notifier(self): + self.config(driver=['noop'], + group='oslo_messaging_notifications') + + transport = _FakeTransport(self.conf) + + notifier = oslo_messaging.Notifier(transport, 'test.localhost') + + self.assertFalse(notifier.is_enabled())