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
This commit is contained in:
Balazs Gibizer 2017-03-03 17:40:34 +01:00
parent 104c1da138
commit ed149bae81
2 changed files with 27 additions and 0 deletions

View File

@ -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):

View File

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