diff --git a/networking_bgpvpn/neutron/services/service_drivers/bagpipe/bagpipe.py b/networking_bgpvpn/neutron/services/service_drivers/bagpipe/bagpipe.py index 475c0a72..bef96bbd 100644 --- a/networking_bgpvpn/neutron/services/service_drivers/bagpipe/bagpipe.py +++ b/networking_bgpvpn/neutron/services/service_drivers/bagpipe/bagpipe.py @@ -32,8 +32,6 @@ from networking_bagpipe_l2.agent.bgpvpn import rpc_client LOG = logging.getLogger(__name__) -BAGPIPE_BGPVPN = 'bagpipe-bgpvpn' - def get_network_info_for_port(context, port_id): """Get MAC, IP and Gateway IP addresses informations for a specific port""" @@ -85,10 +83,6 @@ class BaGPipeBGPVPNDriver(driver_api.BGPVPNDriver): registry.subscribe(self.registry_port_deleted, resources.PORT, events.AFTER_DELETE) - @property - def service_type(self): - return BAGPIPE_BGPVPN - def _format_bgpvpn(self, bgpvpn, network_id): """JSON-format BGPVPN @@ -182,9 +176,8 @@ class BaGPipeBGPVPNDriver(driver_api.BGPVPNDriver): if not bgpvpns: return - bgpvpn_rts = ( - self._format_bgpvpn_network_route_targets(bgpvpns) - ) + bgpvpn_rts = self._format_bgpvpn_network_route_targets(bgpvpns) + LOG.debug("Port connected on BGPVPN network %s with route targets " "%s" % (network_id, bgpvpn_rts)) @@ -280,11 +273,16 @@ class BaGPipeBGPVPNDriver(driver_api.BGPVPNDriver): return full_port.get('binding:host_id') def notify_port_updated(self, context, port): + LOG.info("notify_port_updated on port %s status %s", + port['id'], + port['status']) + port_bgpvpn_info = {'id': port['id'], 'network_id': port['network_id']} - if port['device_owner'] == 'network:dhcp': - LOG.info("Owner of port %s is network:dhcp, ignoring") + if port['device_owner'] == const.DEVICE_OWNER_DHCP: + LOG.info("Port %s is DHCP, ignoring", port['id']) + return agent_host = self._get_port_host(port['id']) @@ -304,14 +302,20 @@ class BaGPipeBGPVPNDriver(driver_api.BGPVPNDriver): port_bgpvpn_info, agent_host) else: - LOG.debug("no action since new port status is %", port['status']) + LOG.info("no action since new port status is %s", port['status']) def remove_port_from_bgpvpn_agent(self, context, port): + LOG.info("remove_port_from_bgpvpn_agent port updated on port %s " + "status %s", + port['id'], + port['status']) + port_bgpvpn_info = {'id': port['id'], 'network_id': port['network_id']} - if port['device_owner'] == 'network:dhcp': - LOG.info("Owner of port %s is network:dhcp, ignoring") + if port['device_owner'] == const.DEVICE_OWNER_DHCP: + LOG.info("Port %s is DHCP, ignoring", port['id']) + return agent_host = self._get_port_host(port['id']) diff --git a/networking_bgpvpn/tests/unit/services/bagpipe/test_bagpipe.py b/networking_bgpvpn/tests/unit/services/bagpipe/test_bagpipe.py index cb608866..4174c532 100644 --- a/networking_bgpvpn/tests/unit/services/bagpipe/test_bagpipe.py +++ b/networking_bgpvpn/tests/unit/services/bagpipe/test_bagpipe.py @@ -16,10 +16,14 @@ import mock import webob.exc +from neutron.common.constants import DEVICE_OWNER_DHCP +from neutron.common.constants import PORT_STATUS_ACTIVE +from neutron.common.constants import PORT_STATUS_DOWN + from networking_bgpvpn.tests.unit.services import test_plugin -class TestBagpipeServiceDriver(test_plugin.BgpvpnTestCaseMixin): +class TestBagpipeCommon(test_plugin.BgpvpnTestCaseMixin): def setUp(self): self.mocked_bagpipeAPI = mock.patch( @@ -28,7 +32,10 @@ class TestBagpipeServiceDriver(test_plugin.BgpvpnTestCaseMixin): provider = ('networking_bgpvpn.neutron.services.service_drivers.' 'bagpipe.bagpipe.BaGPipeBGPVPNDriver') - super(TestBagpipeServiceDriver, self).setUp(service_provider=provider) + super(TestBagpipeCommon, self).setUp(service_provider=provider) + + +class TestBagpipeServiceDriver(TestBagpipeCommon): def test_bagpipe_associate_net(self): mocked_update = self.mocked_bagpipeAPI.update_bgpvpn @@ -110,3 +117,111 @@ class TestBagpipeServiceDriver(test_plugin.BgpvpnTestCaseMixin): 'export_rt': rt}} mocked_delete.assert_called_once_with(mock.ANY, formatted_bgpvpn) + + +class TestBagpipeServiceDriverCallbacks(TestBagpipeCommon): + '''Check that receiving callbacks results in RPC calls to the agent''' + + def setUp(self): + super(TestBagpipeServiceDriverCallbacks, self).setUp() + + self.bagpipe_driver = self.bgpvpn_plugin.driver + + self.bgpvpn_info = {'mac_address': '00:00:de:ad:be:ef', + 'ip_address': '10.0.0.2', + 'gateway_ip': '10.0.0.1', + 'l3vpn': {'import_rt': ['12345:1'], + 'export_rt': ['12345:1'] + } + } + + self.bagpipe_driver._retrieve_bgpvpn_network_info_for_port = mock.Mock( + return_value=self.bgpvpn_info + ) + + self.testhost = 'TESTHOST' + self.bagpipe_driver._get_port_host = mock.Mock( + return_value=self.testhost + ) + + self.mock_attach_rpc = self.mocked_bagpipeAPI.attach_port_on_bgpvpn + self.mock_detach_rpc = self.mocked_bagpipeAPI.detach_port_from_bgpvpn + + def _build_expected_return_active(self, port): + bgpvpn_info_port = self.bgpvpn_info.copy() + bgpvpn_info_port.update({'id': port['id'], + 'network_id': port['network_id']}) + return bgpvpn_info_port + + def _build_expected_return_down(self, port): + return {'id': port['id'], + 'network_id': port['network_id']} + + def test_bagpipe_callback_to_rpc_update_active(self): + with self.port() as port: + port['port']['status'] = PORT_STATUS_ACTIVE + self.bagpipe_driver.registry_port_updated( + None, None, None, + context=None, + port=port['port'] + ) + self.mock_attach_rpc.assert_called_once_with( + mock.ANY, + self._build_expected_return_active(port['port']), + self.testhost) + + def test_bagpipe_callback_to_rpc_update_down(self): + with self.port() as port: + port['port']['status'] = PORT_STATUS_DOWN + self.bagpipe_driver.registry_port_updated( + None, None, None, + context=None, + port=port['port'] + ) + self.mock_detach_rpc.assert_called_once_with( + mock.ANY, + self._build_expected_return_down(port['port']), + self.testhost) + + def test_bagpipe_callback_to_rpc_deleted(self): + with self.port() as port: + port['port']['status'] = PORT_STATUS_DOWN + self.bagpipe_driver.registry_port_deleted( + None, None, None, + context=None, + port=port['port'] + ) + self.mock_detach_rpc.assert_called_once_with( + mock.ANY, + self._build_expected_return_down(port['port']), + self.testhost) + + def test_bagpipe_callback_to_rpc_update_active_ignore_DHCP(self): + with self.port(device_owner=DEVICE_OWNER_DHCP) as port: + port['port']['status'] = PORT_STATUS_ACTIVE + self.bagpipe_driver.registry_port_updated( + None, None, None, + context=None, + port=port['port'] + ) + self.assertFalse(self.mock_attach_rpc.called) + + def test_bagpipe_callback_to_rpc_update_down_ignore_DHCP(self): + with self.port(device_owner=DEVICE_OWNER_DHCP) as port: + port['port']['status'] = PORT_STATUS_DOWN + self.bagpipe_driver.registry_port_updated( + None, None, None, + context=None, + port=port['port'] + ) + self.assertFalse(self.mock_detach_rpc.called) + + def test_bagpipe_callback_to_rpc_deleted_ignore_DHCP(self): + with self.port(device_owner=DEVICE_OWNER_DHCP) as port: + port['port']['status'] = PORT_STATUS_DOWN + self.bagpipe_driver.registry_port_deleted( + None, None, None, + context=None, + port=port['port'] + ) + self.assertFalse(self.mock_detach_rpc.called) diff --git a/networking_bgpvpn/tests/unit/services/test_plugin.py b/networking_bgpvpn/tests/unit/services/test_plugin.py index 389ef490..0679fc6a 100644 --- a/networking_bgpvpn/tests/unit/services/test_plugin.py +++ b/networking_bgpvpn/tests/unit/services/test_plugin.py @@ -62,11 +62,11 @@ class BgpvpnTestCaseMixin(test_db_base_plugin_v2.NeutronDbPluginV2TestCase): 'BGPVPNPlugin') service_plugins = {'bgpvpn_plugin': bgpvpn_plugin_str} - bgpvpn_plugin = plugin.BGPVPNPlugin() + self.bgpvpn_plugin = plugin.BGPVPNPlugin() extensions_path = ':'.join(extensions.__path__) ext_mgr = api_extensions.PluginAwareExtensionManager( extensions_path, - {constants.BGPVPN: bgpvpn_plugin}) + {constants.BGPVPN: self.bgpvpn_plugin}) super(BgpvpnTestCaseMixin, self).setUp( service_plugins=service_plugins,

AltStyle によって変換されたページ (->オリジナル) /