DVR: Ensure fpr and rfp devices are configured correctly

Restarting the l3-agent when creating the fip namespace may
leave rfp and fpr devices with no IP addresses, since we will
not try and configure them if the devices already exist.

Fix this by always trying to configure the IP addresses,
even if the devices already exist.

Closes-Bug: #1566383
(cherry picked from commit a47d22942a)

Change-Id: Idad3bb4808ec66b9a764bb621dfb04a10eb7ed6
This commit is contained in:
Brian Haley 2016-05-05 10:07:36 -04:00 committed by Ihar Hrachyshka
parent b6d99239cf
commit 18bb187632
2 changed files with 21 additions and 6 deletions

View File

@ -229,7 +229,8 @@ class FipNamespace(namespaces.Namespace):
ipd.route.add_gateway(gw_ip)
def _add_cidr_to_device(self, device, ip_cidr):
device.addr.add(ip_cidr, add_broadcast=False)
if not device.addr.list(to=ip_cidr):
device.addr.add(ip_cidr, add_broadcast=False)
def create_rtr_2_fip_link(self, ri):
"""Create interface between router and Floating IP namespace."""
@ -243,14 +244,13 @@ class FipNamespace(namespaces.Namespace):
ri.rtr_fip_subnet = self.local_subnets.allocate(ri.router_id)
rtr_2_fip, fip_2_rtr = ri.rtr_fip_subnet.get_pair()
rtr_2_fip_dev = ip_lib.IPDevice(rtr_2_fip_name, namespace=ri.ns_name)
fip_2_rtr_dev = ip_lib.IPDevice(fip_2_rtr_name, namespace=fip_ns_name)
if not rtr_2_fip_dev.exists():
ip_wrapper = ip_lib.IPWrapper(namespace=ri.ns_name)
rtr_2_fip_dev, fip_2_rtr_dev = ip_wrapper.add_veth(rtr_2_fip_name,
fip_2_rtr_name,
fip_ns_name)
self._add_cidr_to_device(rtr_2_fip_dev, str(rtr_2_fip))
self._add_cidr_to_device(fip_2_rtr_dev, str(fip_2_rtr))
mtu = (self.agent_conf.network_device_mtu or
ri.get_ex_gw_port().get('mtu'))
if mtu:
@ -259,6 +259,9 @@ class FipNamespace(namespaces.Namespace):
rtr_2_fip_dev.link.set_up()
fip_2_rtr_dev.link.set_up()
self._add_cidr_to_device(rtr_2_fip_dev, str(rtr_2_fip))
self._add_cidr_to_device(fip_2_rtr_dev, str(fip_2_rtr))
# add default route for the link local interface
rtr_2_fip_dev.route.add_gateway(str(fip_2_rtr.ip), table=FIP_RT_TBL)
#setup the NAT rules and chains

View File

@ -218,7 +218,8 @@ class TestDvrFipNs(base.BaseTestCase):
@mock.patch.object(ip_lib, 'IPWrapper')
@mock.patch.object(ip_lib, 'IPDevice')
def _test_create_rtr_2_fip_link(self, dev_exists, IPDevice, IPWrapper):
def _test_create_rtr_2_fip_link(self, dev_exists, addr_exists,
IPDevice, IPWrapper):
ri = mock.Mock()
ri.router_id = _uuid()
ri.rtr_fip_subnet = None
@ -231,11 +232,13 @@ class TestDvrFipNs(base.BaseTestCase):
self.fip_ns.local_subnets = allocator = mock.Mock()
pair = lla.LinkLocalAddressPair('169.254.31.28/31')
allocator.allocate.return_value = pair
addr_pair = pair.get_pair()
ip_wrapper = IPWrapper()
self.conf.network_device_mtu = 2000
ip_wrapper.add_veth.return_value = (IPDevice(), IPDevice())
device = IPDevice()
device.exists.return_value = dev_exists
device.addr.list.return_value = addr_exists
self.fip_ns.create_rtr_2_fip_link(ri)
@ -248,14 +251,23 @@ class TestDvrFipNs(base.BaseTestCase):
self.assertEqual(2, device.link.set_mtu.call_count)
self.assertEqual(2, device.link.set_up.call_count)
if not addr_exists:
expected = [mock.call(str(addr_pair[0]), add_broadcast=False),
mock.call(str(addr_pair[1]), add_broadcast=False)]
device.addr.add.assert_has_calls(expected)
self.assertEqual(2, device.addr.add.call_count)
device.route.add_gateway.assert_called_once_with(
'169.254.31.29', table=16)
def test_create_rtr_2_fip_link(self):
self._test_create_rtr_2_fip_link(False)
self._test_create_rtr_2_fip_link(False, False)
def test_create_rtr_2_fip_link_already_exists(self):
self._test_create_rtr_2_fip_link(True)
self._test_create_rtr_2_fip_link(True, False)
def test_create_rtr_2_fip_link_and_addr_already_exist(self):
self._test_create_rtr_2_fip_link(True, True)
@mock.patch.object(ip_lib, 'IPDevice')
def _test_scan_fip_ports(self, ri, ip_list, IPDevice):