From: Oleg Bondarev Date: Fri, 7 Aug 2015 16:56:13 +0000 (+0300) Subject: Do not delete fip namespace during l3 dvr agent resync X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=b220d10125c859367069eeb43ea45e3650a782f9;p=openstack-build%2Fneutron-build.git 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 --- 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)