Add integrated tests various Neutron deployment scenarios

This patchset implements an integrated test for various deployment
scenarios, both metal and lxc, where applicable. Some test cleanup
has been performed.

The basic server ops tempest test is also included. Expectations are that
the deployed cirros VM will be reachable behind a floating IP internally
for testing purposes (in most cases).

Depends-On: https://review.opendev.org/c/openstack/openstack-ansible/+/778008/
Change-Id: I0bdcdef7938183a82ca249f1c95592aea683cf98
This commit is contained in:
James Denton 2021-03-01 15:44:21 +00:00
parent f441b212f5
commit 69845d63a0
16 changed files with 41 additions and 736 deletions

View File

@ -0,0 +1,6 @@
---
other:
- |
Gate jobs for OpenDaylight, SFC, and OVS w/ NSH have been removed in
preparation for deprecation of those deployment scenarios and related
code.

View File

@ -26,12 +26,12 @@
- neutron_services['neutron-ovn-northd']['group'] in group_names
- name: Configure OVN Northbound Listener
command: "ovn-nbctl set-connection ptcp:6641:0.0.0.0 -- set connection . inactivity_probe=60000"
command: "ovn-nbctl set-connection ptcp:6641:{{ openstack_service_bind_address }} -- set connection . inactivity_probe=60000"
when:
- neutron_services['neutron-ovn-northd']['group'] in group_names
- name: Configure OVN Southbound Listener
command: "ovn-sbctl set-connection ptcp:6642:0.0.0.0 -- set connection . inactivity_probe=60000"
command: "ovn-sbctl set-connection ptcp:6642:{{ openstack_service_bind_address }} -- set connection . inactivity_probe=60000"
when:
- neutron_services['neutron-ovn-northd']['group'] in group_names

View File

@ -1,44 +0,0 @@
---
# Copyright 2017, Intracom-Telecom
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
### Use OvS with NSH support
ovs_nsh_support: True
### Use OpenDaylight SDN Controller
neutron_plugin_type: "ml2.opendaylight"
odl_ip: "{{ hostvars[groups['opendaylight'][0]]['ansible_default_ipv4']['address'] }}"
neutron_opendaylight_conf_ini_overrides:
ml2_odl:
url: "http://{{ odl_ip }}:8180/controller/nb/v2/neutron"
username: admin
password: admin
neutron_plugin_base:
- router
- metering
- sfc
- flow_classifier
tempest_run: yes
tempest_plugins:
- name: neutron-plugins
repo: https://opendev.org/openstack/neutron-tempest-plugin
branch: master
tempest_test_whitelist:
- "neutron_tempest_plugin.api.test_networks*"
tempest_network_ping_gateway: False

View File

@ -1,59 +0,0 @@
---
# Copyright 2017, Ericsson AB
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
### Ensure the openvswitch kernel module is loaded
openstack_host_specific_kernel_modules:
- name: "openvswitch"
pattern: "CONFIG_OPENVSWITCH"
group: "network_hosts"
### Use OpenDaylight SDN Controller
neutron_plugin_type: "ml2.opendaylight"
odl_ip: "{{ hostvars[groups['opendaylight'][0]]['ansible_default_ipv4']['address'] }}"
neutron_opendaylight_conf_ini_overrides:
ml2_odl:
url: "http://{{ odl_ip }}:8180/controller/nb/v2/neutron"
username: admin
password: admin
neutron_plugin_base:
- odl-router_v2
- bgpvpn
neutron_ml2_drivers_type: "flat,vlan,vxlan"
neutron_provider_networks:
network_flat_networks: "*"
network_types: "vlan"
network_vlan_ranges: "physnet1:102:199"
network_mappings: "physnet1:br-provider"
tempest_run: yes
tempest_plugins:
- name: neutron-plugins
repo: https://opendev.org/openstack/neutron-tempest-plugin
branch: master
- name: networking-bgpvpn
repo: https://opendev.org/openstack/networking-bgpvpn
branch: master
tempest_test_whitelist:
- "neutron_tempest_plugin.api.test_networks*"
- "networking_bgpvpn_tempest.tests.api.test_bgpvpn"
- "networking_bgpvpn_tempest.tests.scenario.test_bgpvpn_basic"
tempest_network_ping_gateway: False

View File

@ -1,42 +0,0 @@
---
# Copyright 2017, Ericsson AB
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
### Ensure the openvswitch kernel module is loaded
openstack_host_specific_kernel_modules:
- name: "openvswitch"
pattern: "CONFIG_OPENVSWITCH"
group: "network_hosts"
### Use OpenDaylight SDN Controller
neutron_plugin_type: "ml2.opendaylight"
odl_ip: "{{ hostvars[groups['opendaylight'][0]]['ansible_default_ipv4']['address'] }}"
neutron_opendaylight_conf_ini_overrides:
ml2_odl:
url: "http://{{ odl_ip }}:8180/controller/nb/v2/neutron"
username: admin
password: admin
tempest_run: yes
tempest_plugins:
- name: neutron-plugins
repo: https://opendev.org/openstack/neutron-tempest-plugin
branch: master
tempest_test_whitelist:
- "neutron_tempest_plugin.api.test_networks*"
tempest_network_ping_gateway: False

View File

@ -1,95 +0,0 @@
---
openstack_host_specific_kernel_modules:
- name: "openvswitch"
pattern: "CONFIG_OPENVSWITCH"
tempest_run: yes
tempest_plugins:
- name: neutron-plugins
repo: https://opendev.org/openstack/neutron-tempest-plugin
branch: master
tempest_test_whitelist:
- "neutron_tempest_plugin.api.test_networks*"
tempest_private_net_provider_type: geneve
tempest_network_ping_gateway: False
neutron_plugin_type: ml2.ovn
neutron_local_ip: "{{ ansible_host }}"
neutron_plugin_base:
- neutron.services.ovn_l3.plugin.OVNL3RouterPlugin
neutron_ml2_drivers_type: "geneve,vlan,flat,local"
neutron_provider_networks:
network_types: "geneve"
network_geneve_ranges: "1:1000"
network_vlan_ranges: "vlan"
network_mappings: "vlan:br-provider"
repo_build_upper_constraints_overrides: [neutron-lib>=1.17.0]
neutron_neutron_conf_overrides:
DEFAULT:
global_physnet_mtu: 1558
neutron_ml2_conf_ini_overrides:
ml2:
physical_network_mtus: vlan:1500
path_mtu: 1558
haproxy_ssl: false
external_lb_vip_address: 10.1.0.1
internal_lb_vip_address: 10.1.0.1
test_neutron_server_host: "{{ external_lb_vip_address }}"
haproxy_default_services:
- service:
haproxy_service_name: neutron_server
haproxy_backend_nodes: "{{ groups['neutron_server'] | default([]) }}"
haproxy_port: 9696
haproxy_ssl: "{{ haproxy_ssl }}"
haproxy_balance_type: http
haproxy_backend_options:
- "httpchk GET /"
- service:
haproxy_service_name: neutron_ovn_northd_northbound
haproxy_backend_nodes: "{{ (groups['neutron_ovn_northd'] | default([]))[:1] }}" # list expected
haproxy_backup_nodes: "{{ (groups['neutron_ovn_northd'] | default([]))[1:] }}"
haproxy_port: 6641
haproxy_bind: "{{ [internal_lb_vip_address] }}"
haproxy_balance_type: tcp
haproxy_timeout_client: 90m
haproxy_timeout_server: 90m
haproxy_backend_options:
- tcpka
haproxy_service_enabled: "{{ (neutron_plugin_type == 'ml2.ovn') and (groups['neutron_ovn_northd'] is defined and groups['neutron_ovn_northd'] | length > 0) }}"
- service:
haproxy_service_name: neutron_ovn_northd_southbound
haproxy_backend_nodes: "{{ (groups['neutron_ovn_northd'] | default([]))[:1] }}"
haproxy_backup_nodes: "{{ (groups['neutron_ovn_northd'] | default([]))[1:] }}"
haproxy_port: 6642
haproxy_bind: "{{ [internal_lb_vip_address] }}"
haproxy_balance_type: tcp
haproxy_timeout_client: 90m
haproxy_timeout_server: 90m
haproxy_backend_options:
- tcpka
haproxy_service_enabled: "{{ (neutron_plugin_type == 'ml2.ovn') and (groups['neutron_ovn_northd'] is defined and groups['neutron_ovn_northd'] | length > 0) }}"
- service:
haproxy_service_name: neutron_ovn_ovsdb_server
haproxy_backend_nodes: "{{ (groups['neutron_ovn_northd'] | default([]))[:1] }}"
haproxy_backup_nodes: "{{ (groups['neutron_ovn_northd'] | default([]))[1:] }}"
haproxy_port: 6640
haproxy_bind: "{{ [internal_lb_vip_address] }}"
haproxy_balance_type: tcp
haproxy_timeout_client: 90m
haproxy_timeout_server: 90m
haproxy_backend_options:
- tcpka
haproxy_service_enabled: "{{ (neutron_plugin_type == 'ml2.ovn') and (groups['neutron_ovn_northd'] is defined and groups['neutron_ovn_northd'] | length > 0) }}"

View File

@ -1,22 +0,0 @@
---
openstack_host_specific_kernel_modules:
- name: "openvswitch"
pattern: "CONFIG_OPENVSWITCH"
tempest_run: yes
tempest_plugins:
- name: neutron-plugins
repo: https://opendev.org/openstack/neutron-tempest-plugin
branch: master
tempest_test_whitelist:
- "neutron_tempest_plugin.api.test_networks*"
tempest_network_ping_gateway: False
neutron_plugin_type: ml2.ovs
neutron_local_ip: "{{ ansible_host }}"
neutron_plugin_base:
- router
- firewall_v2

View File

@ -1,38 +0,0 @@
---
# Copyright 2017, Intracom-Telecom
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
### Use OvS with NSH support
ovs_nsh_support: True
### Use OpenDaylight SDN Controller
neutron_plugin_type: "ml2.opendaylight"
odl_ip: "{{ hostvars[groups['opendaylight'][0]]['ansible_default_ipv4']['address'] }}"
neutron_opendaylight_conf_ini_overrides:
ml2_odl:
url: "http://{{ odl_ip }}:8180/controller/nb/v2/neutron"
username: admin
password: admin
tempest_run: yes
tempest_plugins:
- name: neutron-plugins
repo: https://opendev.org/openstack/neutron-tempest-plugin
branch: master
tempest_test_whitelist:
- "neutron_tempest_plugin.api.test_networks*"
tempest_network_ping_gateway: False

View File

@ -1,40 +0,0 @@
---
# Copyright 2017, Intracom-Telecom
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
### Use OpenDaylight SDN Controller
neutron_plugin_type: "ml2.ovs"
openstack_host_specific_kernel_modules:
- name: "openvswitch"
pattern: "CONFIG_OPENVSWITCH"
group: "physical_host"
neutron_plugin_base:
- router
- metering
- sfc
- flow_classifier
tempest_run: yes
tempest_plugins:
- name: neutron-plugins
repo: https://opendev.org/openstack/neutron-tempest-plugin
branch: master
tempest_test_whitelist:
- "neutron_tempest_plugin.api.test_networks*"
tempest_network_ping_gateway: False

View File

@ -1,20 +0,0 @@
---
openstack_host_specific_kernel_modules:
- name: "openvswitch"
pattern: "CONFIG_OPENVSWITCH"
group: "physical_host"
tempest_run: yes
tempest_plugins:
- name: neutron-plugins
repo: https://opendev.org/openstack/neutron-tempest-plugin
branch: master
tempest_test_whitelist:
- "neutron_tempest_plugin.api.test_networks*"
tempest_network_ping_gateway: False
neutron_plugin_type: ml2.ovs
neutron_local_ip: "{{ ansible_host }}"

View File

@ -1,83 +0,0 @@
[all]
localhost
infra1
server1
server2
agents1
agents2
[physical_host]
localhost
[all_containers]
infra1
server1
server2
agents1
agents2
[oslomsg_rpc_all]
infra1
[oslomsg_notify_all]
infra1
[rabbitmq_all]
infra1
[galera_all]
infra1
[memcached_all]
infra1
[service_all:children]
rabbitmq_all
galera_all
memcached_all
[keystone_all]
infra1
[neutron_server]
server1
server2
[opendaylight]
server1
server2
[neutron_agent]
agents1
agents2
[neutron_dhcp_agent]
agents1
agents2
[neutron_metering_agent]
[neutron_l3_agent]
agents1
agents2
[neutron_metadata_agent]
agents1
agents2
[neutron_openvswitch_agent]
agents1
agents2
localhost
[neutron_all:children]
neutron_agent
neutron_dhcp_agent
neutron_metering_agent
neutron_l3_agent
neutron_metadata_agent
neutron_openvswitch_agent
neutron_server
opendaylight
[utility_all]
infra1

View File

@ -1,78 +0,0 @@
[all]
localhost
infra1
server1
server2
[physical_host]
localhost
[all_containers]
infra1
server1
server2
[oslomsg_rpc_all]
infra1
[oslomsg_notify_all]
infra1
[rabbitmq_all]
infra1
[galera_all]
infra1
[memcached_all]
infra1
[service_all:children]
rabbitmq_all
galera_all
memcached_all
[keystone_all]
infra1
[neutron_agent]
[neutron_dhcp_agent]
[neutron_linuxbridge_agent]
[neutron_openvswitch_agent]
[neutron_metering_agent]
[neutron_l3_agent]
[neutron_metadata_agent]
[neutron_server]
server1
server2
[neutron_calico_dhcp_agent]
[neutron_ovn_controller]
localhost
[neutron_ovn_northd]
server1
server2
[neutron_all:children]
neutron_agent
neutron_dhcp_agent
neutron_linuxbridge_agent
neutron_openvswitch_agent
neutron_metering_agent
neutron_l3_agent
neutron_metadata_agent
neutron_ovn_controller
neutron_ovn_northd
neutron_server
[utility_all]
infra1
[haproxy_all:children]
haproxy
[haproxy]
localhost

View File

@ -1,91 +0,0 @@
[all]
localhost
infra1
server1
server2
agents1
agents2
[physical_host]
localhost
[all_containers]
infra1
server1
server2
agents1
agents2
[oslomsg_rpc_all]
infra1
[oslomsg_notify_all]
infra1
[rabbitmq_all]
infra1
[galera_all]
infra1
[memcached_all]
infra1
[service_all:children]
rabbitmq_all
galera_all
memcached_all
[keystone_all]
infra1
[neutron_agent]
agents1
agents2
[neutron_dhcp_agent]
agents1
agents2
[neutron_linuxbridge_agent]
[neutron_openvswitch_agent]
agents1
agents2
[neutron_metering_agent]
agents1
agents2
[neutron_l3_agent]
agents1
agents2
[neutron_metadata_agent]
agents1
agents2
[neutron_server]
server1
server2
[neutron_calico_dhcp_agent]
[neutron_all:children]
neutron_agent
neutron_dhcp_agent
neutron_linuxbridge_agent
neutron_openvswitch_agent
neutron_metering_agent
neutron_l3_agent
neutron_metadata_agent
neutron_server
[utility_all]
infra1
[haproxy_all:children]
haproxy
[haproxy]
localhost

63
tox.ini
View File

@ -103,15 +103,6 @@ setenv =
commands =
bash -c "{toxinidir}/tests/common/test-ansible-functional.sh"
[testenv:ovs]
basepython = python3
setenv =
{[testenv]setenv}
ANSIBLE_INVENTORY={toxinidir}/tests/ovs_inventory
ANSIBLE_OVERRIDES={toxinidir}/tests/neutron-overrides-ovs.yml
commands =
bash -c "{toxinidir}/tests/common/test-ansible-functional.sh"
[testenv:calico]
basepython = python3
setenv =
@ -121,60 +112,6 @@ setenv =
commands =
bash -c "{toxinidir}/tests/common/test-ansible-functional.sh"
[testenv:opendaylight]
basepython = python3
setenv =
{[testenv]setenv}
ANSIBLE_INVENTORY={toxinidir}/tests/opendaylight_inventory
ANSIBLE_OVERRIDES={toxinidir}/tests/neutron-overrides-opendaylight.yml
commands =
bash -c "{toxinidir}/tests/common/test-ansible-functional.sh"
[testenv:opendaylight-bgpvpn]
basepython = python3
setenv =
{[testenv]setenv}
ANSIBLE_INVENTORY={toxinidir}/tests/opendaylight_inventory
ANSIBLE_OVERRIDES={toxinidir}/tests/neutron-overrides-opendaylight-bgpvpn.yml
commands =
bash -c "{toxinidir}/tests/common/test-ansible-functional.sh"
[testenv:ovs-nsh]
basepython = python3
setenv =
{[testenv]setenv}
ANSIBLE_INVENTORY={toxinidir}/tests/opendaylight_inventory
ANSIBLE_OVERRIDES={toxinidir}/tests/neutron-overrides-ovs-nsh.yml
commands =
bash -c "{toxinidir}/tests/common/test-ansible-functional.sh"
[testenv:ovn]
basepython = python3
setenv =
{[testenv]setenv}
ANSIBLE_INVENTORY={toxinidir}/tests/ovn_inventory
ANSIBLE_OVERRIDES={toxinidir}/tests/neutron-overrides-ovn.yml
commands =
bash -c "{toxinidir}/tests/common/test-ansible-functional.sh"
[testenv:odl-sfc]
basepython = python3
setenv =
{[testenv]setenv}
ANSIBLE_INVENTORY={toxinidir}/tests/opendaylight_inventory
ANSIBLE_OVERRIDES={toxinidir}/tests/neutron-overrides-odl-sfc.yml
commands =
bash -c "{toxinidir}/tests/common/test-ansible-functional.sh"
[testenv:ovs-sfc]
basepython = python3
setenv =
{[testenv]setenv}
ANSIBLE_INVENTORY={toxinidir}/tests/ovs_inventory
ANSIBLE_OVERRIDES={toxinidir}/tests/neutron-overrides-ovs-sfc.yml
commands =
bash -c "{toxinidir}/tests/common/test-ansible-functional.sh"
[testenv:linters]
basepython = python3
commands =

View File

@ -13,60 +13,39 @@
# See the License for the specific language governing permissions and
# limitations under the License.
# Ubuntu Focal
- job:
name: openstack-ansible-ovs-ubuntu-bionic
parent: openstack-ansible-functional-ubuntu-bionic
vars:
tox_env: ovs
name: openstack-ansible-deploy-aio_ovn_lxc-ubuntu-focal2
parent: openstack-ansible-deploy-aio
nodeset: ubuntu-focal
- job:
name: openstack-ansible-ovs-centos-8
parent: openstack-ansible-functional-centos-8
vars:
tox_env: ovs
name: openstack-ansible-deploy-aio_metal_ovn-ubuntu-focal2
parent: openstack-ansible-deploy-aio
nodeset: ubuntu-focal
- job:
name: openstack-ansible-ovn-ubuntu-bionic
parent: openstack-ansible-functional-ubuntu-bionic
vars:
tox_env: ovn
name: openstack-ansible-deploy-aio_ovs_lxc-ubuntu-focal
parent: openstack-ansible-deploy-aio
nodeset: ubuntu-focal
- job:
name: openstack-ansible-ovn-centos-8
parent: openstack-ansible-functional-centos-8
vars:
tox_env: ovn
name: openstack-ansible-deploy-aio_metal_ovs-ubuntu-focal
parent: openstack-ansible-deploy-aio
nodeset: ubuntu-focal
# Ubuntu Bionic
- job:
name: openstack-ansible-deploy-aio_metal_calico-ubuntu-bionic
parent: openstack-ansible-deploy-aio_metal-ubuntu-bionic
# CentOS 8
- job:
name: openstack-ansible-opendaylight-ubuntu-bionic
parent: openstack-ansible-functional-ubuntu-bionic
vars:
tox_env: opendaylight
name: openstack-ansible-deploy-aio_ovs_lxc-centos-8
parent: openstack-ansible-deploy-aio
nodeset: centos-8
- job:
name: openstack-ansible-ovs-nsh-ubuntu-bionic
parent: openstack-ansible-functional-ubuntu-bionic
vars:
tox_env: ovs-nsh
- job:
name: openstack-ansible-odl-sfc-ubuntu-bionic
parent: openstack-ansible-functional-ubuntu-bionic
vars:
tox_env: odl-sfc
- job:
name: openstack-ansible-ovs-sfc-ubuntu-bionic
parent: openstack-ansible-functional-ubuntu-bionic
vars:
tox_env: ovs-sfc
- job:
name: openstack-ansible-opendaylight-bgpvpn-ubuntu-bionic
parent: openstack-ansible-functional-ubuntu-bionic
vars:
tox_env: opendaylight-bgpvpn
name: openstack-ansible-deploy-aio_metal_ovs-centos-8
parent: openstack-ansible-deploy-aio
nodeset: centos-8

View File

@ -23,24 +23,19 @@
- release-notes-jobs-python3
check:
jobs:
- openstack-ansible-ovs-ubuntu-bionic
- openstack-ansible-ovs-centos-8
- openstack-ansible-ovn-ubuntu-bionic
- openstack-ansible-ovn-centos-8
- openstack-ansible-deploy-aio_metal_calico-ubuntu-bionic
- openstack-ansible-opendaylight-ubuntu-bionic
- openstack-ansible-ovs-nsh-ubuntu-bionic
- openstack-ansible-odl-sfc-ubuntu-bionic
- openstack-ansible-ovs-sfc-ubuntu-bionic:
voting: false
- openstack-ansible-opendaylight-bgpvpn-ubuntu-bionic:
voting: false
- openstack-ansible-deploy-aio_ovs_lxc-ubuntu-focal
- openstack-ansible-deploy-aio_metal_ovs-ubuntu-focal
- openstack-ansible-deploy-aio_ovs_lxc-centos-8
- openstack-ansible-deploy-aio_metal_ovs-centos-8
- openstack-ansible-deploy-aio_ovn_lxc-ubuntu-focal2
- openstack-ansible-deploy-aio_metal_ovn-ubuntu-focal2
gate:
jobs:
- openstack-ansible-ovs-ubuntu-bionic
- openstack-ansible-ovs-centos-8
- openstack-ansible-ovn-ubuntu-bionic
- openstack-ansible-deploy-aio_metal_calico-ubuntu-bionic
- openstack-ansible-opendaylight-ubuntu-bionic
- openstack-ansible-ovs-nsh-ubuntu-bionic
- openstack-ansible-odl-sfc-ubuntu-bionic
- openstack-ansible-deploy-aio_ovs_lxc-ubuntu-focal
- openstack-ansible-deploy-aio_metal_ovs-ubuntu-focal
- openstack-ansible-deploy-aio_ovs_lxc-centos-8
- openstack-ansible-deploy-aio_metal_ovs-centos-8
- openstack-ansible-deploy-aio_ovn_lxc-ubuntu-focal2
- openstack-ansible-deploy-aio_metal_ovn-ubuntu-focal2