]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
DVR: cleanup stale floating ip namespaces
authorOleg Bondarev <obondarev@mirantis.com>
Thu, 2 Jul 2015 15:18:52 +0000 (18:18 +0300)
committerOleg Bondarev <obondarev@mirantis.com>
Fri, 3 Jul 2015 15:29:07 +0000 (18:29 +0300)
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
neutron/tests/unit/agent/l3/test_namespace_manager.py

index 51464e4e5bd48b0f361066606300b41c99172d3c..31df5d227476c7e27d4e2f4145891b7cf62d5438 100644 (file)
@@ -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:
index 706b89945514777eaf2d62345f955f76824f22fb..956099136bd423281662f666320b3df3aa5b6adc 100644 (file)
@@ -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)