Merge "[OVN] Only update the MTU of the router GW LRPs"

This commit is contained in:
Zuul 2025-05-08 11:25:54 +00:00 committed by Gerrit Code Review
commit ec34283b9d
3 changed files with 80 additions and 7 deletions

View File

@ -1843,7 +1843,8 @@ class OVNClient:
for gw_port in gw_ports:
provider_net = self._plugin.get_network(
context, gw_port['network_id'])
self.set_gateway_mtu(context, provider_net)
self.set_gateway_mtu(context, provider_net, txn=txn,
router_id=router_id)
if _has_separate_snat_per_subnet(router):
for fixed_ip in port['fixed_ips']:
@ -1991,7 +1992,8 @@ class OVNClient:
for gw_port in gw_ports:
provider_net = self._plugin.get_network(
context, gw_port['network_id'])
self.set_gateway_mtu(context, provider_net, txn=txn)
self.set_gateway_mtu(context, provider_net, txn=txn,
router_id=router_id)
if _has_separate_snat_per_subnet(router):
for sid in subnet_ids:
@ -2168,10 +2170,13 @@ class OVNClient:
db_rev.delete_revision(
context, network_id, ovn_const.TYPE_NETWORKS)
def set_gateway_mtu(self, context, prov_net, txn=None):
ports = self._plugin.get_ports(
context, filters=dict(network_id=[prov_net['id']],
device_owner=[const.DEVICE_OWNER_ROUTER_GW]))
def set_gateway_mtu(self, context, prov_net, txn=None,
router_id=None):
_filters = {'network_id': [prov_net['id']],
'device_owner': [const.DEVICE_OWNER_ROUTER_GW]}
if router_id:
_filters['device_id'] = [router_id]
ports = self._plugin.get_ports(context, filters=_filters)
commands = []
for port in ports:
lrp_name = utils.ovn_lrouter_port_name(port['id'])
@ -2281,7 +2286,7 @@ class OVNClient:
# make sure to use admin context as this is a external
# network
self.set_gateway_mtu(n_context.get_admin_context(),
network, txn)
network, txn=txn)
self._check_network_changes_in_ha_chassis_groups(
context, lswitch, lswitch_params, txn)

View File

@ -320,6 +320,72 @@ class TestOVNClient(testlib_api.MySQLTestCaseMixin,
self._check_gw_lrp_mtu(router_id,
min(router_attached_net_mtus))
def test_create_router_port_multiple_routers(self):
# The goal of this test is to check that the GW LRPs are updated when
# the same network is the external GW for several routers.
net_ext_args = {provider_net.NETWORK_TYPE: 'geneve',
external_net.EXTERNAL: True,
mtu_def.MTU: 1400}
net_ext = self._make_network(self.fmt, 'test-ext-net', True,
as_admin=True,
arg_list=tuple(net_ext_args.keys()),
**net_ext_args)
ext_gw = {'network_id': net_ext['network']['id']}
self._make_subnet(self.fmt, net_ext,
gateway=constants.ATTR_NOT_SPECIFIED,
cidr='10.100.0.0/24')
nets_int = []
routers = []
subnets = []
for idx in range(3):
cidr = f'10.{idx}.0.0/24'
net_int_args = {provider_net.NETWORK_TYPE: 'geneve',
mtu_def.MTU: 1300 + idx}
nets_int.append(self._make_network(
self.fmt, 'test-int-net', True, as_admin=True,
arg_list=tuple(net_ext_args.keys()), **net_int_args))
subnets.append(self._make_subnet(
self.fmt, nets_int[-1],
gateway=constants.ATTR_NOT_SPECIFIED, cidr=cidr))
routers.append(self._make_router(
self.fmt, external_gateway_info=ext_gw))
for router in routers:
lr_name = ovn_utils.ovn_name(router['router']['id'])
lrp = self.nb_api.lrp_list(lr_name).execute(check_errors=True)[0]
self.assertEqual(1400, int(lrp.options['gateway_mtu']))
# Add to every router a new internal subnet. That must update the
# GW LRP MTU.
for idx, router in enumerate(routers):
lr_name = ovn_utils.ovn_name(router['router']['id'])
subnet = subnets[idx]
self._router_interface_action(
'add', router['router']['id'], subnet['subnet']['id'],
None)
lrps = self.nb_api.lrp_list(lr_name).execute(check_errors=True)
for lrp in lrps:
if strutils.bool_from_string(
lrp.external_ids[ovn_const.OVN_ROUTER_IS_EXT_GW]):
# New MTU=1300+idx (old MTU=1400)
self.assertEqual(1300 + idx,
int(lrp.options['gateway_mtu']))
# Remove the internal subnet. The GW LRP should restore the GW network
# MTU=1400.
for idx, router in enumerate(routers):
lr_name = ovn_utils.ovn_name(router['router']['id'])
subnet = subnets[idx]
self._router_interface_action(
'remove', router['router']['id'], subnet['subnet']['id'],
None)
lrps = self.nb_api.lrp_list(lr_name).execute(check_errors=True)
for lrp in lrps:
if strutils.bool_from_string(
lrp.external_ids[ovn_const.OVN_ROUTER_IS_EXT_GW]):
# GW network MTU=1400
self.assertEqual(1400, int(lrp.options['gateway_mtu']))
def test_update_port_with_qos(self):
def _check_bw(port_id, max_kbps=None, max_burst_kbps=None):
lsp = self.nb_api.lookup('Logical_Switch_Port', port_id)

View File

@ -470,6 +470,8 @@ class BaseTestOVNL3RouterPluginMixin():
router_id = 'router-id'
self.l3_inst._nb_ovn.db_get.return_value.execute.return_value = {
ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY: utils.ovn_name(router_id)}
self.l3_inst._nb_ovn.lookup.return_value = mock.Mock(
external_ids={'neutron:router_name': router_id})
payload = self._create_payload_for_router_interface(router_id,
pass_subnet=False)
self.ovn_drv._process_remove_router_interface(