diff --git a/neutron/agent/l3/agent.py b/neutron/agent/l3/agent.py index 93637b855de..33d7148c237 100644 --- a/neutron/agent/l3/agent.py +++ b/neutron/agent/l3/agent.py @@ -578,7 +578,7 @@ class L3NATAgent(ha.AgentMixin, lib_const.L3_AGENT_MODE_DVR_SNAT) if ext_net_id: ns_manager.keep_ext_net(ext_net_id) - elif is_snat_agent: + elif is_snat_agent and not r.get('ha'): ns_manager.ensure_snat_cleanup(r['id']) # For HA routers check that DB state matches actual state if r.get('ha'): diff --git a/neutron/tests/unit/agent/l3/test_agent.py b/neutron/tests/unit/agent/l3/test_agent.py index 47177e59be5..e0412945814 100644 --- a/neutron/tests/unit/agent/l3/test_agent.py +++ b/neutron/tests/unit/agent/l3/test_agent.py @@ -37,6 +37,7 @@ from neutron.agent.l3 import dvr_snat_ns from neutron.agent.l3 import ha from neutron.agent.l3 import legacy_router from neutron.agent.l3 import link_local_allocator as lla +from neutron.agent.l3 import namespace_manager from neutron.agent.l3 import namespaces from neutron.agent.l3 import router_info as l3router from neutron.agent.l3 import router_processing_queue @@ -298,6 +299,28 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): agent.periodic_sync_routers_task(agent.context) self.assertFalse(agent.namespaces_manager._clean_stale) + def test_periodic_sync_routers_task_call_ensure_snat_cleanup(self): + agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) + agent.conf.agent_mode = 'dvr_snat' + dvr_ha_router = {'id': _uuid(), + 'external_gateway_info': {}, + 'routes': [], + 'distributed': True, + 'ha': True} + dvr_router = {'id': _uuid(), + 'external_gateway_info': {}, + 'routes': [], + 'distributed': True, + 'ha': False} + routers = [dvr_router, dvr_ha_router] + self.plugin_api.get_router_ids.return_value = [r['id'] for r + in routers] + self.plugin_api.get_routers.return_value = routers + with mock.patch.object(namespace_manager.NamespaceManager, + 'ensure_snat_cleanup') as ensure_snat_cleanup: + agent.periodic_sync_routers_task(agent.context) + ensure_snat_cleanup.assert_called_once_with(dvr_router['id']) + def test_periodic_sync_routers_task_call_clean_stale_meta_proxies(self): agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) stale_router_ids = [_uuid(), _uuid()]