[ovn]Set NB/SB "connection" inactivity probe support multi addresses

When OVN is clustered, connection be set multiple addresses, inactivity
probe cannot currently be set correctly. this patch fix it.

Closes-bug: #1958364

Change-Id: I5f83d6f47dc60b849cca5830ec3f77c15a446530
This commit is contained in:
zhouhenglc 2022-01-19 16:13:12 +08:00
parent f324ddf769
commit 0124dab423
4 changed files with 69 additions and 11 deletions

View File

@ -36,7 +36,12 @@ ovn_opts = [
'Use ssl:IP:PORT for SSL connection. The '
'ovn_nb_private_key, ovn_nb_certificate and '
'ovn_nb_ca_cert are mandatory.\n'
'Use unix:FILE for unix domain socket connection.')),
'Use unix:FILE for unix domain socket connection.\n'
'Multiple connection can be specified by a comma '
'separated string. See also: '
'https://github.com/openvswitch/ovs/blob'
'/ab4d3bfbef37c31331db5a9dbe7c22eb8d5e5e5f'
'/python/ovs/db/idl.py#L215-L216')),
cfg.StrOpt('ovn_nb_private_key',
default='',
help=_('The PEM file with private key for SSL connection to '
@ -56,7 +61,12 @@ ovn_opts = [
'Use ssl:IP:PORT for SSL connection. The '
'ovn_sb_private_key, ovn_sb_certificate and '
'ovn_sb_ca_cert are mandatory.\n'
'Use unix:FILE for unix domain socket connection.')),
'Use unix:FILE for unix domain socket connection.\n'
'Multiple connection can be specified by a comma '
'separated string. See also: '
'https://github.com/openvswitch/ovs/blob'
'/ab4d3bfbef37c31331db5a9dbe7c22eb8d5e5e5f'
'/python/ovs/db/idl.py#L215-L216')),
cfg.StrOpt('ovn_sb_private_key',
default='',
help=_('The PEM file with private key for SSL connection to '

View File

@ -310,19 +310,24 @@ class OVNMechanismDriver(api.MechanismDriver):
(ovn_conf.get_ovn_sb_connection(), self.sb_schema_helper,
impl_idl_ovn.OvsdbSbOvnIdl)]
for connection, schema, klass in dbs:
target = ovn_utils.connection_config_to_target_string(connection)
if not target:
targets = []
for _conn in idlutils.parse_connection(connection):
target = ovn_utils.connection_config_to_target_string(_conn)
if target:
targets.append(target)
if not targets:
continue
idl = ovsdb_monitor.BaseOvnIdl.from_server(connection, schema)
with ovsdb_monitor.short_living_ovsdb_api(klass, idl) as idl_api:
conn = idlutils.row_by_value(idl_api, 'Connection', 'target',
target, None)
if conn:
idl_api.db_set(
'Connection', target,
('inactivity_probe', int(inactivity_probe))).execute(
check_error=True)
for target in targets:
conn = idlutils.row_by_value(idl_api, 'Connection',
'target', target, None)
if conn:
idl_api.db_set(
'Connection', target,
('inactivity_probe', int(inactivity_probe))
).execute(check_error=True)
@staticmethod
def should_post_fork_initialize(worker_class):

View File

@ -376,3 +376,39 @@ class TestOvnIdlProbeInterval(base.TestOVNFunctionalBase):
interval = ovn_conf.get_ovn_ovsdb_probe_interval()
for idl in idls:
self.assertEqual(interval, idl._session.reconnect.probe_interval)
class TestOvnIdlConnections(base.TestOVNFunctionalBase):
def setUp(self):
temp_dir = self.useFixture(og_fixtures.TempDir()).path
install_share_path = self._get_install_share_path()
mgr = self.useFixture(
process.OvsdbServer(temp_dir, install_share_path,
ovn_nb_db=True, ovn_sb_db=True,
protocol='tcp'))
connection = mgr.get_ovsdb_connection_path
nb_conns = connection()
sb_conns = connection(db_type='sb')
# add fake address, idl support multiple addresses, as long as there
# is an available address, it will run successfully.
nb_conns += ',tcp:192.168.0.1:6641'
sb_conns += ',tcp:192.168.0.1:6642'
self.connections = {'OVN_Northbound': nb_conns,
'OVN_Southbound': sb_conns}
super().setUp()
def test_ovsdb_connections(self):
klasses = {
ovsdb_monitor.OvnNbIdl: ('OVN_Northbound',
{'driver': self.mech_driver}),
ovsdb_monitor.OvnSbIdl: ('OVN_Southbound',
{'driver': self.mech_driver})}
for kls, (schema, kwargs) in klasses.items():
conns = self.connections[schema]
idl = kls.from_server(
conns,
idlutils.get_schema_helper(conns, schema),
**kwargs)
self.assertEqual(set(idlutils.parse_connection(conns)),
set(idl._session.remotes))

View File

@ -0,0 +1,7 @@
---
features:
- |
Ovn configuration items "ovn_nb_connection" and "ovn_sb_connection"
can set multiple addresses separated by commas. Setting NB/SB
"connection" inactivity probe can also work well, if multiple
connection be specified.