Fix ML2/OVN OVSDB handling of gateway ports

The ML2/OVN OVSDB maintenance tasks
check_redirect_type_router_gateway_ports and
add_gw_port_info_to_logical_router_port are fixed to handle
properly the gateway ports of user defined flavor routers.
They should be ignored because they don't exist in the OVN
database.

Closes-Bug: #2064778

Change-Id: I75c49e2b00ea186d0d34f9441eb86034de31b21e
This commit is contained in:
Miguel Lavalle
2024-05-03 19:04:19 -05:00
parent a3d0fb6673
commit 466b0f4978
2 changed files with 47 additions and 16 deletions

View File

@@ -665,6 +665,10 @@ class DBInconsistenciesPeriodics(SchemaAwarePeriodicsBase):
gw_ports = self._ovn_client._plugin.get_ports(
context, {'device_owner': [n_const.DEVICE_OWNER_ROUTER_GW]})
for gw_port in gw_ports:
router = self._ovn_client._l3_plugin.get_router(
context, gw_port['device_id'])
if not utils.is_ovn_provider_router(router):
continue
enable_redirect = False
if ovn_conf.is_ovn_distributed_floating_ip():
try:
@@ -935,7 +939,9 @@ class DBInconsistenciesPeriodics(SchemaAwarePeriodicsBase):
"""Add info if LRP is connecting internal subnet or ext gateway."""
cmds = []
context = n_context.get_admin_context()
for router in self._ovn_client._l3_plugin.get_routers(context):
filters = {'flavor_id': [None]}
for router in self._ovn_client._l3_plugin.get_routers(context,
filters=filters):
ext_gw_networks = [
ext_gw['network_id'] for ext_gw in router['external_gateways']]
rtr_name = 'neutron-{}'.format(router['id'])

View File

@@ -694,13 +694,22 @@ class TestDBInconsistenciesPeriodics(testlib_api.SqlTestCaseLight,
nb_idl.db_set.assert_has_calls(expected_calls)
def _test_check_redirect_type_router_gateway_ports(self, networks,
redirect_value):
redirect_value,
flavored_router=False):
self.fake_ovn_client._plugin.get_ports.return_value = [{
'device_owner': n_const.DEVICE_OWNER_ROUTER_GW,
'id': 'fake-id',
'device_id': 'fake-device-id'}]
self.fake_ovn_client._get_router_ports.return_value = []
self.fake_ovn_client._plugin.get_networks.return_value = networks
if flavored_router:
self.fake_ovn_client._l3_plugin.get_router.return_value = {
'id': 'fake-id',
'flavor_id': 'fake-flavor-id'}
else:
self.fake_ovn_client._l3_plugin.get_router.return_value = {
'id': 'fake-id',
'flavor_id': None}
lrp_redirect = fakes.FakeOvsdbRow.create_one_ovsdb_row(
attrs={
@@ -721,21 +730,25 @@ class TestDBInconsistenciesPeriodics(testlib_api.SqlTestCaseLight,
periodics.NeverAgain,
self.periodic.check_redirect_type_router_gateway_ports)
if redirect_value:
expected_calls = [
mock.call.db_set('Logical_Router_Port',
mock.ANY,
('options', {'redirect-type': 'bridged'}))
]
self.fake_ovn_client._nb_idl.db_set.assert_has_calls(
expected_calls)
if flavored_router:
self.fake_ovn_client._nb_idl.db_set.assert_not_called()
self.fake_ovn_client._nb_idl.db_remove.assert_not_called()
else:
expected_calls = [
mock.call.db_remove('Logical_Router_Port', mock.ANY,
'options', 'redirect-type')
]
self.fake_ovn_client._nb_idl.db_remove.assert_has_calls(
expected_calls)
if redirect_value:
expected_calls = [
mock.call.db_set('Logical_Router_Port',
mock.ANY,
('options', {'redirect-type': 'bridged'}))
]
self.fake_ovn_client._nb_idl.db_set.assert_has_calls(
expected_calls)
else:
expected_calls = [
mock.call.db_remove('Logical_Router_Port', mock.ANY,
'options', 'redirect-type')
]
self.fake_ovn_client._nb_idl.db_remove.assert_has_calls(
expected_calls)
def test_check_redirect_type_router_gateway_ports_enable_redirect(self):
cfg.CONF.set_override('enable_distributed_floating_ip', 'True',
@@ -751,6 +764,18 @@ class TestDBInconsistenciesPeriodics(testlib_api.SqlTestCaseLight,
'provider:network_type': n_const.TYPE_GENEVE}]
self._test_check_redirect_type_router_gateway_ports(networks, False)
def test_check_redirect_type_router_gateway_ports_flavored_router(self):
cfg.CONF.set_override('enable_distributed_floating_ip', 'True',
group='ovn')
networks = [{'network_id': 'foo',
'provider:network_type': n_const.TYPE_VLAN}]
self._test_check_redirect_type_router_gateway_ports(
networks, True, flavored_router=True)
networks = [{'network_id': 'foo',
'provider:network_type': n_const.TYPE_GENEVE}]
self._test_check_redirect_type_router_gateway_ports(
networks, False, flavored_router=True)
def _test_check_vlan_distributed_ports(self, opt_value=None):
fake_net0 = {'id': 'net0'}
fake_net1 = {'id': 'net1'}