From 46608806aa7a9c60214e28429ca5a8b87b2a15de Mon Sep 17 00:00:00 2001 From: Oleg Bondarev Date: Thu, 2 Jul 2015 18:18:52 +0300 Subject: [PATCH] DVR: cleanup stale floating ip namespaces During l3 agent periodic resync NamespaceManager takes care of cleaning up stale router namespaces. This is true for qrouter- and snat- namespaces. However stale fip- namespaces also need to be cleaned up. The patch adds fip-ns handling to the NamespaceManager. Closes-Bug: #1470909 Change-Id: Ib6a8ae2ff66c0e1dd0978838c3f274748898f73e --- neutron/agent/l3/namespace_manager.py | 14 +++++++++----- .../tests/unit/agent/l3/test_namespace_manager.py | 13 ++++++++++--- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/neutron/agent/l3/namespace_manager.py b/neutron/agent/l3/namespace_manager.py index 51464e4e5..31df5d227 100644 --- a/neutron/agent/l3/namespace_manager.py +++ b/neutron/agent/l3/namespace_manager.py @@ -12,6 +12,7 @@ from oslo_log import log as logging +from neutron.agent.l3 import dvr_fip_ns from neutron.agent.l3 import dvr_snat_ns from neutron.agent.l3 import namespaces from neutron.agent.linux import external_process @@ -42,6 +43,12 @@ class NamespaceManager(object): agent restarts gracefully. """ + ns_prefix_to_class_map = { + namespaces.NS_PREFIX: namespaces.RouterNamespace, + dvr_snat_ns.SNAT_NS_PREFIX: dvr_snat_ns.SnatNamespace, + dvr_fip_ns.FIP_NS_PREFIX: dvr_fip_ns.FipNamespace, + } + def __init__(self, agent_conf, driver, clean_stale, metadata_driver=None): """Initialize the NamespaceManager. @@ -95,7 +102,7 @@ class NamespaceManager(object): :returns: tuple with prefix and id or None if no prefix matches """ prefix = namespaces.get_prefix_from_ns_name(ns_name) - if prefix in (namespaces.NS_PREFIX, dvr_snat_ns.SNAT_NS_PREFIX): + if prefix in self.ns_prefix_to_class_map: identifier = namespaces.get_id_from_ns_name(ns_name) return (prefix, identifier) @@ -123,10 +130,7 @@ class NamespaceManager(object): self._cleanup(ns_prefix, ns_id) def _cleanup(self, ns_prefix, ns_id): - if ns_prefix == namespaces.NS_PREFIX: - ns_class = namespaces.RouterNamespace - else: - ns_class = dvr_snat_ns.SnatNamespace + ns_class = self.ns_prefix_to_class_map[ns_prefix] ns = ns_class(ns_id, self.agent_conf, self.driver, use_ipv6=False) try: if self.metadata_driver: diff --git a/neutron/tests/unit/agent/l3/test_namespace_manager.py b/neutron/tests/unit/agent/l3/test_namespace_manager.py index 706b89945..956099136 100644 --- a/neutron/tests/unit/agent/l3/test_namespace_manager.py +++ b/neutron/tests/unit/agent/l3/test_namespace_manager.py @@ -16,6 +16,7 @@ import mock from oslo_utils import uuidutils +from neutron.agent.l3 import dvr_fip_ns from neutron.agent.l3 import dvr_snat_ns from neutron.agent.l3 import namespace_manager from neutron.agent.l3 import namespaces @@ -63,11 +64,15 @@ class TestNamespaceManager(NamespaceManagerTestCaseFramework): self.assertTrue(self.ns_manager.is_managed(router_ns_name)) router_ns_name = dvr_snat_ns.SNAT_NS_PREFIX + router_id self.assertTrue(self.ns_manager.is_managed(router_ns_name)) + router_ns_name = dvr_fip_ns.FIP_NS_PREFIX + router_id + self.assertTrue(self.ns_manager.is_managed(router_ns_name)) + self.assertFalse(self.ns_manager.is_managed('dhcp-' + router_id)) def test_list_all(self): ns_names = [namespaces.NS_PREFIX + _uuid(), dvr_snat_ns.SNAT_NS_PREFIX + _uuid(), + dvr_fip_ns.FIP_NS_PREFIX + _uuid(), 'dhcp-' + _uuid(), ] # Test the normal path @@ -90,12 +95,14 @@ class TestNamespaceManager(NamespaceManagerTestCaseFramework): ns_names = [namespaces.NS_PREFIX + _uuid() for _ in range(5)] ns_names += [dvr_snat_ns.SNAT_NS_PREFIX + _uuid() for _ in range(5)] ns_names += [namespaces.NS_PREFIX + router_id, - dvr_snat_ns.SNAT_NS_PREFIX + router_id] + dvr_snat_ns.SNAT_NS_PREFIX + router_id, + dvr_fip_ns.FIP_NS_PREFIX + router_id] with mock.patch.object(ip_lib.IPWrapper, 'get_namespaces', return_value=ns_names), \ mock.patch.object(self.ns_manager, '_cleanup') as mock_cleanup: self.ns_manager.ensure_router_cleanup(router_id) expected = [mock.call(namespaces.NS_PREFIX, router_id), - mock.call(dvr_snat_ns.SNAT_NS_PREFIX, router_id)] + mock.call(dvr_snat_ns.SNAT_NS_PREFIX, router_id), + mock.call(dvr_fip_ns.FIP_NS_PREFIX, router_id)] mock_cleanup.assert_has_calls(expected, any_order=True) - self.assertEqual(2, mock_cleanup.call_count) + self.assertEqual(3, mock_cleanup.call_count) -- 2.45.2