From 1e3db7e08f57e9660244e68e1e8363e741e3bd67 Mon Sep 17 00:00:00 2001 From: Ihar Hrachyshka Date: Fri, 7 Apr 2017 13:10:06 -0700 Subject: [PATCH] Ignore gre devices in namespaces when cleaning up devices Agents and netns_cleanup tool attempt to clean up devices from namespaces before destroying namespaces, but they should skip doing it for gre devices that are automatic and show up depending on kernel modules loaded. Conflicts: neutron/agent/l3/dvr_snat_ns.py Change-Id: Ie95890ed92ac73ec8e2d118a9727b9e1624a5178 Related-Bug: #1604115 (cherry picked from commit 91c15edf54c07da77ecf4fc335b0ba3951ff1f90) --- neutron/agent/l3/dvr_edge_router.py | 3 ++- neutron/agent/l3/dvr_fip_ns.py | 3 ++- neutron/agent/l3/dvr_snat_ns.py | 3 ++- neutron/agent/l3/namespaces.py | 3 ++- neutron/agent/l3/router_info.py | 3 ++- neutron/agent/linux/dhcp.py | 3 ++- neutron/cmd/netns_cleanup.py | 3 ++- neutron/tests/unit/cmd/test_netns_cleanup.py | 3 ++- 8 files changed, 16 insertions(+), 8 deletions(-) diff --git a/neutron/agent/l3/dvr_edge_router.py b/neutron/agent/l3/dvr_edge_router.py index 9fa22257dad..46b2d7bacc4 100644 --- a/neutron/agent/l3/dvr_edge_router.py +++ b/neutron/agent/l3/dvr_edge_router.py @@ -252,7 +252,8 @@ class DvrEdgeRouter(dvr_local_router.DvrLocalRouter): return ns_ip = ip_lib.IPWrapper(namespace=self.snat_namespace.name) - for d in ns_ip.get_devices(exclude_loopback=True): + for d in ns_ip.get_devices(exclude_loopback=True, + exclude_gre_devices=True): if (d.name.startswith(router.EXTERNAL_DEV_PREFIX) and d.name != interface_name): LOG.debug('Deleting stale external router device: %s', d.name) diff --git a/neutron/agent/l3/dvr_fip_ns.py b/neutron/agent/l3/dvr_fip_ns.py index aad55310ce1..49d3c9ea511 100644 --- a/neutron/agent/l3/dvr_fip_ns.py +++ b/neutron/agent/l3/dvr_fip_ns.py @@ -208,7 +208,8 @@ class FipNamespace(namespaces.Namespace): @namespaces.check_ns_existence def _delete(self): ip_wrapper = ip_lib.IPWrapper(namespace=self.name) - for d in ip_wrapper.get_devices(exclude_loopback=True): + for d in ip_wrapper.get_devices(exclude_loopback=True, + exclude_gre_devices=True): if d.name.startswith(FIP_2_ROUTER_DEV_PREFIX): # internal link between IRs and FIP NS ip_wrapper.del_veth(d.name) diff --git a/neutron/agent/l3/dvr_snat_ns.py b/neutron/agent/l3/dvr_snat_ns.py index f401f140efc..9fe374363b6 100644 --- a/neutron/agent/l3/dvr_snat_ns.py +++ b/neutron/agent/l3/dvr_snat_ns.py @@ -42,7 +42,8 @@ class SnatNamespace(namespaces.Namespace): @namespaces.check_ns_existence def delete(self): ns_ip = ip_lib.IPWrapper(namespace=self.name) - for d in ns_ip.get_devices(exclude_loopback=True): + for d in ns_ip.get_devices(exclude_loopback=True, + exclude_gre_devices=True): if d.name.startswith(SNAT_INT_DEV_PREFIX): LOG.debug('Unplugging DVR device %s', d.name) self.driver.unplug(d.name, namespace=self.name, diff --git a/neutron/agent/l3/namespaces.py b/neutron/agent/l3/namespaces.py index e70d7bbc500..f65c706c7b4 100644 --- a/neutron/agent/l3/namespaces.py +++ b/neutron/agent/l3/namespaces.py @@ -123,7 +123,8 @@ class RouterNamespace(Namespace): @check_ns_existence def delete(self): ns_ip = ip_lib.IPWrapper(namespace=self.name) - for d in ns_ip.get_devices(exclude_loopback=True): + for d in ns_ip.get_devices(exclude_loopback=True, + exclude_gre_devices=True): if d.name.startswith(INTERNAL_DEV_PREFIX): # device is on default bridge self.driver.unplug(d.name, namespace=self.name, diff --git a/neutron/agent/l3/router_info.py b/neutron/agent/l3/router_info.py index d671d3f4f43..719359bb22f 100644 --- a/neutron/agent/l3/router_info.py +++ b/neutron/agent/l3/router_info.py @@ -462,7 +462,8 @@ class RouterInfo(object): def _get_existing_devices(self): ip_wrapper = ip_lib.IPWrapper(namespace=self.ns_name) - ip_devs = ip_wrapper.get_devices(exclude_loopback=True) + ip_devs = ip_wrapper.get_devices(exclude_loopback=True, + exclude_gre_devices=True) return [ip_dev.name for ip_dev in ip_devs] @staticmethod diff --git a/neutron/agent/linux/dhcp.py b/neutron/agent/linux/dhcp.py index 28566b5c554..2d26e5090db 100644 --- a/neutron/agent/linux/dhcp.py +++ b/neutron/agent/linux/dhcp.py @@ -1335,7 +1335,8 @@ class DeviceManager(object): ns_ip = ip_lib.IPWrapper(namespace=network.namespace) if not ns_ip.netns.exists(network.namespace): return - for d in ns_ip.get_devices(exclude_loopback=True): + for d in ns_ip.get_devices(exclude_loopback=True, + exclude_gre_devices=True): # delete all devices except current active DHCP port device if d.name != skip_dev_name: LOG.debug("Found stale device %s, deleting", d.name) diff --git a/neutron/cmd/netns_cleanup.py b/neutron/cmd/netns_cleanup.py index 703234900a2..8ba86e3f96b 100644 --- a/neutron/cmd/netns_cleanup.py +++ b/neutron/cmd/netns_cleanup.py @@ -247,7 +247,8 @@ def destroy_namespace(conf, namespace, force=False): # the error and continue with the cleanup LOG.error(_LE('Not all processes were killed in %s'), namespace) - for device in ip.get_devices(exclude_loopback=True): + for device in ip.get_devices(exclude_loopback=True, + exclude_gre_devices=True): unplug_device(conf, device) ip.garbage_collect_namespace() diff --git a/neutron/tests/unit/cmd/test_netns_cleanup.py b/neutron/tests/unit/cmd/test_netns_cleanup.py index 56af8ea9125..cbf030d677b 100644 --- a/neutron/tests/unit/cmd/test_netns_cleanup.py +++ b/neutron/tests/unit/cmd/test_netns_cleanup.py @@ -336,7 +336,8 @@ class TestNetnsCleanup(base.BaseTestCase): expected.extend([ mock.call().netns.exists(ns), mock.call().get_devices( - exclude_loopback=True)]) + exclude_loopback=True, + exclude_gre_devices=True)]) self.assertTrue(kill_dhcp.called) unplug.assert_has_calls( [mock.call(conf, d) for d in