Merge "Fix OVN provider jobs"
diff --git a/octavia_tempest_plugin/common/constants.py b/octavia_tempest_plugin/common/constants.py
index 1f0a738..927aa84 100644
--- a/octavia_tempest_plugin/common/constants.py
+++ b/octavia_tempest_plugin/common/constants.py
@@ -289,3 +289,13 @@
SHOW_AVAILABILITY_ZONE_FIELDS = [
NAME, DESCRIPTION, ENABLED, AVAILABILITY_ZONE_PROFILE_ID]
+
+# Paths inside the test webservers
+CERT_PEM = 'cert.pem'
+KEY_PEM = 'key.pem'
+CLIENT_CA_PEM = 'client_ca.pem'
+DEV_SHM_PATH = '/dev/shm/'
+TEST_SERVER_BINARY = DEV_SHM_PATH + 'test_server.bin'
+TEST_SERVER_CERT = DEV_SHM_PATH + CERT_PEM
+TEST_SERVER_KEY = DEV_SHM_PATH + KEY_PEM
+TEST_SERVER_CLIENT_CA = DEV_SHM_PATH + CLIENT_CA_PEM
diff --git a/octavia_tempest_plugin/contrib/test_server/README.rst b/octavia_tempest_plugin/contrib/test_server/README.rst
index f6ec4bb..66a6030 100644
--- a/octavia_tempest_plugin/contrib/test_server/README.rst
+++ b/octavia_tempest_plugin/contrib/test_server/README.rst
@@ -44,20 +44,24 @@
Usage of ./test_server.bin:
-cert string
- Server side PEM format certificate.
+ Server side PEM format certificate file path.
-client_ca string
- Client side PEM format CA certificate.
+ Client auth PEM format CA certificate file path.
-https_port int
HTTPS port to listen on, -1 is disabled. (default -1)
+ -https_client_auth_port int
+ HTTPS with client authentication port to listen on, -1 is disabled.
+ (default -1)
-id string
Server ID (default "1")
-key string
- Server side PEM format key.
+ Server side PEM format key file path.
-port int
Port to listen on (default 8080)
If -https_port is not specified, the server will not accept HTTPS requests.
When --https_port is specified, -cert and -key are required parameters.
-If -https_port is specified, the -client_ca parameter is optional. When
--client_ca is specified, it will configure the HTTPS port to require a valid
-client certificate to connect.
+
+If -https_client_auth_port is specified, the -client_ca parameter is required.
+When -client_ca is specified, it will configure the HTTPS client auth port to
+require a valid client certificate to connect.
diff --git a/octavia_tempest_plugin/contrib/test_server/test_server.go b/octavia_tempest_plugin/contrib/test_server/test_server.go
index 27b6b2c..fa8f8d7 100644
--- a/octavia_tempest_plugin/contrib/test_server/test_server.go
+++ b/octavia_tempest_plugin/contrib/test_server/test_server.go
@@ -12,6 +12,7 @@
"net"
"net/http"
"os"
+ "strconv"
"sync"
"time"
)
@@ -69,6 +70,34 @@
io.WriteString(w, resp)
}
+func requestHandler(w http.ResponseWriter, r *http.Request) {
+ scoreboard.open()
+ defer scoreboard.close()
+
+ http.SetCookie(w, &sessCookie)
+
+ params := r.URL.Query()
+ if value, ok := params["response_code"]; ok {
+ if responseCode, err := strconv.Atoi(value[0]); err == nil {
+ w.WriteHeader(responseCode)
+ }
+ }
+
+ io.WriteString(w, fmt.Sprintf("%s %s %s\n",
+ r.Method, r.RequestURI, r.Proto))
+
+ io.WriteString(w, fmt.Sprintf("Host: %s\n", r.Host))
+
+ for key, values := range r.Header {
+ for _, value := range values {
+ header := fmt.Sprintf("%s: %s\n", key, value)
+ io.WriteString(w, header)
+ }
+ }
+ io.WriteString(w, "\n")
+ io.WriteString(w, resp)
+}
+
func slowHandler(w http.ResponseWriter, r *http.Request) {
scoreboard.open()
defer scoreboard.close()
@@ -113,6 +142,7 @@
http.HandleFunc("/slow", slowHandler)
http.HandleFunc("/stats", statsHandler)
http.HandleFunc("/reset", resetHandler)
+ http.HandleFunc("/request", requestHandler)
}
func httpServe(port int, id string) {
@@ -128,6 +158,7 @@
mux.Handle("/slow", httpsWrapper(slowHandler))
mux.Handle("/stats", httpsWrapper(statsHandler))
mux.Handle("/reset", httpsWrapper(resetHandler))
+ mux.Handle("/request", httpsWrapper(requestHandler))
var tlsConfig *tls.Config
if certpool != nil {
@@ -205,11 +236,14 @@
idPtr := flag.String("id", "1", "Server ID")
httpsPortPtr := flag.Int("https_port", -1,
"HTTPS port to listen on, -1 is disabled.")
+ httpsClientAuthPortPtr := flag.Int("https_client_auth_port", -1,
+ "HTTPS with client authentication port to listen on, -1 is disabled.")
serverCertPem := flag.String("cert", "",
- "Server side PEM format certificate.")
- serverKey := flag.String("key", "", "Server side PEM format key.")
+ "Server side PEM format certificate file path.")
+ serverKey := flag.String("key", "",
+ "Server side PEM format key file path.")
clientCaCertPem := flag.String("client_ca", "",
- "Client side PEM format CA certificate.")
+ "Client auth PEM format CA certificate file path.")
flag.Parse()
@@ -223,21 +257,27 @@
fmt.Println("Error load server certificate and key.")
os.Exit(1)
}
- certpool := x509.NewCertPool()
- if *clientCaCertPem != "" {
- caPem, err := ioutil.ReadFile(*clientCaCertPem)
- if err != nil {
- fmt.Println("Error load client side CA cert.")
- os.Exit(1)
- }
- if !certpool.AppendCertsFromPEM(caPem) {
- fmt.Println("Can't parse client side certificate authority")
- os.Exit(1)
- }
- } else {
- certpool = nil
+ go httpsServe(*httpsPortPtr, *idPtr, cert, nil,
+ *serverCertPem, *serverKey)
+ }
+
+ if *httpsClientAuthPortPtr > -1 {
+ cert, err := tls.LoadX509KeyPair(*serverCertPem, *serverKey)
+ if err != nil {
+ fmt.Println("Error load server certificate and key.\n")
+ os.Exit(1)
}
- go httpsServe(*httpsPortPtr, *idPtr, cert, certpool,
+ certpool := x509.NewCertPool()
+ caPem, err := ioutil.ReadFile(*clientCaCertPem)
+ if err != nil {
+ fmt.Println("Error loading client auth CA cert.\n")
+ os.Exit(1)
+ }
+ if !certpool.AppendCertsFromPEM(caPem) {
+ fmt.Println("Can't parse client auth certificate authority")
+ os.Exit(1)
+ }
+ go httpsServe(*httpsClientAuthPortPtr, *idPtr, cert, certpool,
*serverCertPem, *serverKey)
}
diff --git a/octavia_tempest_plugin/tests/api/v2/test_pool.py b/octavia_tempest_plugin/tests/api/v2/test_pool.py
index 52de166..3ab4892 100644
--- a/octavia_tempest_plugin/tests/api/v2/test_pool.py
+++ b/octavia_tempest_plugin/tests/api/v2/test_pool.py
@@ -443,6 +443,8 @@
const.ONLINE,
CONF.load_balancer.build_interval,
CONF.load_balancer.build_timeout)
+ else:
+ self.assertEqual(const.OFFLINE, pool[const.OPERATING_STATUS])
self.assertEqual(pool_name, pool[const.NAME])
self.assertEqual(pool_description, pool[const.DESCRIPTION])
diff --git a/octavia_tempest_plugin/tests/scenario/v2/test_pool.py b/octavia_tempest_plugin/tests/scenario/v2/test_pool.py
index ae2ef67..6df4c9c 100644
--- a/octavia_tempest_plugin/tests/scenario/v2/test_pool.py
+++ b/octavia_tempest_plugin/tests/scenario/v2/test_pool.py
@@ -434,7 +434,6 @@
parser.parse(pool[const.CREATED_AT])
parser.parse(pool[const.UPDATED_AT])
UUID(pool[const.ID])
- self.assertEqual(const.OFFLINE, pool[const.OPERATING_STATUS])
self.assertEqual(pool_protocol, pool[const.PROTOCOL])
self.assertEqual(1, len(pool[const.LOADBALANCERS]))
self.assertEqual(self.lb_id, pool[const.LOADBALANCERS][0][const.ID])
@@ -443,6 +442,7 @@
self.assertEqual(listener_id, pool[const.LISTENERS][0][const.ID])
else:
self.assertEmpty(pool[const.LISTENERS])
+ self.assertEqual(const.OFFLINE, pool[const.OPERATING_STATUS])
self.assertEqual(algorithm, pool[const.LB_ALGORITHM])
if session_persistence == const.SESSION_PERSISTENCE_APP_COOKIE:
@@ -510,6 +510,13 @@
self.assertEqual(new_description, pool[const.DESCRIPTION])
self.assertTrue(pool[const.ADMIN_STATE_UP])
self.assertEqual(algorithm, pool[const.LB_ALGORITHM])
+ if listener_protocol is not None:
+ pool = waiters.wait_for_status(
+ self.mem_pool_client.show_pool,
+ pool[const.ID], const.OPERATING_STATUS,
+ const.ONLINE,
+ CONF.load_balancer.build_interval,
+ CONF.load_balancer.build_timeout)
if session_persistence == const.SESSION_PERSISTENCE_APP_COOKIE:
self.assertIsNotNone(pool.get(const.SESSION_PERSISTENCE))
diff --git a/octavia_tempest_plugin/tests/scenario/v2/test_traffic_ops.py b/octavia_tempest_plugin/tests/scenario/v2/test_traffic_ops.py
index 92e5ecb..356327b 100644
--- a/octavia_tempest_plugin/tests/scenario/v2/test_traffic_ops.py
+++ b/octavia_tempest_plugin/tests/scenario/v2/test_traffic_ops.py
@@ -928,9 +928,11 @@
listener_id, pool_id = self._listener_pool_create(
const.TCP, 60092,
pool_algorithm=const.LB_ALGORITHM_SOURCE_IP_PORT)
+ # Without a delay this can trigger a "Cannot assign requested
+ # address" warning setting the source port, leading to failure
self._test_basic_traffic(
const.TCP, 60092, listener_id, pool_id, traffic_member_count=1,
- persistent=False, source_port=60092)
+ persistent=False, source_port=60092, delay=0.2)
except exceptions.NotImplemented as e:
message = ("The configured provider driver '{driver}' "
"does not support a feature required for this "
diff --git a/octavia_tempest_plugin/tests/test_base.py b/octavia_tempest_plugin/tests/test_base.py
index 669a33c..887c644 100644
--- a/octavia_tempest_plugin/tests/test_base.py
+++ b/octavia_tempest_plugin/tests/test_base.py
@@ -13,12 +13,14 @@
# under the License.
import ipaddress
+import os
import random
import shlex
import string
import subprocess
import tempfile
+from cryptography.hazmat.primitives import serialization
from oslo_log import log as logging
from oslo_utils import uuidutils
from tempest import config
@@ -29,6 +31,7 @@
import tenacity
from octavia_tempest_plugin import clients
+from octavia_tempest_plugin.common import cert_utils
from octavia_tempest_plugin.common import constants as const
from octavia_tempest_plugin.tests import validators
from octavia_tempest_plugin.tests import waiters
@@ -636,6 +639,9 @@
LOG.info('lb_member_sec_group: {}'.format(cls.lb_member_sec_group))
+ # Setup backend member reencryption PKI
+ cls._create_backend_reencryption_pki()
+
# Create webserver 1 instance
server_details = cls._create_webserver('lb_member_webserver1',
cls.lb_member_1_net)
@@ -699,7 +705,7 @@
# Set up serving on webserver 2
cls._install_start_webserver(cls.webserver2_public_ip,
cls.lb_member_keypair['private_key'],
- cls.webserver2_response)
+ cls.webserver2_response, revoke_cert=True)
# Validate webserver 2
cls._validate_webserver(cls.webserver2_public_ip,
@@ -847,9 +853,9 @@
return webserver_details
@classmethod
- def _install_start_webserver(cls, ip_address, ssh_key, start_id):
+ def _install_start_webserver(cls, ip_address, ssh_key, start_id,
+ revoke_cert=False):
local_file = CONF.load_balancer.test_server_path
- dest_file = '/dev/shm/test_server.bin'
linux_client = remote_client.RemoteClient(
ip_address, CONF.validation.image_ssh_user, pkey=ssh_key)
@@ -865,7 +871,7 @@
CONF.load_balancer.scp_connection_timeout,
CONF.load_balancer.scp_connection_attempts,
key.name, local_file, CONF.validation.image_ssh_user,
- ip_address, dest_file)
+ ip_address, const.TEST_SERVER_BINARY)
args = shlex.split(cmd)
subprocess_args = {'stdout': subprocess.PIPE,
'stderr': subprocess.STDOUT,
@@ -876,6 +882,9 @@
raise exceptions.CommandFailed(proc.returncode, cmd,
stdout, stderr)
+ cls._load_member_pki_content(ip_address, key,
+ revoke_cert=revoke_cert)
+
# Enabling memory overcommit allows to run golang static binaries
# compiled with a recent golang toolchain (>=1.11). Those binaries
# allocate a large amount of virtual memory at init time, and this
@@ -886,10 +895,16 @@
linux_client.exec_command('sudo sh -c "echo 1 > '
'/proc/sys/vm/overcommit_memory"')
- linux_client.exec_command('sudo screen -d -m {0} -port 80 '
- '-id {1}'.format(dest_file, start_id))
+ # The initial process also supports HTTPS and HTTPS with client auth
+ linux_client.exec_command(
+ 'sudo screen -d -m {0} -port 80 -id {1} -https_port 443 -cert {2} '
+ '-key {3} -https_client_auth_port 9443 -client_ca {4}'.format(
+ const.TEST_SERVER_BINARY, start_id, const.TEST_SERVER_CERT,
+ const.TEST_SERVER_KEY, const.TEST_SERVER_CLIENT_CA))
+
linux_client.exec_command('sudo screen -d -m {0} -port 81 '
- '-id {1}'.format(dest_file, start_id + 1))
+ '-id {1}'.format(const.TEST_SERVER_BINARY,
+ start_id + 1))
# Cirros does not configure the assigned IPv6 address by default
# so enable it manually like tempest does here:
@@ -924,3 +939,106 @@
raise Exception("Response from test server doesn't match the "
"expected value ({0} != {1}).".format(
res, str(start_id + 1)))
+
+ @classmethod
+ def _create_backend_reencryption_pki(cls):
+ # Create a CA self-signed cert and key for the member test servers
+ cls.member_ca_cert, cls.member_ca_key = (
+ cert_utils.generate_ca_cert_and_key())
+
+ LOG.debug('Member CA Cert: %s', cls.member_ca_cert.public_bytes(
+ serialization.Encoding.PEM))
+ LOG.debug('Member CA private Key: %s', cls.member_ca_key.private_bytes(
+ encoding=serialization.Encoding.PEM,
+ format=serialization.PrivateFormat.TraditionalOpenSSL,
+ encryption_algorithm=serialization.NoEncryption()))
+ LOG.debug('Member CA public Key: %s',
+ cls.member_ca_key.public_key().public_bytes(
+ encoding=serialization.Encoding.PEM,
+ format=serialization.PublicFormat.SubjectPublicKeyInfo))
+
+ # Create the member client authentication CA
+ cls.member_client_ca_cert, member_client_ca_key = (
+ cert_utils.generate_ca_cert_and_key())
+
+ # Create client cert and key
+ cls.member_client_cn = uuidutils.generate_uuid()
+ cls.member_client_cert, cls.member_client_key = (
+ cert_utils.generate_client_cert_and_key(
+ cls.member_client_ca_cert, member_client_ca_key,
+ cls.member_client_cn))
+ # Note: We are not revoking a client cert here as we don't need to
+ # test the backend web server CRL checking.
+
+ @classmethod
+ def _load_member_pki_content(cls, ip_address, ssh_key, revoke_cert=False):
+ # Create webserver certificate and key
+ cert, key = cert_utils.generate_server_cert_and_key(
+ cls.member_ca_cert, cls.member_ca_key, ip_address)
+
+ LOG.debug('%s Cert: %s', ip_address, cert.public_bytes(
+ serialization.Encoding.PEM))
+ LOG.debug('%s private Key: %s', ip_address, key.private_bytes(
+ encoding=serialization.Encoding.PEM,
+ format=serialization.PrivateFormat.TraditionalOpenSSL,
+ encryption_algorithm=serialization.NoEncryption()))
+ public_key = key.public_key()
+ LOG.debug('%s public Key: %s', ip_address, public_key.public_bytes(
+ encoding=serialization.Encoding.PEM,
+ format=serialization.PublicFormat.SubjectPublicKeyInfo))
+
+ # Create a CRL with a revoked certificate
+ if revoke_cert:
+ # Create a CRL with webserver 2 revoked
+ cls.member_crl = cert_utils.generate_certificate_revocation_list(
+ cls.member_ca_cert, cls.member_ca_key, cert)
+
+ # Load the certificate, key, and client CA certificate into the
+ # test server.
+ with tempfile.TemporaryDirectory() as tmpdir:
+ os.umask(0)
+ files_to_send = []
+ cert_filename = os.path.join(tmpdir, const.CERT_PEM)
+ files_to_send.append(cert_filename)
+ with open(os.open(cert_filename, os.O_CREAT | os.O_WRONLY,
+ 0o700), 'w') as fh:
+ fh.write(cert.public_bytes(
+ serialization.Encoding.PEM).decode('utf-8'))
+ fh.flush()
+ key_filename = os.path.join(tmpdir, const.KEY_PEM)
+ files_to_send.append(key_filename)
+ with open(os.open(key_filename, os.O_CREAT | os.O_WRONLY,
+ 0o700), 'w') as fh:
+ fh.write(key.private_bytes(
+ encoding=serialization.Encoding.PEM,
+ format=serialization.PrivateFormat.TraditionalOpenSSL,
+ encryption_algorithm=serialization.NoEncryption()).decode(
+ 'utf-8'))
+ fh.flush()
+ client_ca_filename = os.path.join(tmpdir, const.CLIENT_CA_PEM)
+ files_to_send.append(client_ca_filename)
+ with open(os.open(client_ca_filename, os.O_CREAT | os.O_WRONLY,
+ 0o700), 'w') as fh:
+ fh.write(cls.member_client_ca_cert.public_bytes(
+ serialization.Encoding.PEM).decode('utf-8'))
+ fh.flush()
+
+ # For security, we don't want to use a shell that can glob
+ # the file names, so iterate over them.
+ subprocess_args = {'stdout': subprocess.PIPE,
+ 'stderr': subprocess.STDOUT,
+ 'cwd': None}
+ cmd = ("scp -v -o UserKnownHostsFile=/dev/null "
+ "-o StrictHostKeyChecking=no "
+ "-o ConnectTimeout={0} -o ConnectionAttempts={1} "
+ "-i {2} {3} {4} {5} {6}@{7}:{8}").format(
+ CONF.load_balancer.scp_connection_timeout,
+ CONF.load_balancer.scp_connection_attempts,
+ ssh_key.name, cert_filename, key_filename, client_ca_filename,
+ CONF.validation.image_ssh_user, ip_address, const.DEV_SHM_PATH)
+ args = shlex.split(cmd)
+ proc = subprocess.Popen(args, **subprocess_args)
+ stdout, stderr = proc.communicate()
+ if proc.returncode != 0:
+ raise exceptions.CommandFailed(proc.returncode, cmd,
+ stdout, stderr)
diff --git a/octavia_tempest_plugin/tests/validators.py b/octavia_tempest_plugin/tests/validators.py
index a93e2eb..5972d54 100644
--- a/octavia_tempest_plugin/tests/validators.py
+++ b/octavia_tempest_plugin/tests/validators.py
@@ -284,6 +284,9 @@
HTTPS_verify, requests_session=requests_session,
source_port=source_port)
+ if source_port:
+ LOG.debug('Using source port %s for request(s)', source_port)
+
response_counts = {}
# Send a number requests to lb vip
for i in range(repeat):
diff --git a/zuul.d/jobs.yaml b/zuul.d/jobs.yaml
index 9a16fd5..2228c1a 100644
--- a/zuul.d/jobs.yaml
+++ b/zuul.d/jobs.yaml
@@ -115,6 +115,7 @@
devstack_plugins:
octavia: https://opendev.org/openstack/octavia.git
octavia-tempest-plugin: https://opendev.org/openstack/octavia-tempest-plugin.git
+ neutron: https://opendev.org/openstack/neutron.git
tempest_plugins:
- octavia-tempest-plugin
@@ -171,6 +172,7 @@
devstack_plugins:
octavia: https://opendev.org/openstack/octavia.git
octavia-tempest-plugin: https://opendev.org/openstack/octavia-tempest-plugin.git
+ neutron: https://opendev.org/openstack/neutron.git
tempest_plugins:
- octavia-tempest-plugin
@@ -205,8 +207,6 @@
not_implemented_is_error: True
devstack_services:
neutron-qos: true
- devstack_plugins:
- neutron: https://opendev.org/openstack/neutron.git
zuul_copy_output:
'/var/log/dib-build' : logs
'/var/log/octavia-amphora.log': logs
@@ -239,8 +239,6 @@
check_timeout: 180
devstack_services:
neutron-qos: true
- devstack_plugins:
- neutron: https://opendev.org/openstack/neutron.git
zuul_copy_output:
'/var/log/dib-build' : logs
'/var/log/octavia-amphora.log': logs
@@ -475,11 +473,6 @@
override-checkout: stable/train
- job:
- name: octavia-v2-dsvm-noop-api-stable-stein
- parent: octavia-v2-dsvm-noop-api
- override-checkout: stable/stein
-
-- job:
name: octavia-v2-dsvm-scenario
parent: octavia-dsvm-live-base
vars:
@@ -543,20 +536,6 @@
parent: octavia-v2-dsvm-scenario
override-checkout: stable/train
-- job:
- name: octavia-v2-dsvm-scenario-stable-stein
- parent: octavia-v2-dsvm-scenario
- override-checkout: stable/stein
- required-projects:
- - name: openstack/diskimage-builder
- override-checkout: 2.30.0
- vars:
- devstack_local_conf:
- test-config:
- "$TEMPEST_CONFIG":
- loadbalancer-feature-enabled:
- log_offload_enabled: False
-
# Legacy jobs for the transition to the act-stdby two node jobs
- job:
name: octavia-v2-dsvm-scenario-two-node
@@ -683,14 +662,6 @@
override-checkout: stable/train
- job:
- name: octavia-v2-dsvm-tls-barbican-stable-stein
- parent: octavia-v2-dsvm-tls-barbican
- override-checkout: stable/stein
- required-projects:
- - name: openstack/diskimage-builder
- override-checkout: 2.30.0
-
-- job:
name: octavia-v2-dsvm-tls-barbican-stable-rocky
parent: octavia-v2-dsvm-tls-barbican
nodeset: openstack-single-node-xenial
@@ -738,14 +709,6 @@
override-checkout: stable/train
- job:
- name: octavia-v2-dsvm-spare-pool-stable-stein
- parent: octavia-v2-dsvm-spare-pool
- override-checkout: stable/stein
- required-projects:
- - name: openstack/diskimage-builder
- override-checkout: 2.30.0
-
-- job:
name: octavia-v2-dsvm-cinder-amphora
parent: octavia-v2-dsvm-scenario
required-projects:
@@ -884,14 +847,6 @@
parent: octavia-v2-act-stdby-dsvm-scenario
override-checkout: stable/train
-- job:
- name: octavia-v2-act-stdby-dsvm-scenario-stable-stein
- parent: octavia-v2-act-stdby-dsvm-scenario
- override-checkout: stable/stein
- required-projects:
- - name: openstack/diskimage-builder
- override-checkout: 2.30.0
-
######### Third party jobs ##########
- job:
diff --git a/zuul.d/projects.yaml b/zuul.d/projects.yaml
index d66f616..9f7385d 100644
--- a/zuul.d/projects.yaml
+++ b/zuul.d/projects.yaml
@@ -11,15 +11,12 @@
- octavia-v2-dsvm-noop-api
- octavia-v2-dsvm-noop-api-stable-ussuri
- octavia-v2-dsvm-noop-api-stable-train
- - octavia-v2-dsvm-noop-api-stable-stein
- octavia-v2-dsvm-scenario
- octavia-v2-dsvm-scenario-stable-ussuri
- octavia-v2-dsvm-scenario-stable-train
- - octavia-v2-dsvm-scenario-stable-stein
- octavia-v2-dsvm-tls-barbican
- octavia-v2-dsvm-tls-barbican-stable-ussuri
- octavia-v2-dsvm-tls-barbican-stable-train
- - octavia-v2-dsvm-tls-barbican-stable-stein
- octavia-v2-dsvm-scenario-ipv6-only:
voting: false
- octavia-v2-dsvm-scenario-centos-8:
@@ -32,16 +29,12 @@
voting: false
- octavia-v2-act-stdby-dsvm-scenario-stable-train:
voting: false
- - octavia-v2-act-stdby-dsvm-scenario-stable-stein:
- voting: false
- octavia-v2-dsvm-spare-pool:
voting: false
- octavia-v2-dsvm-spare-pool-stable-ussuri:
voting: false
- octavia-v2-dsvm-spare-pool-stable-train:
voting: false
- - octavia-v2-dsvm-spare-pool-stable-stein:
- voting: false
- octavia-v2-dsvm-cinder-amphora:
voting: false
# Third party provider jobs
@@ -56,12 +49,9 @@
- octavia-v2-dsvm-noop-api
- octavia-v2-dsvm-noop-api-stable-ussuri
- octavia-v2-dsvm-noop-api-stable-train
- - octavia-v2-dsvm-noop-api-stable-stein
- octavia-v2-dsvm-scenario
- octavia-v2-dsvm-scenario-stable-ussuri
- octavia-v2-dsvm-scenario-stable-train
- - octavia-v2-dsvm-scenario-stable-stein
- octavia-v2-dsvm-tls-barbican
- octavia-v2-dsvm-tls-barbican-stable-ussuri
- octavia-v2-dsvm-tls-barbican-stable-train
- - octavia-v2-dsvm-tls-barbican-stable-stein