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())