From cd31eae33d2e613c178e277af36dc6a9924d597a Mon Sep 17 00:00:00 2001 From: Rodolfo Alonso Hernandez Date: Tue, 12 Feb 2019 10:05:28 +0000 Subject: [PATCH] Use pyroute2 to check vlan/vxlan in use Now ip_lib.get_devices_info function is implemented using pyroute2, "vlan_in_use" and "vxlan_in_use" can make use of it. Change-Id: I82a2c3ea76195b10880cf37bf2229341b995b0ae Closes-Bug: #1815498 --- neutron/agent/linux/ip_lib.py | 16 ++++++++-------- .../tests/functional/agent/linux/test_ip_lib.py | 12 ++++++++++++ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/neutron/agent/linux/ip_lib.py b/neutron/agent/linux/ip_lib.py index 67467bfc99f..f3c5a9d36d3 100644 --- a/neutron/agent/linux/ip_lib.py +++ b/neutron/agent/linux/ip_lib.py @@ -793,18 +793,18 @@ class IpNetnsCommand(IpCommandBase): def vlan_in_use(segmentation_id, namespace=None): """Return True if VLAN ID is in use by an interface, else False.""" - ip_wrapper = IPWrapper(namespace=namespace) - interfaces = ip_wrapper.netns.execute(["ip", "-d", "link", "list"], - check_exit_code=True) - return '802.1Q id %s ' % segmentation_id in interfaces + interfaces = get_devices_info(namespace) + vlans = {interface.get('vlan_id') for interface in interfaces + if interface.get('vlan_id')} + return segmentation_id in vlans def vxlan_in_use(segmentation_id, namespace=None): """Return True if VXLAN VNID is in use by an interface, else False.""" - ip_wrapper = IPWrapper(namespace=namespace) - interfaces = ip_wrapper.netns.execute(["ip", "-d", "link", "list"], - check_exit_code=True) - return 'vxlan id %s ' % segmentation_id in interfaces + interfaces = get_devices_info(namespace) + vxlans = {interface.get('vxlan_id') for interface in interfaces + if interface.get('vxlan_id')} + return segmentation_id in vxlans def device_exists(device_name, namespace=None): diff --git a/neutron/tests/functional/agent/linux/test_ip_lib.py b/neutron/tests/functional/agent/linux/test_ip_lib.py index 11c04d2e71d..43451452959 100644 --- a/neutron/tests/functional/agent/linux/test_ip_lib.py +++ b/neutron/tests/functional/agent/linux/test_ip_lib.py @@ -202,6 +202,18 @@ class IpLibTestCase(IpLibTestFramework): device.link.delete() self.assertFalse(device.exists()) + def test_vlan_exists(self): + attr = self.generate_device_details() + ip = ip_lib.IPWrapper(namespace=attr.namespace) + ip.netns.add(attr.namespace) + self.addCleanup(ip.netns.delete, attr.namespace) + priv_ip_lib.create_interface(attr.name, attr.namespace, 'dummy') + self.assertFalse(ip_lib.vlan_in_use(1999, namespace=attr.namespace)) + device = ip.add_vlan('vlan1999', attr.name, 1999) + self.assertTrue(ip_lib.vlan_in_use(1999, namespace=attr.namespace)) + device.link.delete() + self.assertFalse(ip_lib.vlan_in_use(1999, namespace=attr.namespace)) + def test_vxlan_exists(self): attr = self.generate_device_details() ip = ip_lib.IPWrapper(namespace=attr.namespace)