[ovn] Add helper for retrieving LR associated with LRP

This will be used in the next patch set to implement anti-affinity
scheduling for routers with multiple LRPs.

Partial-Bug: #2002687
Signed-off-by: Frode Nordahl <frode.nordahl@canonical.com>
Change-Id: Iff958195f229f7e0714f1285bb3d53497aeec9aa
This commit is contained in:
Frode Nordahl 2023-02-13 14:01:08 +01:00
parent 0bae4b70b6
commit 898498ca3b
No known key found for this signature in database
GPG Key ID: 6A5D59A3BA48373F
3 changed files with 39 additions and 0 deletions

View File

@ -785,6 +785,31 @@ class OvsdbNbOvnIdl(nb_impl_idl.OvnNbApiIdlImpl, Backend):
gw_ports.append(lrp)
return gw_ports
def get_lrouter_by_lrouter_port(self, lrp_name):
"""Get LR by name of LRP.
:param lrp_name: Name of LRP.
:type lrp_name: str
:returns: LR associated with LRP as represented by lrp_name.
:rtype: Optional[ovs_idl.rowview.RowView]
"""
lrp = self.get_lrouter_port(lrp_name)
if not lrp:
return None
# NOTE(fnordahl) This could be replaced by something like:
#
# lr = self.db_find_rows(
# 'Logical_Router',
# ('ports', '{>}', lrp.uuid))
#
# However, ovsdbapp does not currently support the '{>}' operator.
for lr in self._tables['Logical_Router'].rows.values():
lr_ports = getattr(lr, 'ports', set())
if lrp in lr_ports:
return lr
return None
def delete_lrouter_ext_gw(self, lrouter_name, if_exists=True):
return cmd.DeleteLRouterExtGwCommand(self, lrouter_name, if_exists)

View File

@ -166,6 +166,7 @@ class FakeOvsdbNbOvnIdl(object):
self.get_schema_version = mock.Mock(return_value='3.6.0')
self.get_lrouter_port = mock.Mock()
self.schedule_unhosted_gateways = mock.Mock()
self.get_lrouter_by_lrouter_port = mock.Mock()
class FakeOvsdbSbOvnIdl(object):

View File

@ -913,6 +913,19 @@ class TestNBImplIdlOvn(TestDBImplIdlOvn):
utils.ovn_name('lr-id-f'))
self.assertEqual([gw1_row], gw_ports)
def test_get_lrouter_by_lrouter_port(self):
self.assertIsNone(
self.nb_ovn_idl.get_lrouter_by_lrouter_port('not_there'))
self._load_nb_db()
self.assertIsNone(
self.nb_ovn_idl.get_lrouter_by_lrouter_port('not_there'))
lr_row = self._find_ovsdb_fake_row(
self.lrouter_table,
'name',
utils.ovn_name('lr-id-a'))
lr = self.nb_ovn_idl.get_lrouter_by_lrouter_port('lrp-orp-id-a1')
self.assertEqual(lr.uuid, lr_row.uuid)
class TestSBImplIdlOvnBase(TestDBImplIdlOvn):