Merge "DVR: rebind port if ofport changes" into stable/mitaka
This commit is contained in:
commit
35d071a750
|
@ -572,6 +572,12 @@ class OVSDVRNeutronAgent(object):
|
||||||
local_vlan_map.network_type))
|
local_vlan_map.network_type))
|
||||||
return
|
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:
|
if device_owner == n_const.DEVICE_OWNER_DVR_INTERFACE:
|
||||||
self._bind_distributed_router_interface_port(port,
|
self._bind_distributed_router_interface_port(port,
|
||||||
local_vlan_map,
|
local_vlan_map,
|
||||||
|
|
|
@ -2336,6 +2336,58 @@ class TestOvsDvrNeutronAgent(object):
|
||||||
|
|
||||||
def test_port_bound_for_dvr_with_csnat_ports(self):
|
def test_port_bound_for_dvr_with_csnat_ports(self):
|
||||||
self._setup_for_dvr_test()
|
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)
|
int_br = mock.create_autospec(self.agent.int_br)
|
||||||
tun_br = mock.create_autospec(self.agent.tun_br)
|
tun_br = mock.create_autospec(self.agent.tun_br)
|
||||||
int_br.set_db_attribute.return_value = True
|
int_br.set_db_attribute.return_value = True
|
||||||
|
@ -2361,26 +2413,7 @@ class TestOvsDvrNeutronAgent(object):
|
||||||
None, None, self._fixed_ips,
|
None, None, self._fixed_ips,
|
||||||
n_const.DEVICE_OWNER_ROUTER_SNAT,
|
n_const.DEVICE_OWNER_ROUTER_SNAT,
|
||||||
False)
|
False)
|
||||||
lvid = self.agent.local_vlan_map[self._net_uuid].vlan
|
return int_br, tun_br
|
||||||
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_without_subnet(self):
|
def test_port_bound_for_dvr_with_csnat_ports_without_subnet(self):
|
||||||
self._setup_for_dvr_test()
|
self._setup_for_dvr_test()
|
||||||
|
|
Loading…
Reference in New Issue