diff --git a/ovn_bgp_agent/drivers/openstack/watchers/bgp_watcher.py b/ovn_bgp_agent/drivers/openstack/watchers/bgp_watcher.py index be87699e..7526f758 100644 --- a/ovn_bgp_agent/drivers/openstack/watchers/bgp_watcher.py +++ b/ovn_bgp_agent/drivers/openstack/watchers/bgp_watcher.py @@ -13,13 +13,15 @@ # limitations under the License. from oslo_concurrency import lockutils +from oslo_config import cfg from oslo_log import log as logging + from ovsdbapp.backend.ovs_idl import event as row_event from ovn_bgp_agent import constants from ovn_bgp_agent.drivers.openstack.watchers import base_watcher - +CONF = cfg.CONF LOG = logging.getLogger(__name__) _SYNC_STATE_LOCK = lockutils.ReaderWriterLock() @@ -369,6 +371,8 @@ class OVNLBMemberCreateDeleteEvent(base_watcher.OVNLBMemberEvent): # loadbalancer has the VIP on a provider network # Also, the cr-lrp port needs to have subnet datapaths (LS) associated # to it that include the load balancer + if not self.agent.ovn_local_cr_lrps: + return try: row_dp = row.datapaths except AttributeError: @@ -389,6 +393,19 @@ class OVNLBMemberCreateDeleteEvent(base_watcher.OVNLBMemberEvent): if not vip_port: return 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(): if vip_port.datapath != cr_lrp_info.get('provider_datapath'): continue @@ -398,20 +415,9 @@ class OVNLBMemberCreateDeleteEvent(base_watcher.OVNLBMemberEvent): associated_cr_lrp_port = cr_lrp_port break else: - # 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_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 - break - if associated_cr_lrp_port: + if cr_lrp_info.get('router_datapath') in router_dps: + associated_cr_lrp_port = cr_lrp_port break - else: return diff --git a/ovn_bgp_agent/tests/unit/drivers/openstack/watchers/test_bgp_watcher.py b/ovn_bgp_agent/tests/unit/drivers/openstack/watchers/test_bgp_watcher.py index 6f1bed14..267e61ee 100644 --- a/ovn_bgp_agent/tests/unit/drivers/openstack/watchers/test_bgp_watcher.py +++ b/ovn_bgp_agent/tests/unit/drivers/openstack/watchers/test_bgp_watcher.py @@ -15,11 +15,15 @@ from unittest import mock +from oslo_config import cfg + from ovn_bgp_agent import constants 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 utils +CONF = cfg.CONF + class TestPortBindingChassisCreatedEvent(test_base.TestCase): @@ -863,12 +867,16 @@ class TestOVNLBMemberCreateDeleteEvent(test_base.TestCase): logical_port='ovn-lb-port-1', 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_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.agent.expose_ovn_lb_on_provider.assert_called_once_with( '172.24.100.66', 'ovn-lb-port-1', 'cr-lrp1') self.agent.withdraw_ovn_lb_on_provider.assert_not_called() 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', datapaths=['s_dp1']) row = utils.create_row(name='ovn-lb1', @@ -912,6 +920,8 @@ class TestOVNLBMemberCreateDeleteEvent(test_base.TestCase): datapath='dp2', logical_port='ovn-lb-port-1', 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.event.run(self.event.ROW_CREATE, row, mock.Mock()) self.agent.expose_ovn_lb_on_provider.assert_not_called() @@ -927,6 +937,8 @@ class TestOVNLBMemberCreateDeleteEvent(test_base.TestCase): datapath='dp1', logical_port='ovn-lb-port-1', 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.event.run(self.event.ROW_CREATE, row, mock.Mock()) self.agent.expose_ovn_lb_on_provider.assert_not_called() @@ -942,6 +954,8 @@ class TestOVNLBMemberCreateDeleteEvent(test_base.TestCase): datapath='dp1', logical_port='port-1', 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.event.run(self.event.ROW_CREATE, row, mock.Mock()) self.agent.expose_ovn_lb_on_provider.assert_not_called() @@ -957,6 +971,8 @@ class TestOVNLBMemberCreateDeleteEvent(test_base.TestCase): datapath='dp1', logical_port='ovn-lb-port-1', 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.event.run(self.event.ROW_DELETE, row, mock.Mock()) self.agent.withdraw_ovn_lb_on_provider.assert_called_once_with(