Merge "DVR: rebind port if ofport changes" into stable/mitaka

This commit is contained in:
Jenkins 2016-04-17 17:45:40 +00:00 committed by Gerrit Code Review
commit 35d071a750
2 changed files with 59 additions and 20 deletions

View File

@ -572,6 +572,12 @@ class OVSDVRNeutronAgent(object):
local_vlan_map.network_type))
return
if (port.vif_id in self.local_ports and
self.local_ports[port.vif_id].ofport != port.ofport):
LOG.info(_LI("DVR: Port %(vif)s changed port number to "
"%(ofport)s, rebinding."),
{'vif': port.vif_id, 'ofport': port.ofport})
self.unbind_port_from_dvr(port, local_vlan_map)
if device_owner == n_const.DEVICE_OWNER_DVR_INTERFACE:
self._bind_distributed_router_interface_port(port,
local_vlan_map,

View File

@ -2336,6 +2336,58 @@ class TestOvsDvrNeutronAgent(object):
def test_port_bound_for_dvr_with_csnat_ports(self):
self._setup_for_dvr_test()
int_br, tun_br = self._port_bound_for_dvr_with_csnat_ports()
lvid = self.agent.local_vlan_map[self._net_uuid].vlan
expected_on_int_br = [
mock.call.install_dvr_to_src_mac(
network_type='vxlan',
gateway_mac='aa:bb:cc:11:22:33',
dst_mac=self._port.vif_mac,
dst_port=self._port.ofport,
vlan_tag=lvid,
),
] + self._expected_port_bound(self._port, lvid, is_dvr=False)
self.assertEqual(expected_on_int_br, int_br.mock_calls)
expected_on_tun_br = [
mock.call.provision_local_vlan(
network_type='vxlan',
lvid=lvid,
segmentation_id=None,
distributed=True,
),
]
self.assertEqual(expected_on_tun_br, tun_br.mock_calls)
def test_port_bound_for_dvr_with_csnat_ports_ofport_change(self):
self._setup_for_dvr_test()
self._port_bound_for_dvr_with_csnat_ports()
# simulate a replug
self._port.ofport = 12
int_br, tun_br = self._port_bound_for_dvr_with_csnat_ports()
lvid = self.agent.local_vlan_map[self._net_uuid].vlan
expected_on_int_br = [
mock.call.delete_dvr_to_src_mac(
network_type='vxlan',
dst_mac=self._port.vif_mac,
vlan_tag=lvid,
),
mock.call.install_dvr_to_src_mac(
network_type='vxlan',
gateway_mac='aa:bb:cc:11:22:33',
dst_mac=self._port.vif_mac,
dst_port=self._port.ofport,
vlan_tag=lvid,
),
] + self._expected_port_bound(self._port, lvid, is_dvr=False)
self.assertEqual(expected_on_int_br, int_br.mock_calls)
# a local vlan was already provisioned so there should be no new
# calls to tunbr
self.assertEqual([], tun_br.mock_calls)
# make sure ofport was updated
self.assertEqual(12,
self.agent.dvr_agent.local_ports[self._port.vif_id].ofport)
def _port_bound_for_dvr_with_csnat_ports(self):
int_br = mock.create_autospec(self.agent.int_br)
tun_br = mock.create_autospec(self.agent.tun_br)
int_br.set_db_attribute.return_value = True
@ -2361,26 +2413,7 @@ class TestOvsDvrNeutronAgent(object):
None, None, self._fixed_ips,
n_const.DEVICE_OWNER_ROUTER_SNAT,
False)
lvid = self.agent.local_vlan_map[self._net_uuid].vlan
expected_on_int_br = [
mock.call.install_dvr_to_src_mac(
network_type='vxlan',
gateway_mac='aa:bb:cc:11:22:33',
dst_mac=self._port.vif_mac,
dst_port=self._port.ofport,
vlan_tag=lvid,
),
] + self._expected_port_bound(self._port, lvid, is_dvr=False)
self.assertEqual(expected_on_int_br, int_br.mock_calls)
expected_on_tun_br = [
mock.call.provision_local_vlan(
network_type='vxlan',
lvid=lvid,
segmentation_id=None,
distributed=True,
),
]
self.assertEqual(expected_on_tun_br, tun_br.mock_calls)
return int_br, tun_br
def test_port_bound_for_dvr_with_csnat_ports_without_subnet(self):
self._setup_for_dvr_test()