From 7da955bf46e3e62f775afaad936006497e4320e3 Mon Sep 17 00:00:00 2001 From: Swaminathan Vasudevan Date: Thu, 6 Jul 2017 16:41:17 -0700 Subject: [PATCH] DVR: Fix router_update failure when agent restarts Router update task fails when agent restarts with DVR routers as it was failing adding an IP rule to the namespace. The IP rule matching code was not finding a match for a rule for an interface since we are not specifying an IP address, but the resulting rule does have the "any" IP address in its output, for example, 0.0.0.0/0. Change to always supply the IP address. Change-Id: Ic2e80ebb59ac9e0e0063e5f6e69f3d66abe775a1 Closes-Bug: #1702790 --- neutron/agent/linux/ip_lib.py | 7 +++++-- neutron/tests/functional/agent/l3/test_dvr_router.py | 12 ++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/neutron/agent/linux/ip_lib.py b/neutron/agent/linux/ip_lib.py index cdd37299e21..a7fb927de45 100644 --- a/neutron/agent/linux/ip_lib.py +++ b/neutron/agent/linux/ip_lib.py @@ -474,8 +474,11 @@ class IpRuleCommand(IpCommandBase): ip_version = common_utils.get_ip_version(ip) # In case if we need to add in a rule based on incoming - # interface we don't need to pass in the ip. - if not kwargs.get('iif'): + # interface, pass the "any" IP address, for example, 0.0.0.0/0, + # else pass the given IP. + if kwargs.get('iif'): + kwargs.update({'from': constants.IP_ANY[ip_version]}) + else: kwargs.update({'from': ip}) canonical_kwargs = self._make_canonical(ip_version, kwargs) diff --git a/neutron/tests/functional/agent/l3/test_dvr_router.py b/neutron/tests/functional/agent/l3/test_dvr_router.py index 9d024e25c9b..f6d4501b744 100644 --- a/neutron/tests/functional/agent/l3/test_dvr_router.py +++ b/neutron/tests/functional/agent/l3/test_dvr_router.py @@ -765,6 +765,18 @@ class TestDvrRouter(framework.L3AgentTestFramework): self._assert_dvr_snat_gateway(router1) self.assertTrue(self._namespace_exists(fip_ns)) + def test_dvr_router_update_on_restarted_agent_sets_rtr_fip_connect(self): + self.agent.conf.agent_mode = 'dvr_snat' + router_info = self.generate_dvr_router_info() + router1 = self.manage_router(self.agent, router_info) + self.assertTrue(router1.rtr_fip_connect) + fip_ns = router1.fip_ns.get_name() + self.assertTrue(self._namespace_exists(fip_ns)) + restarted_agent = neutron_l3_agent.L3NATAgentWithStateReport( + self.agent.host, self.agent.conf) + router_updated = self.manage_router(restarted_agent, router1.router) + self.assertTrue(router_updated.rtr_fip_connect) + def test_dvr_router_add_fips_on_restarted_agent(self): self.agent.conf.agent_mode = 'dvr' router_info = self.generate_dvr_router_info()