Move OVN DB service model querier to trripleo module
Change-Id: Id32673e9225ad7f6b4e0a92ef3bcb2504436bf95
This commit is contained in:
parent
53322d5460
commit
458bbab794
@ -19,7 +19,6 @@ from __future__ import absolute_import
|
|||||||
from tobiko.openstack.tests import _neutron
|
from tobiko.openstack.tests import _neutron
|
||||||
from tobiko.openstack.tests import _nova
|
from tobiko.openstack.tests import _nova
|
||||||
|
|
||||||
InvalidDBServiceModel = _neutron.InvalidDBServiceModel
|
|
||||||
InvalidDBConnString = _neutron.InvalidDBConnString
|
InvalidDBConnString = _neutron.InvalidDBConnString
|
||||||
ParsingError = _neutron.ParsingError
|
ParsingError = _neutron.ParsingError
|
||||||
RAFTStatusError = _neutron.RAFTStatusError
|
RAFTStatusError = _neutron.RAFTStatusError
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
|
|
||||||
import collections
|
import collections
|
||||||
import functools
|
|
||||||
import json
|
import json
|
||||||
import re
|
import re
|
||||||
import typing
|
import typing
|
||||||
@ -15,14 +14,13 @@ from tobiko.openstack import neutron
|
|||||||
from tobiko.openstack import topology
|
from tobiko.openstack import topology
|
||||||
from tobiko.shell import ip
|
from tobiko.shell import ip
|
||||||
from tobiko.shell import sh
|
from tobiko.shell import sh
|
||||||
|
from tobiko.tripleo import _overcloud
|
||||||
from tobiko.tripleo import pacemaker
|
from tobiko.tripleo import pacemaker
|
||||||
|
|
||||||
LOG = log.getLogger(__name__)
|
LOG = log.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
# Supported OVN DB service models
|
# Supported OVN DB service models
|
||||||
RAFT = 'RAFT'
|
|
||||||
HA = 'HA'
|
|
||||||
# Supported OVN databases
|
# Supported OVN databases
|
||||||
OVNDBS = ('nb', 'sb')
|
OVNDBS = ('nb', 'sb')
|
||||||
DBNAMES = {'nb': 'OVN_Northbound', 'sb': 'OVN_Southbound'}
|
DBNAMES = {'nb': 'OVN_Northbound', 'sb': 'OVN_Southbound'}
|
||||||
@ -88,14 +86,13 @@ def test_neutron_agents_are_alive(timeout=300., interval=5.) \
|
|||||||
|
|
||||||
def ovn_dbs_vip_bindings(test_case):
|
def ovn_dbs_vip_bindings(test_case):
|
||||||
ovn_conn_str = get_ovn_db_connections()
|
ovn_conn_str = get_ovn_db_connections()
|
||||||
db_service_model = get_ovn_db_service_model()
|
|
||||||
# ovn db sockets might be centrillized or distributed
|
# ovn db sockets might be centrillized or distributed
|
||||||
# that depends on the openstack version under test
|
# that depends on the openstack version under test
|
||||||
sockets_centrallized = topology.verify_osp_version('14.0', lower=True)
|
sockets_centrallized = topology.verify_osp_version('14.0', lower=True)
|
||||||
for db in OVNDBS:
|
for db in OVNDBS:
|
||||||
found_centralized = False
|
found_centralized = False
|
||||||
addrs, port = parse_ips_from_db_connections(ovn_conn_str[db])
|
addrs, port = parse_ips_from_db_connections(ovn_conn_str[db])
|
||||||
if db_service_model == RAFT:
|
if _overcloud.is_ovn_using_raft():
|
||||||
addrs.append(netaddr.IPAddress('0.0.0.0'))
|
addrs.append(netaddr.IPAddress('0.0.0.0'))
|
||||||
for node in topology.list_openstack_nodes(group='controller'):
|
for node in topology.list_openstack_nodes(group='controller'):
|
||||||
socs = get_ovn_db_socket_info(node.hostname, port)
|
socs = get_ovn_db_socket_info(node.hostname, port)
|
||||||
@ -218,9 +215,8 @@ def get_ovn_db_socket_info(hostname, port):
|
|||||||
|
|
||||||
def ovn_dbs_are_synchronized(test_case):
|
def ovn_dbs_are_synchronized(test_case):
|
||||||
"""Check that OVN DBs are syncronized across all controller nodes"""
|
"""Check that OVN DBs are syncronized across all controller nodes"""
|
||||||
db_model = get_ovn_db_service_model()
|
|
||||||
db_sync_status = get_ovn_db_sync_status()
|
db_sync_status = get_ovn_db_sync_status()
|
||||||
if db_model == HA:
|
if _overcloud.is_ovn_using_ha():
|
||||||
# In Active-Backup service model we expect the same controller to be
|
# In Active-Backup service model we expect the same controller to be
|
||||||
# active for both databases. This controller node should be configured
|
# active for both databases. This controller node should be configured
|
||||||
# for virtual IP in pacemaker. Other controllers should be in backup
|
# for virtual IP in pacemaker. Other controllers should be in backup
|
||||||
@ -236,7 +232,7 @@ def ovn_dbs_are_synchronized(test_case):
|
|||||||
test_case.assertEqual('active', state)
|
test_case.assertEqual('active', state)
|
||||||
else:
|
else:
|
||||||
test_case.assertEqual('backup', state)
|
test_case.assertEqual('backup', state)
|
||||||
elif db_model == RAFT:
|
elif _overcloud.is_ovn_using_raft():
|
||||||
# In clustered database service model we expect all databases to be
|
# In clustered database service model we expect all databases to be
|
||||||
# active
|
# active
|
||||||
for db in OVNDBS:
|
for db in OVNDBS:
|
||||||
@ -275,10 +271,9 @@ def dump_ovn_databases():
|
|||||||
from tobiko.tripleo import containers
|
from tobiko.tripleo import containers
|
||||||
runtime_name = containers.get_container_runtime_name()
|
runtime_name = containers.get_container_runtime_name()
|
||||||
sockets = find_ovn_db_sockets()
|
sockets = find_ovn_db_sockets()
|
||||||
db_mode = get_ovn_db_service_model()
|
|
||||||
# To be able to connect to local database in RAFT environment
|
# To be able to connect to local database in RAFT environment
|
||||||
# --no-leader-only parameter should be specified
|
# --no-leader-only parameter should be specified
|
||||||
no_leader = (' --no-leader-only' if db_mode == 'RAFT' else '')
|
no_leader = (' --no-leader-only' if _overcloud.is_ovn_using_raft() else '')
|
||||||
dumps = {}
|
dumps = {}
|
||||||
for node in topology.list_openstack_nodes(group='controller'):
|
for node in topology.list_openstack_nodes(group='controller'):
|
||||||
for db in OVNDBS:
|
for db in OVNDBS:
|
||||||
@ -328,33 +323,6 @@ def get_ovn_db_sync_status():
|
|||||||
return db_sync_status
|
return db_sync_status
|
||||||
|
|
||||||
|
|
||||||
class InvalidDBServiceModel(tobiko.TobikoException):
|
|
||||||
message = "Database service model is not supported:\n{db_string}"
|
|
||||||
|
|
||||||
|
|
||||||
@functools.lru_cache()
|
|
||||||
def get_ovn_db_service_model():
|
|
||||||
"""Show in which mode OVN databases are configured
|
|
||||||
|
|
||||||
There are two modes currently supported:
|
|
||||||
- RAFT aka clustered service model (default starting OSP17.0)
|
|
||||||
- HA aka Active-Backup service model (default for pre-OSP17.0 versions)
|
|
||||||
|
|
||||||
For more information:
|
|
||||||
https://docs.openvswitch.org/en/latest/ref/ovsdb.7/#service-models
|
|
||||||
"""
|
|
||||||
controller0 = topology.list_openstack_nodes(group='controller')[0]
|
|
||||||
db_info = sh.execute('find / -name ovnnb_db.db | xargs sudo head -n 1',
|
|
||||||
ssh_client=controller0.ssh_client, sudo=True)
|
|
||||||
if 'CLUSTER' in db_info.stdout:
|
|
||||||
return RAFT
|
|
||||||
elif 'JSON' in db_info.stdout:
|
|
||||||
return HA
|
|
||||||
else:
|
|
||||||
LOG.error('Only RAFT and HA database service models are supported')
|
|
||||||
raise InvalidDBServiceModel(db_string=db_info.stdout)
|
|
||||||
|
|
||||||
|
|
||||||
def test_ovn_dbs_validations():
|
def test_ovn_dbs_validations():
|
||||||
if not neutron.has_ovn():
|
if not neutron.has_ovn():
|
||||||
LOG.debug('OVN not configured. OVN DB sync validations skipped')
|
LOG.debug('OVN not configured. OVN DB sync validations skipped')
|
||||||
@ -454,7 +422,7 @@ def get_raft_ports():
|
|||||||
|
|
||||||
|
|
||||||
def test_raft_cluster():
|
def test_raft_cluster():
|
||||||
if get_ovn_db_service_model() != RAFT:
|
if not _overcloud.is_ovn_using_raft():
|
||||||
return
|
return
|
||||||
test_case = tobiko.get_test_case()
|
test_case = tobiko.get_test_case()
|
||||||
cluster_ports = get_raft_ports()
|
cluster_ports = get_raft_ports()
|
||||||
|
@ -34,6 +34,8 @@ from tobiko.tripleo import _undercloud
|
|||||||
|
|
||||||
CONF = config.CONF
|
CONF = config.CONF
|
||||||
LOG = log.getLogger(__name__)
|
LOG = log.getLogger(__name__)
|
||||||
|
OVN_RAFT = 'RAFT'
|
||||||
|
OVN_HA = 'HA'
|
||||||
|
|
||||||
|
|
||||||
def load_overcloud_rcfile() -> typing.Dict[str, str]:
|
def load_overcloud_rcfile() -> typing.Dict[str, str]:
|
||||||
@ -280,22 +282,55 @@ def is_redis_expected():
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidDBServiceModel(tobiko.TobikoException):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@functools.lru_cache()
|
||||||
|
def get_ovn_db_service_model():
|
||||||
|
"""Show in which mode OVN databases are configured
|
||||||
|
|
||||||
|
There are two modes currently supported:
|
||||||
|
- RAFT aka clustered service model (default starting OSP17.0)
|
||||||
|
- HA aka Active-Backup service model (default for pre-OSP17.0 versions)
|
||||||
|
|
||||||
|
For more information:
|
||||||
|
https://docs.openvswitch.org/en/latest/ref/ovsdb.7/#service-models
|
||||||
|
"""
|
||||||
|
if not neutron.has_ovn():
|
||||||
|
raise InvalidDBServiceModel('OVN is not enabled')
|
||||||
|
controller0 = topology.list_openstack_nodes(group='controller')[0]
|
||||||
|
db_info = sh.execute('find / -name ovnnb_db.db | xargs sudo head -n 1',
|
||||||
|
ssh_client=controller0.ssh_client, sudo=True)
|
||||||
|
if 'CLUSTER' in db_info.stdout:
|
||||||
|
return OVN_RAFT
|
||||||
|
elif 'JSON' in db_info.stdout:
|
||||||
|
return OVN_HA
|
||||||
|
else:
|
||||||
|
msg = 'Unable to fetch OVN DB service model from {} string. Only RAFT'\
|
||||||
|
' and HA models are supported'.format(db_info.stdout)
|
||||||
|
LOG.error(msg)
|
||||||
|
raise InvalidDBServiceModel(message=msg)
|
||||||
|
|
||||||
|
|
||||||
@functools.lru_cache()
|
@functools.lru_cache()
|
||||||
def is_ovn_using_raft():
|
def is_ovn_using_raft():
|
||||||
if not neutron.has_ovn():
|
|
||||||
LOG.info("Networking OVN not configured")
|
|
||||||
return False
|
|
||||||
|
|
||||||
controller0 = topology.list_openstack_nodes(group='controller')[0]
|
|
||||||
try:
|
try:
|
||||||
sh.execute('ovs-appctl -t /var/lib/openvswitch/ovn/ovnnb_db.ctl '
|
if get_ovn_db_service_model() == OVN_RAFT:
|
||||||
'cluster/status OVN_Northbound',
|
return True
|
||||||
ssh_client=controller0.ssh_client, sudo=True)
|
except InvalidDBServiceModel:
|
||||||
except sh.ShellCommandFailed:
|
pass
|
||||||
LOG.info('Command failed - RAFT is not configured')
|
return False
|
||||||
return False
|
|
||||||
LOG.info('Command succeeded - RAFT is configured')
|
|
||||||
return True
|
@functools.lru_cache()
|
||||||
|
def is_ovn_using_ha():
|
||||||
|
try:
|
||||||
|
if get_ovn_db_service_model() == OVN_HA:
|
||||||
|
return True
|
||||||
|
except InvalidDBServiceModel:
|
||||||
|
pass
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
def overcloud_version() -> tobiko.Version:
|
def overcloud_version() -> tobiko.Version:
|
||||||
|
Loading…
Reference in New Issue
Block a user