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
This commit is contained in:
Ihar Hrachyshka 2017-04-07 13:10:06 -07:00
parent 4e3032825f
commit 91c15edf54
8 changed files with 16 additions and 8 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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,

View File

@ -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,

View File

@ -468,7 +468,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

View File

@ -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)

View File

@ -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()

View File

@ -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