Improve OVNLBMemberCreateDeleteEvent watching event
Minimize the number of SB calls to be made for certain events Change-Id: I08b4b22565bc90750736849c3a7a6d3049009dd2
This commit is contained in:
parent
d9c7de6465
commit
ddb740e2e4
@ -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
|
||||||
|
|
||||||
|
@ -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(
|
||||||
|
Loading…
Reference in New Issue
Block a user