[OVN] Remove VLAN check when setting external_mac

This patch reverts [0].

The code wasn't accounting for VLAN provider networks, as stated in the
bug #1842988, DVR won't work if the provider network (where the FIP is
created) is VLAN.

There was also an incosistency in how the external_mac was set for the
VLAN networks. Upon creating the FIP the code was checking for the
network type and not setting the external_mac attribute in case the
network was VLAN type. But, if the port went down and up again (e.g if
you reboot the VM) the event handler that set/unset the external_mac [1]
wasn't check for the type. This is how people worked around the DVR
problem (as stated in bug #1842988).

For more information see bug #1842988.

[0]
c5aef51edc
[1]
eda5d7f80d/networking_ovn/ml2/mech_driver.py (L794-L800)

Change-Id: Ifb795626dc9c2ac4f0104f491dd38c9b4cc902c9
Closes-Bug: #1842988
Signed-off-by: Lucas Alvares Gomes <lucasagomes@gmail.com>
This commit is contained in:
Lucas Alvares Gomes 2020-01-22 15:00:32 +00:00
parent f173e2ee08
commit c471c7330c
2 changed files with 8 additions and 24 deletions

View File

@ -834,10 +834,7 @@ class OVNClient(object):
columns['logical_port'] = floatingip['port_id']
ext_ids[ovn_const.OVN_FIP_EXT_MAC_KEY] = port['mac_address']
if self._nb_idl.lsp_get_up(floatingip['port_id']).execute():
port_net = self._plugin.get_network(admin_context,
port['network_id'])
if port_net.get(pnet.NETWORK_TYPE) != const.TYPE_VLAN:
columns['external_mac'] = port['mac_address']
columns['external_mac'] = port['mac_address']
# TODO(dalvarez): remove this check once the minimum OVS required
# version contains the column (when OVS 2.8.2 is released).

View File

@ -1088,8 +1088,7 @@ class TestOVNL3RouterPlugin(test_mech_driver.Ml2PluginV2TestCase):
@mock.patch('neutron.db.l3_db.L3_NAT_dbonly_mixin._get_floatingip')
@mock.patch('neutron.db.extraroute_db.ExtraRoute_dbonly_mixin.'
'update_floatingip')
def _test_update_floatingip_associate_distributed(self, network_type,
uf, gf, gp, gn):
def test_update_floatingip_associate_distributed(self, uf, gf, gp, gn):
self.get_a_ctx_mock_p.stop()
self.l3_inst._ovn.is_col_present.return_value = True
self.fake_floating_ip.update({'fixed_port_id': None})
@ -1099,7 +1098,7 @@ class TestOVNL3RouterPlugin(test_mech_driver.Ml2PluginV2TestCase):
uf.return_value = self.fake_floating_ip_new
fake_network_vlan = self.fake_network
fake_network_vlan[pnet.NETWORK_TYPE] = network_type
fake_network_vlan[pnet.NETWORK_TYPE] = constants.TYPE_FLAT
gn.return_value = fake_network_vlan
config.cfg.CONF.set_override(
@ -1114,23 +1113,11 @@ class TestOVNL3RouterPlugin(test_mech_driver.Ml2PluginV2TestCase):
ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY: utils.ovn_name(
self.fake_floating_ip_new['router_id']),
ovn_const.OVN_FIP_EXT_MAC_KEY: '00:01:02:03:04:05'}
if network_type == constants.TYPE_VLAN:
self.l3_inst._ovn.add_nat_rule_in_lrouter.assert_called_once_with(
'neutron-new-router-id', type='dnat_and_snat',
logical_ip='10.10.10.10', external_ip='192.168.0.10',
logical_port='new-port_id', external_ids=expected_ext_ids)
else:
self.l3_inst._ovn.add_nat_rule_in_lrouter.assert_called_once_with(
'neutron-new-router-id', type='dnat_and_snat',
logical_ip='10.10.10.10', external_ip='192.168.0.10',
external_mac='00:01:02:03:04:05', logical_port='new-port_id',
external_ids=expected_ext_ids)
def test_update_floatingip_associate_distributed_flat(self):
self._test_update_floatingip_associate_distributed(constants.TYPE_FLAT)
def test_update_floatingip_associate_distributed_vlan(self):
self._test_update_floatingip_associate_distributed(constants.TYPE_VLAN)
self.l3_inst._ovn.add_nat_rule_in_lrouter.assert_called_once_with(
'neutron-new-router-id', type='dnat_and_snat',
logical_ip='10.10.10.10', external_ip='192.168.0.10',
external_mac='00:01:02:03:04:05', logical_port='new-port_id',
external_ids=expected_ext_ids)
@mock.patch('neutron.db.l3_db.L3_NAT_dbonly_mixin._get_floatingip')
@mock.patch('neutron.db.extraroute_db.ExtraRoute_dbonly_mixin.'