Merge "Add a test for overlapping SG rules"
diff --git a/neutron_tempest_plugin/api/base.py b/neutron_tempest_plugin/api/base.py
index 216ccfc..024fe43 100644
--- a/neutron_tempest_plugin/api/base.py
+++ b/neutron_tempest_plugin/api/base.py
@@ -784,6 +784,15 @@
return qos_rule
@classmethod
+ def create_qos_dscp_marking_rule(cls, policy_id, dscp_mark):
+ """Wrapper utility that creates and returns a QoS dscp rule."""
+ body = cls.admin_client.create_dscp_marking_rule(
+ policy_id, dscp_mark)
+ qos_rule = body['dscp_marking_rule']
+ cls.qos_rules.append(qos_rule)
+ return qos_rule
+
+ @classmethod
def delete_router(cls, router, client=None):
client = client or cls.client
if 'routes' in router:
diff --git a/neutron_tempest_plugin/api/test_allowed_address_pair.py b/neutron_tempest_plugin/api/test_allowed_address_pair.py
deleted file mode 100644
index 7b11638..0000000
--- a/neutron_tempest_plugin/api/test_allowed_address_pair.py
+++ /dev/null
@@ -1,121 +0,0 @@
-# Copyright 2014 OpenStack Foundation
-# All Rights Reserved.
-#
-# 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.
-
-from tempest.lib import decorators
-
-from neutron_tempest_plugin.api import base
-
-
-class AllowedAddressPairTestJSON(base.BaseNetworkTest):
-
- """AllowedAddressPairTestJSON class
-
- Tests the Neutron Allowed Address Pair API extension using the Tempest
- REST client. The following API operations are tested with this extension:
-
- create port
- list ports
- update port
- show port
-
- v2.0 of the Neutron API is assumed. It is also assumed that the following
- options are defined in the [network-feature-enabled] section of
- etc/tempest.conf
-
- api_extensions
- """
-
- required_extensions = ['allowed-address-pairs']
-
- @classmethod
- def resource_setup(cls):
- super(AllowedAddressPairTestJSON, cls).resource_setup()
- cls.network = cls.create_network()
- cls.create_subnet(cls.network)
- port = cls.create_port(cls.network)
- cls.ip_address = port['fixed_ips'][0]['ip_address']
- cls.mac_address = port['mac_address']
-
- @decorators.idempotent_id('86c3529b-1231-40de-803c-00e40882f043')
- def test_create_list_port_with_address_pair(self):
- # Create port with allowed address pair attribute
- allowed_address_pairs = [{'ip_address': self.ip_address,
- 'mac_address': self.mac_address}]
- body = self.create_port(
- self.network,
- allowed_address_pairs=allowed_address_pairs)
- port_id = body['id']
-
- # Confirm port was created with allowed address pair attribute
- body = self.client.list_ports()
- ports = body['ports']
- port = [p for p in ports if p['id'] == port_id]
- msg = 'Created port not found in list of ports returned by Neutron'
- self.assertTrue(port, msg)
- self._confirm_allowed_address_pair(port[0], self.ip_address)
-
- def _update_port_with_address(self, address, mac_address=None, **kwargs):
- # Create a port without allowed address pair
- body = self.create_port(self.network)
- port_id = body['id']
- if mac_address is None:
- mac_address = self.mac_address
-
- # Update allowed address pair attribute of port
- allowed_address_pairs = [{'ip_address': address,
- 'mac_address': mac_address}]
- if kwargs:
- allowed_address_pairs.append(kwargs['allowed_address_pairs'])
- body = self.client.update_port(
- port_id, allowed_address_pairs=allowed_address_pairs)
- allowed_address_pair = body['port']['allowed_address_pairs']
- self.assertCountEqual(allowed_address_pair, allowed_address_pairs)
-
- @decorators.idempotent_id('9599b337-272c-47fd-b3cf-509414414ac4')
- def test_update_port_with_address_pair(self):
- # Update port with allowed address pair
- self._update_port_with_address(self.ip_address)
-
- @decorators.idempotent_id('4d6d178f-34f6-4bff-a01c-0a2f8fe909e4')
- def test_update_port_with_cidr_address_pair(self):
- # Update allowed address pair with cidr
- cidr = str(next(self.get_subnet_cidrs()))
- self._update_port_with_address(cidr)
-
- @decorators.idempotent_id('b3f20091-6cd5-472b-8487-3516137df933')
- def test_update_port_with_multiple_ip_mac_address_pair(self):
- # Create an ip _address and mac_address through port create
- resp = self.create_port(self.network)
- ipaddress = resp['fixed_ips'][0]['ip_address']
- macaddress = resp['mac_address']
-
- # Update allowed address pair port with multiple ip and mac
- allowed_address_pairs = {'ip_address': ipaddress,
- 'mac_address': macaddress}
- self._update_port_with_address(
- self.ip_address, self.mac_address,
- allowed_address_pairs=allowed_address_pairs)
-
- def _confirm_allowed_address_pair(self, port, ip):
- msg = 'Port allowed address pairs should not be empty'
- self.assertTrue(port['allowed_address_pairs'], msg)
- ip_address = port['allowed_address_pairs'][0]['ip_address']
- mac_address = port['allowed_address_pairs'][0]['mac_address']
- self.assertEqual(ip_address, ip)
- self.assertEqual(mac_address, self.mac_address)
-
-
-class AllowedAddressPairIpV6TestJSON(AllowedAddressPairTestJSON):
- _ip_version = 6
diff --git a/neutron_tempest_plugin/api/test_qos_negative.py b/neutron_tempest_plugin/api/test_qos_negative.py
index f4d6636..2d06d11 100644
--- a/neutron_tempest_plugin/api/test_qos_negative.py
+++ b/neutron_tempest_plugin/api/test_qos_negative.py
@@ -90,42 +90,122 @@
self.admin_client.delete_qos_policy, non_exist_id)
-class QosBandwidthLimitRuleNegativeTestJSON(base.BaseAdminNetworkTest):
+class QosRuleNegativeBaseTestJSON(base.BaseAdminNetworkTest):
required_extensions = [qos_apidef.ALIAS]
- @decorators.attr(type='negative')
- @decorators.idempotent_id('e9ce8042-c828-4cb9-b1f1-85bd35e6553a')
- def test_rule_update_rule_nonexistent_policy(self):
+ def _test_rule_update_rule_nonexistent_policy(self, create_params,
+ update_params):
non_exist_id = data_utils.rand_name('qos_policy')
policy = self.create_qos_policy(name='test-policy',
description='test policy',
shared=False)
- rule = self.create_qos_bandwidth_limit_rule(policy_id=policy['id'],
- max_kbps=1,
- max_burst_kbps=1)
+ rule = self.rule_create_m(policy_id=policy['id'], **create_params)
self.assertRaises(
lib_exc.NotFound,
- self.admin_client.update_bandwidth_limit_rule,
- non_exist_id, rule['id'], max_kbps=200, max_burst_kbps=1337)
+ self.rule_update_m,
+ non_exist_id, rule['id'], **update_params)
- @decorators.attr(type='negative')
- @decorators.idempotent_id('1b592566-745f-4e15-a439-073afe341244')
- def test_rule_create_rule_non_existent_policy(self):
+ def _test_rule_create_rule_non_existent_policy(self, create_params):
non_exist_id = data_utils.rand_name('qos_policy')
self.assertRaises(
lib_exc.NotFound,
- self.admin_client.create_bandwidth_limit_rule,
- non_exist_id, max_kbps=200, max_burst_kbps=300)
+ self.rule_create_m,
+ non_exist_id, **create_params)
- @decorators.attr(type='negative')
- @decorators.idempotent_id('a2c72066-0c32-4f28-be7f-78fa721588b6')
- def test_rule_update_rule_nonexistent_rule(self):
+ def _test_rule_update_rule_nonexistent_rule(self, update_params):
non_exist_id = data_utils.rand_name('qos_rule')
policy = self.create_qos_policy(name='test-policy',
description='test policy',
shared=False)
self.assertRaises(
lib_exc.NotFound,
- self.admin_client.update_bandwidth_limit_rule,
- policy['id'], non_exist_id, max_kbps=200, max_burst_kbps=1337)
+ self.rule_update_m,
+ policy['id'], non_exist_id, **update_params)
+
+
+class QosBandwidthLimitRuleNegativeTestJSON(QosRuleNegativeBaseTestJSON):
+
+ @classmethod
+ def resource_setup(cls):
+ cls.rule_create_m = cls.create_qos_bandwidth_limit_rule
+ cls.rule_update_m = cls.admin_client.update_bandwidth_limit_rule
+ super(QosBandwidthLimitRuleNegativeTestJSON, cls).resource_setup()
+
+ @decorators.attr(type='negative')
+ @decorators.idempotent_id('e9ce8042-c828-4cb9-b1f1-85bd35e6553a')
+ def test_rule_update_rule_nonexistent_policy(self):
+ create_params = {'max_kbps': 1, 'max_burst_kbps': 1}
+ update_params = {'max_kbps': 200, 'max_burst_kbps': 1337}
+ self._test_rule_update_rule_nonexistent_policy(
+ create_params, update_params)
+
+ @decorators.attr(type='negative')
+ @decorators.idempotent_id('1b592566-745f-4e15-a439-073afe341244')
+ def test_rule_create_rule_non_existent_policy(self):
+ create_params = {'max_kbps': 200, 'max_burst_kbps': 300}
+ self._test_rule_create_rule_non_existent_policy(create_params)
+
+ @decorators.attr(type='negative')
+ @decorators.idempotent_id('a2c72066-0c32-4f28-be7f-78fa721588b6')
+ def test_rule_update_rule_nonexistent_rule(self):
+ update_params = {'max_kbps': 200, 'max_burst_kbps': 1337}
+ self._test_rule_update_rule_nonexistent_rule(update_params)
+
+
+class QosMinimumBandwidthRuleNegativeTestJSON(QosRuleNegativeBaseTestJSON):
+
+ @classmethod
+ def resource_setup(cls):
+ cls.rule_create_m = cls.create_qos_minimum_bandwidth_rule
+ cls.rule_update_m = cls.admin_client.update_minimum_bandwidth_rule
+ super(QosMinimumBandwidthRuleNegativeTestJSON, cls).resource_setup()
+
+ @decorators.attr(type='negative')
+ @decorators.idempotent_id('08b8455b-4d4f-4119-bad3-9357085c3a80')
+ def test_rule_update_rule_nonexistent_policy(self):
+ create_params = {'min_kbps': 1}
+ update_params = {'min_kbps': 200}
+ self._test_rule_update_rule_nonexistent_policy(
+ create_params, update_params)
+
+ @decorators.attr(type='negative')
+ @decorators.idempotent_id('5a714a4a-bfbc-4cf9-b0c0-13fd185204f7')
+ def test_rule_create_rule_non_existent_policy(self):
+ create_params = {'min_kbps': 200}
+ self._test_rule_create_rule_non_existent_policy(create_params)
+
+ @decorators.attr(type='negative')
+ @decorators.idempotent_id('8470cbe0-8ca5-46ab-9c66-7cf69301b121')
+ def test_rule_update_rule_nonexistent_rule(self):
+ update_params = {'min_kbps': 200}
+ self._test_rule_update_rule_nonexistent_rule(update_params)
+
+
+class QosDscpRuleNegativeTestJSON(QosRuleNegativeBaseTestJSON):
+
+ @classmethod
+ def resource_setup(cls):
+ cls.rule_create_m = cls.create_qos_dscp_marking_rule
+ cls.rule_update_m = cls.admin_client.update_dscp_marking_rule
+ super(QosDscpRuleNegativeTestJSON, cls).resource_setup()
+
+ @decorators.attr(type='negative')
+ @decorators.idempotent_id('d47d5fbe-3e98-476f-b2fd-97818175dea5')
+ def test_rule_update_rule_nonexistent_policy(self):
+ create_params = {'dscp_mark': 26}
+ update_params = {'dscp_mark': 16}
+ self._test_rule_update_rule_nonexistent_policy(
+ create_params, update_params)
+
+ @decorators.attr(type='negative')
+ @decorators.idempotent_id('07d17f09-3dc4-4c24-9bb1-49081a153c5a')
+ def test_rule_create_rule_non_existent_policy(self):
+ create_params = {'dscp_mark': 16}
+ self._test_rule_create_rule_non_existent_policy(create_params)
+
+ @decorators.attr(type='negative')
+ @decorators.idempotent_id('9c0bd085-5a7a-496f-a984-50dc631a64f2')
+ def test_rule_update_rule_nonexistent_rule(self):
+ update_params = {'dscp_mark': 16}
+ self._test_rule_update_rule_nonexistent_rule(update_params)
diff --git a/neutron_tempest_plugin/api/test_subnets.py b/neutron_tempest_plugin/api/test_subnets.py
index b8842ab..d4992d3 100644
--- a/neutron_tempest_plugin/api/test_subnets.py
+++ b/neutron_tempest_plugin/api/test_subnets.py
@@ -10,6 +10,7 @@
# License for the specific language governing permissions and limitations
# under the License.
+import netaddr
from tempest.lib import decorators
from neutron_tempest_plugin.api import base
@@ -69,3 +70,38 @@
self._test_list_validation_filters(self.list_kwargs)
self._test_list_validation_filters({
'unknown_filter': 'value'}, filter_is_valid=False)
+
+
+class SubnetServiceTypeTestJSON(base.BaseNetworkTest):
+
+ required_extensions = ['subnet-service-types']
+
+ @classmethod
+ def resource_setup(cls):
+ super(SubnetServiceTypeTestJSON, cls).resource_setup()
+ cls.network = cls.create_network()
+
+ @decorators.idempotent_id('7e0edb66-1bb2-4473-ab83-d039cddced0d')
+ def test_allocate_ips_are_from_correct_subnet(self):
+ cidr_1 = netaddr.IPNetwork('192.168.1.0/24')
+ cidr_2 = netaddr.IPNetwork('192.168.2.0/24')
+
+ self.create_subnet(self.network,
+ service_types=['test:type_1'],
+ cidr=str(cidr_1))
+ self.create_subnet(self.network,
+ service_types=['test:type_2'],
+ cidr=str(cidr_2))
+ port_type_1 = self.create_port(self.network,
+ device_owner="test:type_1")
+ port_type_2 = self.create_port(self.network,
+ device_owner="test:type_2")
+
+ self.assertEqual(1, len(port_type_1['fixed_ips']))
+ self.assertEqual(1, len(port_type_2['fixed_ips']))
+ self.assertIn(
+ netaddr.IPAddress(port_type_1['fixed_ips'][0]['ip_address']),
+ cidr_1)
+ self.assertIn(
+ netaddr.IPAddress(port_type_2['fixed_ips'][0]['ip_address']),
+ cidr_2)
diff --git a/neutron_tempest_plugin/common/utils.py b/neutron_tempest_plugin/common/utils.py
index f03762c..1526ecf 100644
--- a/neutron_tempest_plugin/common/utils.py
+++ b/neutron_tempest_plugin/common/utils.py
@@ -136,3 +136,74 @@
def call_url_remote(ssh_client, url):
cmd = "curl %s --retry 3 --connect-timeout 2" % url
return ssh_client.exec_command(cmd)
+
+
+class StatefulConnection:
+ """Class to test connection that should remain opened
+
+ Can be used to perform some actions while the initiated connection
+ remain opened
+ """
+
+ def __init__(self, client_ssh, server_ssh, target_ip, target_port):
+ self.client_ssh = client_ssh
+ self.server_ssh = server_ssh
+ self.ip = target_ip
+ self.port = target_port
+ self.connection_started = False
+ self.test_attempt = 0
+
+ def __enter__(self):
+ return self
+
+ @property
+ def test_str(self):
+ return 'attempt_{}'.format(str(self.test_attempt).zfill(3))
+
+ def _start_connection(self):
+ self.server_ssh.exec_command(
+ 'echo "{}" > input.txt'.format(self.test_str))
+ self.server_ssh.exec_command('tail -f input.txt | nc -lp '
+ '{} &> output.txt &'.format(self.port))
+ self.client_ssh.exec_command(
+ 'echo "{}" > input.txt'.format(self.test_str))
+ self.client_ssh.exec_command('tail -f input.txt | nc {} {} &>'
+ 'output.txt &'.format(self.ip, self.port))
+
+ def _test_connection(self):
+ if not self.connection_started:
+ self._start_connection()
+ else:
+ self.server_ssh.exec_command(
+ 'echo "{}" >> input.txt'.format(self.test_str))
+ self.client_ssh.exec_command(
+ 'echo "{}" >> input.txt & sleep 1'.format(self.test_str))
+ try:
+ self.server_ssh.exec_command(
+ 'grep {} output.txt'.format(self.test_str))
+ self.client_ssh.exec_command(
+ 'grep {} output.txt'.format(self.test_str))
+ if not self.should_pass:
+ return False
+ else:
+ if not self.connection_started:
+ self.connection_started = True
+ return True
+ except exceptions.SSHExecCommandFailed:
+ if self.should_pass:
+ return False
+ else:
+ return True
+ finally:
+ self.test_attempt += 1
+
+ def test_connection(self, should_pass=True, timeout=10, sleep_timer=1):
+ self.should_pass = should_pass
+ wait_until_true(
+ self._test_connection, timeout=timeout, sleep=sleep_timer)
+
+ def __exit__(self, type, value, traceback):
+ self.server_ssh.exec_command('sudo killall nc || killall nc')
+ self.server_ssh.exec_command('sudo killall tail || killall tail')
+ self.client_ssh.exec_command('sudo killall nc || killall nc')
+ self.client_ssh.exec_command('sudo killall tail || killall tail')
diff --git a/neutron_tempest_plugin/scenario/test_dns_integration.py b/neutron_tempest_plugin/scenario/test_dns_integration.py
index 5c590eb..79c0993 100644
--- a/neutron_tempest_plugin/scenario/test_dns_integration.py
+++ b/neutron_tempest_plugin/scenario/test_dns_integration.py
@@ -199,3 +199,56 @@
self.client.delete_port(port['id'])
self._verify_dns_records(addr_v6, name, record_type='AAAA',
found=False)
+
+
+class DNSIntegrationDomainPerProjectTests(BaseDNSIntegrationTests):
+
+ credentials = ['primary', 'admin']
+
+ required_extensions = ['subnet-dns-publish-fixed-ip',
+ 'dns-integration-domain-keywords']
+
+ @classmethod
+ def resource_setup(cls):
+ super(BaseDNSIntegrationTests, cls).resource_setup()
+
+ name = data_utils.rand_name('test-domain')
+ zone_name = "%s.%s.%s.zone." % (cls.client.user_id,
+ cls.client.tenant_id,
+ name)
+ dns_domain_template = "<user_id>.<project_id>.%s.zone." % name
+
+ _, cls.zone = cls.dns_client.create_zone(name=zone_name)
+ cls.addClassResourceCleanup(cls.dns_client.delete_zone,
+ cls.zone['id'], ignore_errors=lib_exc.NotFound)
+ dns_waiters.wait_for_zone_status(
+ cls.dns_client, cls.zone['id'], 'ACTIVE')
+
+ cls.network = cls.create_network(dns_domain=dns_domain_template)
+ cls.subnet = cls.create_subnet(cls.network,
+ dns_publish_fixed_ip=True)
+ cls.subnet_v6 = cls.create_subnet(cls.network,
+ ip_version=6,
+ dns_publish_fixed_ip=True)
+ cls.router = cls.create_router_by_client()
+ cls.create_router_interface(cls.router['id'], cls.subnet['id'])
+ cls.keypair = cls.create_keypair()
+
+ @decorators.idempotent_id('43a67509-3161-4125-8f2c-0d4a67599721')
+ def test_port_with_dns_name(self):
+ name = data_utils.rand_name('port-test')
+ port = self.create_port(self.network,
+ dns_name=name)
+ addr = port['fixed_ips'][0]['ip_address']
+ self._verify_dns_records(addr, name)
+ self.client.delete_port(port['id'])
+ self._verify_dns_records(addr, name, found=False)
+
+ @decorators.idempotent_id('ac89db9b-5ca4-43bd-85ba-40fbeb47e208')
+ def test_fip_admin_delete(self):
+ name = data_utils.rand_name('fip-test')
+ fip = self._create_floatingip_with_dns(name)
+ addr = fip['floating_ip_address']
+ self._verify_dns_records(addr, name)
+ self.delete_floatingip(fip, client=self.admin_client)
+ self._verify_dns_records(addr, name, found=False)
diff --git a/neutron_tempest_plugin/scenario/test_security_groups.py b/neutron_tempest_plugin/scenario/test_security_groups.py
index 082069a..40aa66a 100644
--- a/neutron_tempest_plugin/scenario/test_security_groups.py
+++ b/neutron_tempest_plugin/scenario/test_security_groups.py
@@ -278,6 +278,50 @@
'remote_ip_prefix': cidr}]
self._test_ip_prefix(rule_list, should_succeed=False)
+ @decorators.idempotent_id('01f0ddca-b049-47eb-befd-82acb502c9ec')
+ def test_established_tcp_session_after_re_attachinging_sg(self):
+ """Test existing connection remain open after sg has been re-attached
+
+ Verifies that new packets can pass over the existing connection when
+ the security group has been removed from the server and then added
+ back
+ """
+
+ ssh_sg = self.create_security_group()
+ self.create_loginable_secgroup_rule(secgroup_id=ssh_sg['id'])
+ vm_ssh, fips, vms = self.create_vm_testing_sec_grp(
+ security_groups=[{'name': ssh_sg['name']}])
+ sg = self.create_security_group()
+ nc_rule = [{'protocol': constants.PROTO_NUM_TCP,
+ 'direction': constants.INGRESS_DIRECTION,
+ 'port_range_min': 6666,
+ 'port_range_max': 6666}]
+ self.create_secgroup_rules(nc_rule, secgroup_id=sg['id'])
+ srv_port = self.client.list_ports(network_id=self.network['id'],
+ device_id=vms[1]['server']['id'])['ports'][0]
+ srv_ip = srv_port['fixed_ips'][0]['ip_address']
+ with utils.StatefulConnection(
+ vm_ssh[0], vm_ssh[1], srv_ip, 6666) as con:
+ self.client.update_port(srv_port['id'],
+ security_groups=[ssh_sg['id'], sg['id']])
+ con.test_connection()
+ with utils.StatefulConnection(
+ vm_ssh[0], vm_ssh[1], srv_ip, 6666) as con:
+ self.client.update_port(
+ srv_port['id'], security_groups=[ssh_sg['id']])
+ con.test_connection(should_pass=False)
+ with utils.StatefulConnection(
+ vm_ssh[0], vm_ssh[1], srv_ip, 6666) as con:
+ self.client.update_port(srv_port['id'],
+ security_groups=[ssh_sg['id'], sg['id']])
+ con.test_connection()
+ self.client.update_port(srv_port['id'],
+ security_groups=[ssh_sg['id']])
+ con.test_connection(should_pass=False)
+ self.client.update_port(srv_port['id'],
+ security_groups=[ssh_sg['id'], sg['id']])
+ con.test_connection()
+
@decorators.idempotent_id('7ed39b86-006d-40fb-887a-ae46693dabc9')
def test_remote_group(self):
# create a new sec group
diff --git a/zuul.d/master_jobs.yaml b/zuul.d/master_jobs.yaml
index e9599bf..063eb02 100644
--- a/zuul.d/master_jobs.yaml
+++ b/zuul.d/master_jobs.yaml
@@ -17,6 +17,7 @@
- dhcp_agent_scheduler
- dns-domain-ports
- dns-integration
+ - dns-integration-domain-keywords
- empty-string-filtering
- expose-port-forwarding-in-fip
- expose-l3-conntrack-helper
@@ -75,6 +76,7 @@
- standard-attr-timestamp
- subnet_allocation
- subnet-dns-publish-fixed-ip
+ - subnet-service-types
- subnetpool-prefix-ops
- tag-ports-during-bulk-creation
- trunk
@@ -86,11 +88,25 @@
- ipv6_metadata
tempest_test_regex: ^neutron_tempest_plugin\.api
devstack_services:
+ # Disable OVN services
+ br-ex-tcpdump: false
+ br-int-flows: false
+ ovn-controller: false
+ ovn-northd: false
+ ovs-vswitchd: false
+ ovsdb-server: false
+ q-ovn-metadata-agent: false
+ # Neutron services
+ q-agt: true
+ q-dhcp: true
+ q-l3: true
+ q-meta: true
+ q-metering: true
neutron-log: true
devstack_localrc:
- # TODO(lucasagomes): Re-enable MOD_WSGI after
- # https://bugs.launchpad.net/neutron/+bug/1912359 is implemented
- NEUTRON_DEPLOY_MOD_WSGI: false
+ Q_AGENT: openvswitch
+ Q_ML2_TENANT_NETWORK_TYPE: vxlan
+ Q_ML2_PLUGIN_MECHANISM_DRIVERS: openvswitch
devstack_local_conf:
post-config:
# NOTE(slaweq): We can get rid of this hardcoded absolute path when
@@ -206,7 +222,11 @@
network_available_features: *available_features
# TODO(slaweq): remove trunks subport_connectivity test from blacklist
# when bug https://bugs.launchpad.net/neutron/+bug/1838760 will be fixed
- tempest_exclude_regex: "(^neutron_tempest_plugin.scenario.test_trunk.TrunkTest.test_subport_connectivity)"
+ # TODO(akatz): remove established tcp session verification test when the
+ # bug https://bugzilla.redhat.com/show_bug.cgi?id=1965036 will be fixed
+ tempest_exclude_regex: "\
+ (^neutron_tempest_plugin.scenario.test_trunk.TrunkTest.test_subport_connectivity)|\
+ (^neutron_tempest_plugin.scenario.test_security_groups.NetworkSecGroupTest.test_established_tcp_session_after_re_attachinging_sg)"
devstack_localrc:
Q_AGENT: openvswitch
Q_ML2_TENANT_NETWORK_TYPE: vxlan
diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml
index 936bd11..969f80a 100644
--- a/zuul.d/project.yaml
+++ b/zuul.d/project.yaml
@@ -7,6 +7,7 @@
- neutron-tempest-plugin-scenario-openvswitch
- neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid
- neutron-tempest-plugin-scenario-ovn
+ - neutron-tempest-plugin-designate-scenario
gate:
jobs:
- neutron-tempest-plugin-api
@@ -19,10 +20,6 @@
experimental:
jobs:
- neutron-tempest-plugin-dvr-multinode-scenario
- # TODO(slaweq): move it back to the check queue when bug
- # https://bugs.launchpad.net/neutron/+bug/1891309
- # will be fixed
- - neutron-tempest-plugin-designate-scenario
- project-template:
@@ -50,6 +47,7 @@
- neutron-tempest-plugin-scenario-linuxbridge-rocky
- neutron-tempest-plugin-scenario-openvswitch-rocky
- neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-rocky
+ - neutron-tempest-plugin-designate-scenario-rocky
gate:
jobs:
- neutron-tempest-plugin-api-rocky
@@ -58,10 +56,6 @@
experimental:
jobs:
- neutron-tempest-plugin-dvr-multinode-scenario-rocky
- # TODO(slaweq): move it back to the check queue when bug
- # https://bugs.launchpad.net/neutron/+bug/1891309
- # will be fixed
- - neutron-tempest-plugin-designate-scenario-rocky
- project-template:
@@ -72,6 +66,7 @@
- neutron-tempest-plugin-scenario-linuxbridge-stein
- neutron-tempest-plugin-scenario-openvswitch-stein
- neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-stein
+ - neutron-tempest-plugin-designate-scenario-stein
gate:
jobs:
- neutron-tempest-plugin-api-stein
@@ -80,10 +75,6 @@
experimental:
jobs:
- neutron-tempest-plugin-dvr-multinode-scenario-stein
- # TODO(slaweq): move it back to the check queue when bug
- # https://bugs.launchpad.net/neutron/+bug/1891309
- # will be fixed
- - neutron-tempest-plugin-designate-scenario-stein
- project-template:
@@ -94,6 +85,7 @@
- neutron-tempest-plugin-scenario-linuxbridge-train
- neutron-tempest-plugin-scenario-openvswitch-train
- neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-train
+ - neutron-tempest-plugin-designate-scenario-train
gate:
jobs:
- neutron-tempest-plugin-api-train
@@ -102,10 +94,6 @@
experimental:
jobs:
- neutron-tempest-plugin-dvr-multinode-scenario-train
- # TODO(slaweq): move it back to the check queue when bug
- # https://bugs.launchpad.net/neutron/+bug/1891309
- # will be fixed
- - neutron-tempest-plugin-designate-scenario-train
- project-template:
@@ -117,6 +105,7 @@
- neutron-tempest-plugin-scenario-openvswitch-ussuri
- neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-ussuri
- neutron-tempest-plugin-scenario-ovn-ussuri
+ - neutron-tempest-plugin-designate-scenario-ussuri
gate:
jobs:
- neutron-tempest-plugin-api-ussuri
@@ -125,10 +114,6 @@
experimental:
jobs:
- neutron-tempest-plugin-dvr-multinode-scenario-ussuri
- # TODO(slaweq): move it back to the check queue when bug
- # https://bugs.launchpad.net/neutron/+bug/1891309
- # will be fixed
- - neutron-tempest-plugin-designate-scenario-ussuri
- project-template:
@@ -140,6 +125,7 @@
- neutron-tempest-plugin-scenario-openvswitch-victoria
- neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-victoria
- neutron-tempest-plugin-scenario-ovn-victoria
+ - neutron-tempest-plugin-designate-scenario-victoria
gate:
jobs:
- neutron-tempest-plugin-api-victoria
@@ -148,10 +134,6 @@
experimental:
jobs:
- neutron-tempest-plugin-dvr-multinode-scenario-victoria
- # TODO(slaweq): move it back to the check queue when bug
- # https://bugs.launchpad.net/neutron/+bug/1891309
- # will be fixed
- - neutron-tempest-plugin-designate-scenario-victoria
- project-template:
@@ -163,6 +145,7 @@
- neutron-tempest-plugin-scenario-openvswitch-wallaby
- neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-wallaby
- neutron-tempest-plugin-scenario-ovn-wallaby
+ - neutron-tempest-plugin-designate-scenario-wallaby
gate:
jobs:
- neutron-tempest-plugin-api-wallaby
@@ -171,10 +154,6 @@
experimental:
jobs:
- neutron-tempest-plugin-dvr-multinode-scenario-wallaby
- # TODO(slaweq): move it back to the check queue when bug
- # https://bugs.launchpad.net/neutron/+bug/1891309
- # will be fixed
- - neutron-tempest-plugin-designate-scenario-wallaby
- project:
diff --git a/zuul.d/queens_jobs.yaml b/zuul.d/queens_jobs.yaml
index 33430c8..9701548 100644
--- a/zuul.d/queens_jobs.yaml
+++ b/zuul.d/queens_jobs.yaml
@@ -75,6 +75,7 @@
- standard-attr-timestamp
- standard-attr-tag
- subnet_allocation
+ - subnet-service-types
- trunk
- trunk-details
network_api_extensions_tempest:
diff --git a/zuul.d/rocky_jobs.yaml b/zuul.d/rocky_jobs.yaml
index c5ccbc0..11e4c9a 100644
--- a/zuul.d/rocky_jobs.yaml
+++ b/zuul.d/rocky_jobs.yaml
@@ -84,6 +84,7 @@
- standard-attr-timestamp
- standard-attr-tag
- subnet_allocation
+ - subnet-service-types
- trunk
- trunk-details
network_api_extensions_tempest:
diff --git a/zuul.d/stein_jobs.yaml b/zuul.d/stein_jobs.yaml
index 7a8ea25..40bca7c 100644
--- a/zuul.d/stein_jobs.yaml
+++ b/zuul.d/stein_jobs.yaml
@@ -88,6 +88,7 @@
- standard-attr-tag
- standard-attr-timestamp
- subnet_allocation
+ - subnet-service-types
- trunk
- trunk-details
- uplink-status-propagation
diff --git a/zuul.d/train_jobs.yaml b/zuul.d/train_jobs.yaml
index b87dc8c..a623251 100644
--- a/zuul.d/train_jobs.yaml
+++ b/zuul.d/train_jobs.yaml
@@ -92,6 +92,7 @@
- standard-attr-tag
- standard-attr-timestamp
- subnet_allocation
+ - subnet-service-types
- subnetpool-prefix-ops
- trunk
- trunk-details
diff --git a/zuul.d/ussuri_jobs.yaml b/zuul.d/ussuri_jobs.yaml
index 945ec25..5c5881e 100644
--- a/zuul.d/ussuri_jobs.yaml
+++ b/zuul.d/ussuri_jobs.yaml
@@ -90,6 +90,7 @@
- standard-attr-timestamp
- subnet_allocation
- subnet-dns-publish-fixed-ip
+ - subnet-service-types
- subnetpool-prefix-ops
- tag-ports-during-bulk-creation
- trunk
diff --git a/zuul.d/victoria_jobs.yaml b/zuul.d/victoria_jobs.yaml
index e0e29ed..832d242 100644
--- a/zuul.d/victoria_jobs.yaml
+++ b/zuul.d/victoria_jobs.yaml
@@ -89,6 +89,7 @@
- standard-attr-timestamp
- subnet_allocation
- subnet-dns-publish-fixed-ip
+ - subnet-service-types
- subnetpool-prefix-ops
- tag-ports-during-bulk-creation
- trunk
diff --git a/zuul.d/wallaby_jobs.yaml b/zuul.d/wallaby_jobs.yaml
index fa2ddb6..13a192e 100644
--- a/zuul.d/wallaby_jobs.yaml
+++ b/zuul.d/wallaby_jobs.yaml
@@ -76,6 +76,7 @@
- standard-attr-timestamp
- subnet_allocation
- subnet-dns-publish-fixed-ip
+ - subnet-service-types
- subnetpool-prefix-ops
- tag-ports-during-bulk-creation
- trunk