From: Sylvain Afchain Date: Thu, 20 Nov 2014 14:25:58 +0000 (+0000) Subject: Fix floating-ips in error state in dvr mode X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=c15923230da2a21d5fdb56c885baa7f3aa045090;p=openstack-build%2Fneutron-build.git Fix floating-ips in error state in dvr mode Before this fix an exception was raised when creating the veth between the fip namespace and the qrouter namespace when the veth was already present. This fix add a check to only create the veth if not present. Change-Id: Iefea9778223aac885bedfdacfdeacfce74776333 Closes-Bug: #1376013 --- diff --git a/neutron/agent/l3_agent.py b/neutron/agent/l3_agent.py index 728df0235..8f912b965 100644 --- a/neutron/agent/l3_agent.py +++ b/neutron/agent/l3_agent.py @@ -1600,14 +1600,16 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, rtr_2_fip, fip_2_rtr = ri.rtr_fip_subnet.get_pair() ip_wrapper = ip_lib.IPWrapper(self.root_helper, namespace=ri.ns_name) - int_dev = ip_wrapper.add_veth(rtr_2_fip_name, - fip_2_rtr_name, fip_ns_name) - self.internal_ns_interface_added(str(rtr_2_fip), - rtr_2_fip_name, ri.ns_name) - self.internal_ns_interface_added(str(fip_2_rtr), - fip_2_rtr_name, fip_ns_name) - int_dev[0].link.set_up() - int_dev[1].link.set_up() + if not ip_lib.device_exists(rtr_2_fip_name, self.root_helper, + namespace=ri.ns_name): + int_dev = ip_wrapper.add_veth(rtr_2_fip_name, + fip_2_rtr_name, fip_ns_name) + self.internal_ns_interface_added(str(rtr_2_fip), + rtr_2_fip_name, ri.ns_name) + self.internal_ns_interface_added(str(fip_2_rtr), + fip_2_rtr_name, fip_ns_name) + int_dev[0].link.set_up() + int_dev[1].link.set_up() # add default route for the link local interface device = ip_lib.IPDevice(rtr_2_fip_name, self.root_helper, namespace=ri.ns_name) diff --git a/neutron/tests/unit/test_l3_agent.py b/neutron/tests/unit/test_l3_agent.py index 73bd841a0..a63ea2dbf 100644 --- a/neutron/tests/unit/test_l3_agent.py +++ b/neutron/tests/unit/test_l3_agent.py @@ -2107,6 +2107,7 @@ vrrp_instance VR_1 { fip_ns_name = agent.get_fip_ns_name(str(fip['floating_network_id'])) with mock.patch.object(l3_agent.LinkLocalAllocator, '_write'): + self.device_exists.return_value = False agent.create_rtr_2_fip_link(ri, fip['floating_network_id']) self.mock_ip.add_veth.assert_called_with(rtr_2_fip_name, fip_2_rtr_name, fip_ns_name) @@ -2116,6 +2117,17 @@ vrrp_instance VR_1 { # TODO(mrsmith): test _create_agent_gateway_port + def test_create_rtr_2_fip_link_already_exists(self): + agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) + router = prepare_router_data() + + ri = l3_agent.RouterInfo(router['id'], self.conf.root_helper, + router=router) + self.device_exists.return_value = True + with mock.patch.object(l3_agent.LinkLocalAllocator, '_write'): + agent.create_rtr_2_fip_link(ri, {}) + self.assertFalse(self.mock_ip.add_veth.called) + def test_floating_ip_added_dist(self): agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) router = prepare_router_data()