From f74e8f1ecbf5b7558b25f4f5eb4b381b6c2520dc Mon Sep 17 00:00:00 2001 From: Darragh O'Reilly Date: Tue, 14 Jan 2014 15:02:17 +0000 Subject: [PATCH] Remove pyudev dependency pyudev was only used by the linuxbridge-agent to get the list of virtual network devices. This can be got from /sys instead. This patch fixes the problem where testr could not import the lb-agent module because pyudev was not in requirements.txt. Change-Id: I0a78c91e97de4413f2ecf6fb56d2ff61b36baa78 Closes-Bug: 1269040 --- neutron/hooks.py | 2 -- .../agent/linuxbridge_neutron_agent.py | 26 +++++-------------- .../unit/linuxbridge/test_lb_neutron_agent.py | 14 +++++----- 3 files changed, 14 insertions(+), 28 deletions(-) diff --git a/neutron/hooks.py b/neutron/hooks.py index 6b4a1e78c6..282ae8f11d 100644 --- a/neutron/hooks.py +++ b/neutron/hooks.py @@ -25,7 +25,5 @@ def setup_hook(config): if sys.platform == 'win32': requires.append('pywin32') requires.append('wmi') - elif sys.platform.startswith('linux'): - requires.append('pyudev') metadata['requires_dist'] = "\n".join(requires) config['metadata'] = metadata diff --git a/neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py b/neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py index 6bf1e05d23..37509b4aa0 100755 --- a/neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py +++ b/neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py @@ -30,7 +30,6 @@ import time import eventlet from oslo.config import cfg -import pyudev from neutron.agent import l2population_rpc as l2pop_rpc from neutron.agent.linux import ip_lib @@ -88,10 +87,6 @@ class LinuxBridgeManager: # Store network mapping to segments self.network_map = {} - self.udev = pyudev.Context() - monitor = pyudev.Monitor.from_netlink(self.udev) - monitor.filter_by('net') - def device_exists(self, device): """Check if ethernet device exists.""" try: @@ -501,7 +496,7 @@ class LinuxBridgeManager: LOG.debug(_("Done deleting vxlan interface %s"), interface) def update_devices(self, registered_devices): - devices = self.udev_get_tap_devices() + devices = self.get_tap_devices() if devices == registered_devices: return added = devices - registered_devices @@ -510,20 +505,13 @@ class LinuxBridgeManager: 'added': added, 'removed': removed} - def udev_get_tap_devices(self): + def get_tap_devices(self): devices = set() - for device in self.udev.list_devices(subsystem='net'): - name = self.udev_get_name(device) - if self.is_tap_device(name): - devices.add(name) + for device in os.listdir(BRIDGE_FS): + if device.startswith(TAP_INTERFACE_PREFIX): + devices.add(device) return devices - def is_tap_device(self, name): - return name.startswith(TAP_INTERFACE_PREFIX) - - def udev_get_name(self, device): - return device.sys_name - def check_vxlan_support(self): kernel_version = dist_version.LooseVersion(platform.release()) if cfg.CONF.VXLAN.l2_population and ( @@ -633,7 +621,7 @@ class LinuxBridgeRpcCallbacks(sg_rpc.SecurityGroupAgentRpcCallbackMixin, # Check port exists on node port = kwargs.get('port') tap_device_name = self.agent.br_mgr.get_tap_device_name(port['id']) - devices = self.agent.br_mgr.udev_get_tap_devices() + devices = self.agent.br_mgr.get_tap_devices() if tap_device_name not in devices: return @@ -798,7 +786,7 @@ class LinuxBridgeNeutronAgentRPC(sg_rpc.SecurityGroupAgentRpcMixin): def _report_state(self): try: - devices = len(self.br_mgr.udev_get_tap_devices()) + devices = len(self.br_mgr.get_tap_devices()) self.agent_state.get('configurations')['devices'] = devices self.state_rpc.report_state(self.context, self.agent_state) diff --git a/neutron/tests/unit/linuxbridge/test_lb_neutron_agent.py b/neutron/tests/unit/linuxbridge/test_lb_neutron_agent.py index 0687d023ec..994163ff41 100644 --- a/neutron/tests/unit/linuxbridge/test_lb_neutron_agent.py +++ b/neutron/tests/unit/linuxbridge/test_lb_neutron_agent.py @@ -599,7 +599,7 @@ class TestLinuxBridgeManager(base.BaseTestCase): self.assertTrue(exec_fn.called) def test_update_devices(self): - with mock.patch.object(self.lbm, "udev_get_tap_devices") as gt_fn: + with mock.patch.object(self.lbm, "get_tap_devices") as gt_fn: gt_fn.return_value = set(["dev1"]) self.assertIsNone(self.lbm.update_devices(set(["dev1"]))) @@ -710,7 +710,7 @@ class TestLinuxBridgeRpcCallbacks(base.BaseTestCase): mock.patch.object(self.lb_rpc.agent.br_mgr, "get_tap_device_name"), mock.patch.object(self.lb_rpc.agent.br_mgr, - "udev_get_tap_devices"), + "get_tap_devices"), mock.patch.object(self.lb_rpc.agent.br_mgr, "get_bridge_name"), mock.patch.object(self.lb_rpc.agent.br_mgr, @@ -720,10 +720,10 @@ class TestLinuxBridgeRpcCallbacks(base.BaseTestCase): "plugin_rpc", create=True), mock.patch.object(self.lb_rpc.sg_agent, "refresh_firewall", create=True) - ) as (get_tap_fn, udev_fn, getbr_fn, remif_fn, + ) as (get_tap_fn, get_tap_devs_fn, getbr_fn, remif_fn, addif_fn, rpc_obj, reffw_fn): get_tap_fn.return_value = "tap123" - udev_fn.return_value = ["tap123", "tap124"] + get_tap_devs_fn.return_value = set(["tap123", "tap124"]) port = {"admin_state_up": True, "id": "1234-5678", "network_id": "123-123"} @@ -814,7 +814,7 @@ class TestLinuxBridgeRpcCallbacks(base.BaseTestCase): mock.patch.object(self.lb_rpc.agent.br_mgr, "get_tap_device_name"), mock.patch.object(self.lb_rpc.agent.br_mgr, - "udev_get_tap_devices"), + "get_tap_devices"), mock.patch.object(self.lb_rpc.agent.br_mgr, "get_bridge_name"), mock.patch.object(self.lb_rpc.agent.br_mgr, @@ -825,9 +825,9 @@ class TestLinuxBridgeRpcCallbacks(base.BaseTestCase): mock.patch.object(self.lb_rpc.agent, "plugin_rpc", create=True), mock.patch.object(linuxbridge_neutron_agent.LOG, 'error'), - ) as (get_tap_fn, udev_fn, _, _, _, _, plugin_rpc, log): + ) as (get_tap_fn, get_tap_devs_fn, _, _, _, _, plugin_rpc, log): get_tap_fn.return_value = "tap123" - udev_fn.return_value = ["tap123", "tap124"] + get_tap_devs_fn.return_value = set(["tap123", "tap124"]) port = {"admin_state_up": True, "id": "1234-5678", "network_id": "123-123"}