Improve OVNLBMemberCreateDeleteEvent watching event

Minimize the number of SB calls to be made for certain events

Change-Id: I08b4b22565bc90750736849c3a7a6d3049009dd2
This commit is contained in:
Luis Tomas Bolivar 2023-03-16 16:11:52 +01:00
parent d9c7de6465
commit ddb740e2e4
2 changed files with 36 additions and 14 deletions

View File

@ -13,13 +13,15 @@
# limitations under the License. # limitations under the License.
from oslo_concurrency import lockutils from oslo_concurrency import lockutils
from oslo_config import cfg
from oslo_log import log as logging from oslo_log import log as logging
from ovsdbapp.backend.ovs_idl import event as row_event from ovsdbapp.backend.ovs_idl import event as row_event
from ovn_bgp_agent import constants from ovn_bgp_agent import constants
from ovn_bgp_agent.drivers.openstack.watchers import base_watcher from ovn_bgp_agent.drivers.openstack.watchers import base_watcher
CONF = cfg.CONF
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
_SYNC_STATE_LOCK = lockutils.ReaderWriterLock() _SYNC_STATE_LOCK = lockutils.ReaderWriterLock()
@ -369,6 +371,8 @@ class OVNLBMemberCreateDeleteEvent(base_watcher.OVNLBMemberEvent):
# loadbalancer has the VIP on a provider network # loadbalancer has the VIP on a provider network
# Also, the cr-lrp port needs to have subnet datapaths (LS) associated # Also, the cr-lrp port needs to have subnet datapaths (LS) associated
# to it that include the load balancer # to it that include the load balancer
if not self.agent.ovn_local_cr_lrps:
return
try: try:
row_dp = row.datapaths row_dp = row.datapaths
except AttributeError: except AttributeError:
@ -389,6 +393,19 @@ class OVNLBMemberCreateDeleteEvent(base_watcher.OVNLBMemberEvent):
if not vip_port: if not vip_port:
return return
associated_cr_lrp_port = None associated_cr_lrp_port = None
router_dps = []
if not (CONF.expose_tenant_networks or
CONF.expose_ipv6_gua_tenant_networks):
# assume all the members are connected through the same router
# so only one member needs to be checked
member_dp = row_dp[0]
# get lrps on that dp (patch ports)
router_lrps = (
self.agent.sb_idl.get_lrps_for_datapath(member_dp))
for lrp in router_lrps:
router_dps.append(self.agent.sb_idl.get_port_datapath(lrp))
for cr_lrp_port, cr_lrp_info in self.agent.ovn_local_cr_lrps.items(): for cr_lrp_port, cr_lrp_info in self.agent.ovn_local_cr_lrps.items():
if vip_port.datapath != cr_lrp_info.get('provider_datapath'): if vip_port.datapath != cr_lrp_info.get('provider_datapath'):
continue continue
@ -398,20 +415,9 @@ class OVNLBMemberCreateDeleteEvent(base_watcher.OVNLBMemberEvent):
associated_cr_lrp_port = cr_lrp_port associated_cr_lrp_port = cr_lrp_port
break break
else: else:
# assume all the members are connected through the same router if cr_lrp_info.get('router_datapath') in router_dps:
# so only one member needs to be checked
member_dp = row_dp[0]
# get lrps on that dp (patch ports)
router_lrps = (
self.agent.sb_idl.get_lrps_for_datapath(member_dp))
for lrp in router_lrps:
router_dp = self.agent.sb_idl.get_port_datapath(lrp)
if router_dp == cr_lrp_info.get('router_datapath'):
associated_cr_lrp_port = cr_lrp_port associated_cr_lrp_port = cr_lrp_port
break break
if associated_cr_lrp_port:
break
else: else:
return return

View File

@ -15,11 +15,15 @@
from unittest import mock from unittest import mock
from oslo_config import cfg
from ovn_bgp_agent import constants from ovn_bgp_agent import constants
from ovn_bgp_agent.drivers.openstack.watchers import bgp_watcher from ovn_bgp_agent.drivers.openstack.watchers import bgp_watcher
from ovn_bgp_agent.tests import base as test_base from ovn_bgp_agent.tests import base as test_base
from ovn_bgp_agent.tests import utils from ovn_bgp_agent.tests import utils
CONF = cfg.CONF
class TestPortBindingChassisCreatedEvent(test_base.TestCase): class TestPortBindingChassisCreatedEvent(test_base.TestCase):
@ -863,12 +867,16 @@ class TestOVNLBMemberCreateDeleteEvent(test_base.TestCase):
logical_port='ovn-lb-port-1', logical_port='ovn-lb-port-1',
external_ids={constants.OVN_CIDRS_EXT_ID_KEY: '172.24.100.66/26'}) external_ids={constants.OVN_CIDRS_EXT_ID_KEY: '172.24.100.66/26'})
self.agent.sb_idl.get_ovn_vip_port.return_value = vip_port self.agent.sb_idl.get_ovn_vip_port.return_value = vip_port
self.agent.sb_idl.get_lrps_for_datapath.return_value = ['fake-lrp']
self.agent.sb_idl.get_port_datapath.return_value = 'r_dp'
self.event.run(self.event.ROW_CREATE, row, mock.Mock()) self.event.run(self.event.ROW_CREATE, row, mock.Mock())
self.agent.expose_ovn_lb_on_provider.assert_called_once_with( self.agent.expose_ovn_lb_on_provider.assert_called_once_with(
'172.24.100.66', 'ovn-lb-port-1', 'cr-lrp1') '172.24.100.66', 'ovn-lb-port-1', 'cr-lrp1')
self.agent.withdraw_ovn_lb_on_provider.assert_not_called() self.agent.withdraw_ovn_lb_on_provider.assert_not_called()
def test_run_no_subnets_datapath(self): def test_run_no_subnets_datapath(self):
CONF.set_override('expose_tenant_networks', False)
self.addCleanup(CONF.clear_override, 'expose_tenant_networks')
dpg1 = utils.create_row(_uuid='fake_dp_group', dpg1 = utils.create_row(_uuid='fake_dp_group',
datapaths=['s_dp1']) datapaths=['s_dp1'])
row = utils.create_row(name='ovn-lb1', row = utils.create_row(name='ovn-lb1',
@ -912,6 +920,8 @@ class TestOVNLBMemberCreateDeleteEvent(test_base.TestCase):
datapath='dp2', datapath='dp2',
logical_port='ovn-lb-port-1', logical_port='ovn-lb-port-1',
external_ids={constants.OVN_CIDRS_EXT_ID_KEY: '172.24.100.66/26'}) external_ids={constants.OVN_CIDRS_EXT_ID_KEY: '172.24.100.66/26'})
self.agent.sb_idl.get_lrps_for_datapath.return_value = ['fake-lrp']
self.agent.sb_idl.get_port_datapath.return_value = 'dp2'
self.agent.sb_idl.get_ovn_vip_port.return_value = vip_port self.agent.sb_idl.get_ovn_vip_port.return_value = vip_port
self.event.run(self.event.ROW_CREATE, row, mock.Mock()) self.event.run(self.event.ROW_CREATE, row, mock.Mock())
self.agent.expose_ovn_lb_on_provider.assert_not_called() self.agent.expose_ovn_lb_on_provider.assert_not_called()
@ -927,6 +937,8 @@ class TestOVNLBMemberCreateDeleteEvent(test_base.TestCase):
datapath='dp1', datapath='dp1',
logical_port='ovn-lb-port-1', logical_port='ovn-lb-port-1',
external_ids={constants.OVN_CIDRS_EXT_ID_KEY: '172.24.100.66/26'}) external_ids={constants.OVN_CIDRS_EXT_ID_KEY: '172.24.100.66/26'})
self.agent.sb_idl.get_lrps_for_datapath.return_value = ['fake-lrp']
self.agent.sb_idl.get_port_datapath.return_value = 'r_dp'
self.agent.sb_idl.get_ovn_vip_port.return_value = vip_port self.agent.sb_idl.get_ovn_vip_port.return_value = vip_port
self.event.run(self.event.ROW_CREATE, row, mock.Mock()) self.event.run(self.event.ROW_CREATE, row, mock.Mock())
self.agent.expose_ovn_lb_on_provider.assert_not_called() self.agent.expose_ovn_lb_on_provider.assert_not_called()
@ -942,6 +954,8 @@ class TestOVNLBMemberCreateDeleteEvent(test_base.TestCase):
datapath='dp1', datapath='dp1',
logical_port='port-1', logical_port='port-1',
external_ids={}) external_ids={})
self.agent.sb_idl.get_lrps_for_datapath.return_value = ['fake-lrp']
self.agent.sb_idl.get_port_datapath.return_value = 'r_dp'
self.agent.sb_idl.get_ovn_vip_port.return_value = vip_port self.agent.sb_idl.get_ovn_vip_port.return_value = vip_port
self.event.run(self.event.ROW_CREATE, row, mock.Mock()) self.event.run(self.event.ROW_CREATE, row, mock.Mock())
self.agent.expose_ovn_lb_on_provider.assert_not_called() self.agent.expose_ovn_lb_on_provider.assert_not_called()
@ -957,6 +971,8 @@ class TestOVNLBMemberCreateDeleteEvent(test_base.TestCase):
datapath='dp1', datapath='dp1',
logical_port='ovn-lb-port-1', logical_port='ovn-lb-port-1',
external_ids={constants.OVN_CIDRS_EXT_ID_KEY: '172.24.100.66/26'}) external_ids={constants.OVN_CIDRS_EXT_ID_KEY: '172.24.100.66/26'})
self.agent.sb_idl.get_lrps_for_datapath.return_value = ['fake-lrp']
self.agent.sb_idl.get_port_datapath.return_value = 'r_dp'
self.agent.sb_idl.get_ovn_vip_port.return_value = vip_port self.agent.sb_idl.get_ovn_vip_port.return_value = vip_port
self.event.run(self.event.ROW_DELETE, row, mock.Mock()) self.event.run(self.event.ROW_DELETE, row, mock.Mock())
self.agent.withdraw_ovn_lb_on_provider.assert_called_once_with( self.agent.withdraw_ovn_lb_on_provider.assert_called_once_with(