From cbbb90e28c608d165df94b779c04593bd17d02f1 Mon Sep 17 00:00:00 2001
From: Mehdi Abaakouk <mehdi.abaakouk@enovance.com>
Date: Tue, 6 May 2014 18:24:49 +0200
Subject: [PATCH] Fix the notify method of the routing notifier

The notify method of the routing notifier don't have the correct
signature and change the case of the priority.

This change fixes it.

Change-Id: I833b19d0c054c94b861a4f6cc263c3487fa0e544
Closes-bug: #1316681
---
 oslo/messaging/notify/_impl_routing.py | 18 ++++---
 tests/test_notifier.py                 | 66 +++++++++++++++++++++-----
 2 files changed, 62 insertions(+), 22 deletions(-)

diff --git a/oslo/messaging/notify/_impl_routing.py b/oslo/messaging/notify/_impl_routing.py
index f9d6dceca..15f989c58 100644
--- a/oslo/messaging/notify/_impl_routing.py
+++ b/oslo/messaging/notify/_impl_routing.py
@@ -104,33 +104,31 @@ class RoutingDriver(notifier._Driver):
 
         return list(accepted_drivers)
 
-    def _filter_func(self, ext, context, message, accepted_drivers):
+    def _filter_func(self, ext, context, message, priority, accepted_drivers):
         """True/False if the driver should be called for this message.
         """
         # context is unused here, but passed in by map()
         return ext.name in accepted_drivers
 
-    def _call_notify(self, ext, context, message, accepted_drivers):
+    def _call_notify(self, ext, context, message, priority, accepted_drivers):
         """Emit the notification.
         """
         # accepted_drivers is passed in as a result of the map() function
         LOG.info(_("Routing '%(event)s' notification to '%(driver)s' driver") %
                  {'event': message.get('event_type'), 'driver': ext.name})
-        ext.obj.notify(context, message)
+        ext.obj.notify(context, message, priority)
 
-    def notify(self, context, message):
+    def notify(self, context, message, priority):
         if not self.plugin_manager:
             self._load_notifiers()
 
         # Fail if these aren't present ...
         event_type = message['event_type']
-        priority = message['priority'].lower()
 
         accepted_drivers = set()
         for group in self.routing_groups.values():
-            accepted_drivers.update(self._get_drivers_for_message(group,
-                                                                  event_type,
-                                                                  priority))
-
+            accepted_drivers.update(
+                self._get_drivers_for_message(group, event_type,
+                                              priority.lower()))
         self.plugin_manager.map(self._filter_func, self._call_notify, context,
-                                message, list(accepted_drivers))
+                                message, priority, list(accepted_drivers))
diff --git a/tests/test_notifier.py b/tests/test_notifier.py
index 802211247..4947d036b 100644
--- a/tests/test_notifier.py
+++ b/tests/test_notifier.py
@@ -13,6 +13,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+import contextlib
 import datetime
 import logging
 import sys
@@ -20,6 +21,7 @@ import uuid
 
 import fixtures
 import mock
+from stevedore import dispatch
 from stevedore import extension
 import testscenarios
 import yaml
@@ -27,7 +29,6 @@ import yaml
 from oslo import messaging
 from oslo.messaging.notify import _impl_log
 from oslo.messaging.notify import _impl_messaging
-from oslo.messaging.notify import _impl_routing as routing
 from oslo.messaging.notify import _impl_test
 from oslo.messaging.notify import notifier as msg_notifier
 from oslo.messaging.openstack.common import jsonutils
@@ -304,7 +305,11 @@ class TestLogNotifier(test_utils.BaseTestCase):
 class TestRoutingNotifier(test_utils.BaseTestCase):
     def setUp(self):
         super(TestRoutingNotifier, self).setUp()
-        self.router = routing.RoutingDriver(None, None, None)
+        self.config(notification_driver=['routing'])
+
+        transport = _FakeTransport(self.conf)
+        self.notifier = messaging.Notifier(transport)
+        self.router = self.notifier._driver_mgr['routing'].obj
 
     def _fake_extension_manager(self, ext):
         return extension.ExtensionManager.make_test_instance(
@@ -380,22 +385,22 @@ group_1:
         # No matching event ...
         self.assertEqual([],
                          self.router._get_drivers_for_message(
-                             group, "unknown", None))
+                             group, "unknown", "info"))
 
         # Child of foo ...
         self.assertEqual(['rpc'],
                          self.router._get_drivers_for_message(
-                             group, "foo.1", None))
+                             group, "foo.1", "info"))
 
         # Foo itself ...
         self.assertEqual([],
                          self.router._get_drivers_for_message(
-                             group, "foo", None))
+                             group, "foo", "info"))
 
         # Child of blah.zoo
         self.assertEqual(['rpc'],
                          self.router._get_drivers_for_message(
-                             group, "blah.zoo.zing", None))
+                             group, "blah.zoo.zing", "info"))
 
     def test_get_drivers_for_message_accepted_priorities(self):
         config = r"""
@@ -461,21 +466,58 @@ group_1:
         ext.name = "rpc"
 
         # Good ...
-        self.assertTrue(self.router._filter_func(ext, {}, {},
+        self.assertTrue(self.router._filter_func(ext, {}, {}, 'info',
                         ['foo', 'rpc']))
 
         # Bad
-        self.assertFalse(self.router._filter_func(ext, {}, {}, ['foo']))
+        self.assertFalse(self.router._filter_func(ext, {}, {}, 'info',
+                                                  ['foo']))
 
     def test_notify(self):
         self.router.routing_groups = {'group_1': None, 'group_2': None}
-        message = {'event_type': 'my_event', 'priority': 'my_priority'}
-
         drivers_mock = mock.MagicMock()
         drivers_mock.side_effect = [['rpc'], ['foo']]
 
         with mock.patch.object(self.router, 'plugin_manager') as pm:
             with mock.patch.object(self.router, '_get_drivers_for_message',
                                    drivers_mock):
-                self.router.notify({}, message)
-                self.assertEqual(['rpc', 'foo'], pm.map.call_args[0][4])
+                self.notifier.info({}, 'my_event', {})
+                self.assertEqual(['rpc', 'foo'], pm.map.call_args[0][5])
+
+    def test_notify_filtered(self):
+        self.config(routing_notifier_config="routing_notifier.yaml")
+        routing_config = r"""
+group_1:
+    rpc:
+        accepted_events:
+          - my_event
+    rpc2:
+        accepted_priorities:
+          - info
+    bar:
+        accepted_events:
+            - nothing
+        """
+        config_file = mock.MagicMock()
+        config_file.return_value = routing_config
+
+        rpc_driver = mock.Mock()
+        rpc2_driver = mock.Mock()
+        bar_driver = mock.Mock()
+
+        pm = dispatch.DispatchExtensionManager.make_test_instance(
+            [extension.Extension('rpc', None, None, rpc_driver),
+             extension.Extension('rpc2', None, None, rpc2_driver),
+             extension.Extension('bar', None, None, bar_driver)],
+        )
+
+        with contextlib.nested(
+            mock.patch.object(self.router, '_get_notifier_config_file',
+                              config_file),
+            mock.patch('stevedore.dispatch.DispatchExtensionManager',
+                       return_value=pm)):
+                self.notifier.info({}, 'my_event', {})
+                self.assertFalse(bar_driver.info.called)
+                rpc_driver.notify.assert_called_once_with({}, mock.ANY, 'INFO')
+                rpc2_driver.notify.assert_called_once_with(
+                    {}, mock.ANY, 'INFO')