From 084bb0952ae455742074e927eb2a69f60a0b97a3 Mon Sep 17 00:00:00 2001 From: Boden R Date: Tue, 12 Feb 2019 10:34:57 -0700 Subject: [PATCH] use callback payloads for ROUTER_CONTROLLER events This patch switches the code over to the payload style of callbacks [1] for ROUTER_CONTROLLER events. In addition it updates the unit tests to also use payloads for ROUTER_CONTROLLER based events. NeutronLibImpact [1] https://docs.openstack.org/neutron-lib/latest/contributor/callbacks.html Change-Id: Ib32070c1e3e89f3bb8ce8206654ea6c4cfa2a50c --- .../service_providers/driver_controller.py | 26 ++++++----- .../test_driver_controller.py | 43 +++++++++++-------- 2 files changed, 40 insertions(+), 29 deletions(-) diff --git a/neutron/services/l3_router/service_providers/driver_controller.py b/neutron/services/l3_router/service_providers/driver_controller.py index e2fe7a6cef8..a6d283a352e 100644 --- a/neutron/services/l3_router/service_providers/driver_controller.py +++ b/neutron/services/l3_router/service_providers/driver_controller.py @@ -88,11 +88,12 @@ class DriverController(object): drv = self._get_provider_for_create(context, router) self._stm.add_resource_association(context, plugin_constants.L3, drv.name, router['id']) - registry.notify( + registry.publish( resources.ROUTER_CONTROLLER, events.PRECOMMIT_ADD_ASSOCIATION, - trigger, context=context, router=router, - router_db=router_db, old_driver=None, - new_driver=drv, **kwargs) + trigger, payload=events.DBEventPayload( + context, request_body=router, states=(router_db,), + metadata={'old_driver': None, 'new_driver': drv}, + resource_id=router_db.get('id'))) @registry.receives(resources.ROUTER, [events.PRECOMMIT_DELETE], priority_group.PRIORITY_ROUTER_CONTROLLER) @@ -100,10 +101,13 @@ class DriverController(object): router_id, **kwargs): """Remove the association between a router and a service provider.""" drv = self.get_provider_for_router(context, router_id) - registry.notify( + registry.publish( resources.ROUTER_CONTROLLER, events.PRECOMMIT_DELETE_ASSOCIATIONS, - trigger, context=context, router_id=router_id, - old_driver=drv, new_driver=None, **kwargs) + trigger, payload=events.DBEventPayload( + context, + metadata={'old_driver': drv, 'new_driver': None}, + resource_id=router_id)) + self._stm.del_resource_associations(context, [router_id]) @registry.receives(resources.ROUTER, [events.PRECOMMIT_UPDATE], @@ -190,11 +194,13 @@ class DriverController(object): self._stm.add_resource_association( context, plugin_constants.L3, driver_name, router_id) - registry.notify( + registry.publish( resources.ROUTER_CONTROLLER, events.PRECOMMIT_ADD_ASSOCIATION, - self, context=context, router_id=router_id, - router=router, old_driver=None, new_driver=driver) + self, payload=events.DBEventPayload( + context, states=(router,), + metadata={'old_driver': None, 'new_driver': driver}, + resource_id=router_id)) return self.drivers[driver_name] def _get_provider_for_create(self, context, router): diff --git a/neutron/tests/unit/services/l3_router/service_providers/test_driver_controller.py b/neutron/tests/unit/services/l3_router/service_providers/test_driver_controller.py index 814941d9550..5357b583d6b 100644 --- a/neutron/tests/unit/services/l3_router/service_providers/test_driver_controller.py +++ b/neutron/tests/unit/services/l3_router/service_providers/test_driver_controller.py @@ -15,6 +15,7 @@ import mock from neutron_lib.callbacks import events from neutron_lib.callbacks import registry +from neutron_lib.callbacks import resources from neutron_lib import constants from neutron_lib import context from neutron_lib import exceptions as lib_exc @@ -75,7 +76,7 @@ class TestDriverController(testlib_api.SqlTestCase): self.assertFalse(self.dc.drivers['dvr'].owns_router(self.ctx, r2)) self.assertFalse(self.dc.drivers['dvr'].owns_router(self.ctx, None)) - @mock.patch('neutron_lib.callbacks.registry.notify') + @mock.patch('neutron_lib.callbacks.registry.publish') def test__set_router_provider_flavor_specified(self, mock_cb): self._return_provider_for_flavor('dvrha') router_db = mock.Mock() @@ -84,10 +85,12 @@ class TestDriverController(testlib_api.SqlTestCase): router = dict(id=router_id, flavor_id=flavor_id) self.dc._set_router_provider('router', 'PRECOMMIT_CREATE', self, self.ctx, router, router_db) - mock_cb.assert_called_with('router_controller', + mock_cb.assert_called_with(resources.ROUTER_CONTROLLER, events.PRECOMMIT_ADD_ASSOCIATION, mock.ANY, - context=self.ctx, router=mock.ANY, router_db=mock.ANY, - old_driver=mock.ANY, new_driver=mock.ANY) + payload=mock.ANY) + payload = mock_cb.mock_calls[0][2]['payload'] + self.assertEqual(router, payload.request_body) + self.assertEqual(router_db, payload.latest_state) self.assertEqual(flavor_id, router_db.flavor_id) self.assertEqual(self.dc.drivers['dvrha'], self.dc.get_provider_for_router(self.ctx, @@ -141,7 +144,7 @@ class TestDriverController(testlib_api.SqlTestCase): "%(distributed_flag)s", {'ha_flag': False, 'distributed_flag': False}) - @mock.patch('neutron_lib.callbacks.registry.notify') + @mock.patch('neutron_lib.callbacks.registry.publish') def test__set_router_provider_attr_lookups(self, mock_cb): # ensure correct drivers are looked up based on attrs router_id1 = uuidutils.generate_uuid() @@ -174,43 +177,45 @@ class TestDriverController(testlib_api.SqlTestCase): for driver, body in cases: self.dc._set_router_provider('router', 'PRECOMMIT_CREATE', self, self.ctx, body, mock.Mock()) - mock_cb.assert_called_with('router_controller', + mock_cb.assert_called_with( + resources.ROUTER_CONTROLLER, events.PRECOMMIT_ADD_ASSOCIATION, mock.ANY, - context=self.ctx, router=mock.ANY, router_db=mock.ANY, - old_driver=mock.ANY, new_driver=mock.ANY) + payload=mock.ANY) self.assertEqual(self.dc.drivers[driver], self.dc.get_provider_for_router(self.ctx, body['id']), 'Expecting %s for body %s' % (driver, body)) - @mock.patch('neutron_lib.callbacks.registry.notify') + @mock.patch('neutron_lib.callbacks.registry.publish') def test__clear_router_provider(self, mock_cb): # ensure correct drivers are looked up based on attrs router_id1 = uuidutils.generate_uuid() body = dict(id=router_id1, distributed=True, ha=True) self.dc._set_router_provider('router', 'PRECOMMIT_CREATE', self, self.ctx, body, mock.Mock()) - mock_cb.assert_called_with('router_controller', + mock_cb.assert_called_with(resources.ROUTER_CONTROLLER, events.PRECOMMIT_ADD_ASSOCIATION, mock.ANY, - context=self.ctx, router=mock.ANY, router_db=mock.ANY, - old_driver=mock.ANY, new_driver=mock.ANY) + payload=mock.ANY) + payload = mock_cb.mock_calls[0][2]['payload'] + self.assertEqual(self.ctx, payload.context) + self.assertIn('old_driver', payload.metadata) + self.assertIn('new_driver', payload.metadata) + self.assertIsNotNone(payload.latest_state) self.assertEqual(self.dc.drivers['dvrha'], self.dc.get_provider_for_router(self.ctx, body['id'])) self.dc._clear_router_provider('router', 'PRECOMMIT_DELETE', self, self.ctx, body['id']) - mock_cb.assert_called_with('router_controller', + mock_cb.assert_called_with(resources.ROUTER_CONTROLLER, events.PRECOMMIT_DELETE_ASSOCIATIONS, mock.ANY, - context=self.ctx, router_id=mock.ANY, old_driver=mock.ANY, - new_driver=mock.ANY) + payload=mock.ANY) with testtools.ExpectedException(ValueError): # if association was cleared, get_router will be called self.fake_l3.get_router.side_effect = ValueError self.dc.get_provider_for_router(self.ctx, body['id']) - mock_cb.assert_called_with('router_controller', - events.PRECOMMIT_ADD_ASSOCIATION, mock.ANY, context=self.ctx, - router_id=body['id'], router=mock.ANY, old_driver=mock.ANY, - new_driver=mock.ANY) + mock_cb.assert_called_with(resources.ROUTER_CONTROLLER, + events.PRECOMMIT_ADD_ASSOCIATION, + mock.ANY, payload=mock.ANY) def test__flavor_plugin(self): directory.add_plugin(p_cons.FLAVORS, mock.Mock())