diff --git a/tobiko/openstack/neutron/__init__.py b/tobiko/openstack/neutron/__init__.py index 3b2e7b35d..fda0bdef9 100644 --- a/tobiko/openstack/neutron/__init__.py +++ b/tobiko/openstack/neutron/__init__.py @@ -42,6 +42,8 @@ skip_if_missing_networking_agents = _agent.skip_if_missing_networking_agents skip_unless_is_ovn = _agent.skip_unless_is_ovn skip_unless_is_ovs = _agent.skip_unless_is_ovs skip_if_is_old_ovn = _agent.skip_if_is_old_ovn +has_ovn = _agent.has_ovn +has_ovs = _agent.has_ovs NeutronClientFixture = _client.NeutronClientFixture ServiceUnavailable = _client.ServiceUnavailable diff --git a/tobiko/openstack/neutron/_agent.py b/tobiko/openstack/neutron/_agent.py index 9f2854ac0..ad4195a40 100644 --- a/tobiko/openstack/neutron/_agent.py +++ b/tobiko/openstack/neutron/_agent.py @@ -89,13 +89,25 @@ def list_networking_agents(**attributes): NetworkingAgentFixture).agents.with_items(**attributes) -def missing_networking_agents(count=1, **params): - agents = list_networking_agents(**params) - return max(0, count - len(agents)) +def count_networking_agents(**params) -> int: + return len(list_networking_agents(**params)) -def has_networking_agents(count=1, **params): - return not missing_networking_agents(count=count, **params) +def missing_networking_agents(count=1, **params) -> int: + actual_count = count_networking_agents(**params) + return max(0, count - actual_count) + + +def has_networking_agents(**params) -> bool: + return count_networking_agents(**params) > 0 + + +def has_ovn() -> bool: + return not has_ovs() + + +def has_ovs() -> bool: + return has_networking_agents(binary=OPENVSWITCH_AGENT) DecoratorType = typing.Callable[[typing.Union[typing.Callable, typing.Type]], diff --git a/tobiko/openstack/tests/_neutron.py b/tobiko/openstack/tests/_neutron.py index aa147fa3b..816e94eab 100644 --- a/tobiko/openstack/tests/_neutron.py +++ b/tobiko/openstack/tests/_neutron.py @@ -10,16 +10,11 @@ from tobiko.openstack import neutron from tobiko.openstack import topology from tobiko.shell import ip from tobiko.shell import sh -from tobiko.tripleo import containers from tobiko.tripleo import pacemaker LOG = log.getLogger(__name__) -def is_ovn_configured(): - return containers.ovn_used_on_overcloud() - - def build_ovn_db_show_dict(ovn_db_show_str): # returns a dictionary with OVN NB or OVN SB DB information # each dict key is a section from the OVN DB command output @@ -76,6 +71,7 @@ def test_neutron_agents_are_alive(timeout=300., interval=5.) \ def ovn_dbs_are_synchronized(test_case): + from tobiko.tripleo import containers # declare commands search_container_cmd = ( "%s ps --format '{{.Names}}' -f name=ovn-dbs-bundle" % @@ -215,7 +211,7 @@ def ovn_dbs_vip_bindings(test_case): def test_ovn_dbs_validations(): - if not is_ovn_configured(): + if not neutron.has_ovn(): LOG.debug('OVN not configured. OVN DB sync validations skipped') return @@ -231,7 +227,7 @@ def test_ovs_bridges_mac_table_size(): expected_mac_table_size = '50000' get_mac_table_size_cmd = ('ovs-vsctl get bridge {br_name} ' 'other-config:mac-table-size') - if is_ovn_configured(): + if neutron.has_ovn(): get_br_mappings_cmd = ('ovs-vsctl get Open_vSwitch . ' 'external_ids:ovn-bridge-mappings') else: diff --git a/tobiko/tripleo/containers.py b/tobiko/tripleo/containers.py index 29c96ccfb..9ec261e5d 100644 --- a/tobiko/tripleo/containers.py +++ b/tobiko/tripleo/containers.py @@ -12,6 +12,7 @@ import docker as dockerlib import tobiko from tobiko import podman from tobiko import docker +from tobiko.openstack import neutron from tobiko.openstack import topology from tobiko.shell import sh from tobiko.shell import ssh @@ -218,15 +219,9 @@ def assert_all_tripleo_containers_running(): assert_ovn_containers_running() -@functools.lru_cache() -def ovn_used_on_overcloud(): - return list_containers_df()['container_name'].\ - str.contains('ovn').any(axis=None) - - def assert_ovn_containers_running(): # specific OVN verifications - if ovn_used_on_overcloud(): + if neutron.has_ovn(): ovn_controller_containers = ['ovn_controller', 'ovn-dbs-bundle-{}-'. format(container_runtime_name)] @@ -252,7 +247,7 @@ def run_container_config_validations(): # TODO add here any generic configuration validation config_checkings = [] - if ovn_used_on_overcloud(): + if neutron.has_ovn(): ovn_config_checkings = \ [{'node_group': 'controller', 'container_name': 'neutron_api', diff --git a/tobiko/tripleo/processes.py b/tobiko/tripleo/processes.py index 838b41466..a9e265de8 100644 --- a/tobiko/tripleo/processes.py +++ b/tobiko/tripleo/processes.py @@ -8,8 +8,8 @@ import pandas import six import tobiko +from tobiko.openstack import neutron from tobiko.openstack import topology -from tobiko.tripleo import containers from tobiko.tripleo import overcloud from tobiko.shell import sh @@ -167,7 +167,7 @@ class OvercloudProcessesStatus(object): expected overcloud node or nodes :return: Bool """ - if not containers.ovn_used_on_overcloud(): + if not neutron.has_ovn(): LOG.info("Networking OVN not configured") return True