From b744172fb8b96e6779ebc286d55d650788390a20 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. 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 c4416d7d873..11f31bc5372 100644 --- a/neutron/agent/l3/dvr_edge_router.py +++ b/neutron/agent/l3/dvr_edge_router.py @@ -251,7 +251,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 9bae5c6057f..8d22b0255b4 100644 --- a/neutron/agent/l3/dvr_fip_ns.py +++ b/neutron/agent/l3/dvr_fip_ns.py @@ -207,7 +207,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 f22e717b0c0..085dc5cbc47 100644 --- a/neutron/agent/l3/dvr_snat_ns.py +++ b/neutron/agent/l3/dvr_snat_ns.py @@ -41,7 +41,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(constants.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 3cf77a0e9ef..121aa5c7042 100644 --- a/neutron/agent/l3/router_info.py +++ b/neutron/agent/l3/router_info.py @@ -465,7 +465,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 52b4bd3627f..8d4d90a3593 100644 --- a/neutron/agent/linux/dhcp.py +++ b/neutron/agent/linux/dhcp.py @@ -1337,7 +1337,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 1dd391cbd47..dbf1388cbc6 100644 --- a/neutron/cmd/netns_cleanup.py +++ b/neutron/cmd/netns_cleanup.py @@ -248,7 +248,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