From 33c1010c3281804456a22b769c4bac5ac6a7cca1 Mon Sep 17 00:00:00 2001 From: Davanum Srinivas Date: Tue, 24 Nov 2015 19:56:16 -0500 Subject: [PATCH] Option group for notifications In change Ief6f95ea906bfd95b3218a930c9db5d8a764beb9, we decoupled RPC and Notifications a bit. We should take another step and separate out the options for notifications into its own group. Change-Id: Ib51e2839f9035d0cc0e3f459939d9f9003a8c810 --- doc/source/FAQ.rst | 9 ++-- oslo_messaging/conffixture.py | 4 +- oslo_messaging/notify/_impl_routing.py | 8 ++-- oslo_messaging/notify/log_handler.py | 3 +- oslo_messaging/notify/notifier.py | 43 ++++++++++++------- .../tests/functional/notify/test_logger.py | 5 ++- .../tests/notify/test_log_handler.py | 3 +- oslo_messaging/tests/notify/test_logger.py | 3 +- oslo_messaging/tests/notify/test_notifier.py | 22 ++++++---- tools/simulator.py | 4 +- 10 files changed, 65 insertions(+), 39 deletions(-) diff --git a/doc/source/FAQ.rst b/doc/source/FAQ.rst index ebb6fe3c2..2a67bba8c 100644 --- a/doc/source/FAQ.rst +++ b/doc/source/FAQ.rst @@ -6,7 +6,8 @@ I don't need notifications on the message bus. How do I disable them? ===================================================================== Notification messages can be disabled using the ``noop`` notify -driver. Set ``notification_driver = noop`` in your configuration file. +driver. Set ``driver = noop`` in your configuration file under the +[oslo_messaging_notifications] section. Why does the notification publisher create queues, too? Shouldn't the subscriber do that? ========================================================================================= @@ -26,9 +27,9 @@ notification "level". The default topic is ``notifications``, so an info-level notification is published to the topic ``notifications.info``. A subscriber queue of the same name is created automatically for each of these topics. To change the queue names, -change the notification topic using the ``notification_topics`` -configuration option. The option accepts a list of values, so it is -possible to publish to multiple topics. +change the notification topic using the ``topics`` +configuration option in ``[oslo_messaging_notifications]``. The option +accepts a list of values, so it is possible to publish to multiple topics. What are the other choices of notification drivers available? ============================================================= diff --git a/oslo_messaging/conffixture.py b/oslo_messaging/conffixture.py index 35b6e2a27..2f53d3f9e 100644 --- a/oslo_messaging/conffixture.py +++ b/oslo_messaging/conffixture.py @@ -66,7 +66,9 @@ class ConfFixture(fixtures.Fixture): _import_opts(self.conf, 'oslo_messaging.rpc.client', '_client_opts') _import_opts(self.conf, 'oslo_messaging.transport', '_transport_opts') _import_opts(self.conf, - 'oslo_messaging.notify.notifier', '_notifier_opts') + 'oslo_messaging.notify.notifier', + '_notifier_opts', + 'oslo_messaging_notifications') def setUp(self): super(ConfFixture, self).setUp() diff --git a/oslo_messaging/notify/_impl_routing.py b/oslo_messaging/notify/_impl_routing.py index 6c5fd18d2..3e89f8770 100644 --- a/oslo_messaging/notify/_impl_routing.py +++ b/oslo_messaging/notify/_impl_routing.py @@ -27,11 +27,13 @@ from oslo_messaging.notify import notifier LOG = logging.getLogger(__name__) -router_config = cfg.StrOpt('routing_notifier_config', default='', +router_config = cfg.StrOpt('routing_config', default='', + deprecated_group='DEFAULT', + deprecated_name='routing_notifier_config', help='RoutingNotifier configuration file location.') CONF = cfg.CONF -CONF.register_opt(router_config) +CONF.register_opt(router_config, group='oslo_messaging_notifications') class RoutingDriver(notifier.Driver): @@ -56,7 +58,7 @@ class RoutingDriver(notifier.Driver): """One-time load of notifier config file.""" self.routing_groups = {} self.used_drivers = set() - filename = CONF.routing_notifier_config + filename = CONF.oslo_messaging_notifications.routing_config if not filename: return diff --git a/oslo_messaging/notify/log_handler.py b/oslo_messaging/notify/log_handler.py index 7fefb9b29..8dc8454b5 100644 --- a/oslo_messaging/notify/log_handler.py +++ b/oslo_messaging/notify/log_handler.py @@ -27,8 +27,9 @@ class LoggingErrorNotificationHandler(logging.Handler): publisher_id='error.publisher') def emit(self, record): + conf = self._transport.conf # NOTE(bnemec): Notifier registers this opt with the transport. - if ('log' in self._transport.conf.notification_driver): + if ('log' in conf.oslo_messaging_notifications.driver): # NOTE(lbragstad): If we detect that log is one of the # notification drivers, then return. This protects from infinite # recursion where something bad happens, it gets logged, the log diff --git a/oslo_messaging/notify/notifier.py b/oslo_messaging/notify/notifier.py index dec25b16f..fb841644f 100644 --- a/oslo_messaging/notify/notifier.py +++ b/oslo_messaging/notify/notifier.py @@ -28,19 +28,27 @@ from oslo_messaging import serializer as msg_serializer from oslo_messaging import transport as msg_transport _notifier_opts = [ - cfg.MultiStrOpt('notification_driver', + cfg.MultiStrOpt('driver', default=[], + deprecated_name='notification_driver', + deprecated_group='DEFAULT', help='The Drivers(s) to handle sending notifications. ' 'Possible values are messaging, messagingv2, ' 'routing, log, test, noop'), - cfg.StrOpt('notification_transport_url', + cfg.StrOpt('transport_url', + deprecated_name='notification_transport_url', + deprecated_group='DEFAULT', help='A URL representing the messaging driver to use for ' 'notifications. If not set, we fall back to the same ' 'configuration used for RPC.'), - cfg.ListOpt('notification_topics', + cfg.ListOpt('topics', default=['notifications', ], - deprecated_name='topics', - deprecated_group='rpc_notifier2', + deprecated_opts=[ + cfg.DeprecatedOpt('topics', + group='rpc_notifier2'), + cfg.DeprecatedOpt('notification_topics', + group='DEFAULT') + ], help='AMQP topic used for OpenStack notifications.'), ] @@ -83,8 +91,9 @@ class Driver(object): def get_notification_transport(conf, url=None, allowed_remote_exmods=None, aliases=None): if url is None: - conf.register_opts(_notifier_opts) - url = conf.notification_transport_url + conf.register_opts(_notifier_opts, + group='oslo_messaging_notifications') + url = conf.oslo_messaging_notifications.transport_url return msg_transport.get_transport(conf, url, allowed_remote_exmods, aliases) @@ -111,9 +120,9 @@ class Notifier(object): notifier = messaging.Notifier(get_notification_transport(CONF), 'compute') - and notifications are sent via drivers chosen with the notification_driver - config option and on the topics chosen with the notification_topics config - option. + and notifications are sent via drivers chosen with the driver + config option and on the topics chosen with the topics config + option in [oslo_messaging_notifications] section. Alternatively, a Notifier object can be instantiated with a specific driver or topic:: @@ -154,24 +163,26 @@ class Notifier(object): N means N retries :type retry: int """ - transport.conf.register_opts(_notifier_opts) + conf = transport.conf + conf.register_opts(_notifier_opts, + group='oslo_messaging_notifications') self.transport = transport self.publisher_id = publisher_id self.retry = retry - self._driver_names = ([driver] if driver is not None - else transport.conf.notification_driver) + self._driver_names = ([driver] if driver is not None else + conf.oslo_messaging_notifications.driver) - self._topics = ([topic] if topic is not None - else transport.conf.notification_topics) + self._topics = ([topic] if topic is not None else + conf.oslo_messaging_notifications.topics) self._serializer = serializer or msg_serializer.NoOpSerializer() self._driver_mgr = named.NamedExtensionManager( 'oslo.messaging.notify.drivers', names=self._driver_names, invoke_on_load=True, - invoke_args=[transport.conf], + invoke_args=[conf], invoke_kwds={ 'topics': self._topics, 'transport': self.transport, diff --git a/oslo_messaging/tests/functional/notify/test_logger.py b/oslo_messaging/tests/functional/notify/test_logger.py index ad30e8850..a7f580bc3 100644 --- a/oslo_messaging/tests/functional/notify/test_logger.py +++ b/oslo_messaging/tests/functional/notify/test_logger.py @@ -51,8 +51,9 @@ class LoggingNotificationHandlerTestCase(utils.SkipIfNoTransportURL): # NOTE(gtt): Using different topic to make tests run in parallel topic = 'test_logging_%s_driver_%s' % (self.priority, self.driver) - self.conf.notification_driver = [self.driver] - self.conf.notification_topics = [topic] + self.config(driver=[self.driver], + topics=[topic], + group='oslo_messaging_notifications') listener = self.useFixture( utils.NotificationFixture(self.conf, self.url, [topic])) diff --git a/oslo_messaging/tests/notify/test_log_handler.py b/oslo_messaging/tests/notify/test_log_handler.py index dfc214aed..1851321dd 100644 --- a/oslo_messaging/tests/notify/test_log_handler.py +++ b/oslo_messaging/tests/notify/test_log_handler.py @@ -28,7 +28,8 @@ class PublishErrorsHandlerTestCase(test_utils.BaseTestCase): def test_emit_cfg_log_notifier_in_notifier_drivers(self): drivers = ['messaging', 'log'] - self.config(notification_driver=drivers) + self.config(driver=drivers, + group='oslo_messaging_notifications') self.stub_flg = True transport = test_notifier._FakeTransport(self.conf) diff --git a/oslo_messaging/tests/notify/test_logger.py b/oslo_messaging/tests/notify/test_logger.py index f0ea8e8b8..12d1cd100 100644 --- a/oslo_messaging/tests/notify/test_logger.py +++ b/oslo_messaging/tests/notify/test_logger.py @@ -49,7 +49,8 @@ class TestLogNotifier(test_utils.BaseTestCase): def setUp(self): super(TestLogNotifier, self).setUp() self.addCleanup(oslo_messaging.notify._impl_test.reset) - self.config(notification_driver=['test']) + self.config(driver=['test'], + group='oslo_messaging_notifications') # NOTE(jamespage) disable thread information logging for testing # as this causes test failures when zmq tests monkey_patch via # eventlet diff --git a/oslo_messaging/tests/notify/test_notifier.py b/oslo_messaging/tests/notify/test_notifier.py index e55913d51..0b2da7fbb 100644 --- a/oslo_messaging/tests/notify/test_notifier.py +++ b/oslo_messaging/tests/notify/test_notifier.py @@ -156,8 +156,9 @@ class TestMessagingNotifier(test_utils.BaseTestCase): if self.v2: drivers.append('messagingv2') - self.config(notification_driver=drivers, - notification_topics=self.topics) + self.config(driver=drivers, + topics=self.topics, + group='oslo_messaging_notifications') transport = _FakeTransport(self.conf) @@ -269,7 +270,8 @@ class TestLogNotifier(test_utils.BaseTestCase): @mock.patch('oslo_utils.timeutils.utcnow') def test_notifier(self, mock_utcnow): - self.config(notification_driver=['log']) + self.config(driver=['log'], + group='oslo_messaging_notifications') transport = _FakeTransport(self.conf) @@ -338,7 +340,8 @@ class TestLogNotifier(test_utils.BaseTestCase): class TestRoutingNotifier(test_utils.BaseTestCase): def setUp(self): super(TestRoutingNotifier, self).setUp() - self.config(notification_driver=['routing']) + self.config(driver=['routing'], + group='oslo_messaging_notifications') transport = _FakeTransport(self.conf) self.notifier = oslo_messaging.Notifier(transport) @@ -360,13 +363,14 @@ class TestRoutingNotifier(test_utils.BaseTestCase): self.assertTrue(self.router._should_load_plugin(ext)) def test_load_notifiers_no_config(self): - # default routing_notifier_config="" + # default routing_config="" self.router._load_notifiers() self.assertEqual({}, self.router.routing_groups) self.assertEqual(0, len(self.router.used_drivers)) def test_load_notifiers_no_extensions(self): - self.config(routing_notifier_config="routing_notifier.yaml") + self.config(routing_config="routing_notifier.yaml", + group='oslo_messaging_notifications') routing_config = r"" config_file = mock.MagicMock() config_file.return_value = routing_config @@ -382,7 +386,8 @@ class TestRoutingNotifier(test_utils.BaseTestCase): self.assertEqual({}, self.router.routing_groups) def test_load_notifiers_config(self): - self.config(routing_notifier_config="routing_notifier.yaml") + self.config(routing_config="routing_notifier.yaml", + group='oslo_messaging_notifications') routing_config = r""" group_1: rpc : foo @@ -519,7 +524,8 @@ group_1: sorted(pm.map.call_args[0][6])) def test_notify_filtered(self): - self.config(routing_notifier_config="routing_notifier.yaml") + self.config(routing_config="routing_notifier.yaml", + group='oslo_messaging_notifications') routing_config = r""" group_1: rpc: diff --git a/tools/simulator.py b/tools/simulator.py index d3dda3eec..3c587d5a0 100755 --- a/tools/simulator.py +++ b/tools/simulator.py @@ -283,8 +283,8 @@ def main(): # oslo.config defaults cfg.CONF.heartbeat_interval = 5 - cfg.CONF.notification_topics = "notif" - cfg.CONF.notification_driver = "messaging" + cfg.CONF.oslo_messaging_notifications.topics = "notif" + cfg.CONF.oslo_messaging_notifications.driver = "messaging" cfg.CONF.prog = os.path.basename(__file__) cfg.CONF.project = 'oslo.messaging'