From b220d10125c859367069eeb43ea45e3650a782f9 Mon Sep 17 00:00:00 2001 From: Oleg Bondarev Date: Fri, 7 Aug 2015 19:56:13 +0300 Subject: [PATCH] Do not delete fip namespace during l3 dvr agent resync This was introduced by commit 46608806aa7a9c60214e28429ca5a8b87b2a15de which didn't take into account that fip namespace name is composed from external network id rather than router id. The fix is to ensure fip namespaces for the known routers are kept by namespace manager on agent resync. Closes-Bug: #1482521 Change-Id: I0ffd0a3f6d83f7356638827a1cfe4dabef24b891 --- neutron/agent/l3/agent.py | 6 ++++++ neutron/agent/l3/namespace_manager.py | 3 +++ .../tests/unit/agent/l3/test_namespace_manager.py | 12 ++++++------ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/neutron/agent/l3/agent.py b/neutron/agent/l3/agent.py index 23906bc3d..3bfcee9e4 100644 --- a/neutron/agent/l3/agent.py +++ b/neutron/agent/l3/agent.py @@ -538,6 +538,12 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, LOG.debug('Processing :%r', routers) for r in routers: ns_manager.keep_router(r['id']) + if r.get('distributed'): + # need to keep fip namespaces as well + ext_net_id = (r['external_gateway_info'] or {}).get( + 'network_id') + if ext_net_id: + ns_manager.keep_ext_net(ext_net_id) update = queue.RouterUpdate(r['id'], queue.PRIORITY_SYNC_ROUTERS_TASK, router=r, diff --git a/neutron/agent/l3/namespace_manager.py b/neutron/agent/l3/namespace_manager.py index 31df5d227..24e665533 100644 --- a/neutron/agent/l3/namespace_manager.py +++ b/neutron/agent/l3/namespace_manager.py @@ -95,6 +95,9 @@ class NamespaceManager(object): def keep_router(self, router_id): self._ids_to_keep.add(router_id) + def keep_ext_net(self, ext_net_id): + self._ids_to_keep.add(ext_net_id) + def get_prefix_and_id(self, ns_name): """Get the prefix and id from the namespace name. diff --git a/neutron/tests/unit/agent/l3/test_namespace_manager.py b/neutron/tests/unit/agent/l3/test_namespace_manager.py index 956099136..228ffdad4 100644 --- a/neutron/tests/unit/agent/l3/test_namespace_manager.py +++ b/neutron/tests/unit/agent/l3/test_namespace_manager.py @@ -64,7 +64,9 @@ 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 + + ext_net_id = _uuid() + router_ns_name = dvr_fip_ns.FIP_NS_PREFIX + ext_net_id self.assertTrue(self.ns_manager.is_managed(router_ns_name)) self.assertFalse(self.ns_manager.is_managed('dhcp-' + router_id)) @@ -95,14 +97,12 @@ 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_fip_ns.FIP_NS_PREFIX + router_id] + dvr_snat_ns.SNAT_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_fip_ns.FIP_NS_PREFIX, router_id)] + mock.call(dvr_snat_ns.SNAT_NS_PREFIX, router_id)] mock_cleanup.assert_has_calls(expected, any_order=True) - self.assertEqual(3, mock_cleanup.call_count) + self.assertEqual(2, mock_cleanup.call_count) -- 2.45.2