Merge "Add release notes page for version 29.0.0, 28.1.0, 28.0.0"
diff --git a/tempest/api/object_storage/base.py b/tempest/api/object_storage/base.py
index 478a834..77e26ef 100644
--- a/tempest/api/object_storage/base.py
+++ b/tempest/api/object_storage/base.py
@@ -13,6 +13,8 @@
# License for the specific language governing permissions and limitations
# under the License.
+import time
+
from tempest.common import custom_matchers
from tempest import config
from tempest.lib.common.utils import data_utils
@@ -119,12 +121,20 @@
object_name = data_utils.rand_name(name='TestObject')
if data is None:
data = data_utils.random_bytes()
- cls.object_client.create_object(container_name,
- object_name,
- data,
- metadata=metadata)
- return object_name, data
+ err = Exception()
+ for _ in range(5):
+ try:
+ cls.object_client.create_object(container_name,
+ object_name,
+ data,
+ metadata=metadata)
+ return object_name, data
+ # after bucket creation we might see Conflict
+ except lib_exc.Conflict as e:
+ err = e
+ time.sleep(2)
+ raise err
@classmethod
def delete_containers(cls, container_client=None, object_client=None):
diff --git a/tempest/api/volume/admin/test_volume_types_negative.py b/tempest/api/volume/admin/test_volume_types_negative.py
index 42d3bdf..f37c427 100644
--- a/tempest/api/volume/admin/test_volume_types_negative.py
+++ b/tempest/api/volume/admin/test_volume_types_negative.py
@@ -69,3 +69,13 @@
self.assertRaises(
lib_exc.NotFound,
self.create_encryption_type, **create_kwargs)
+
+ @decorators.attr(type=['negative'])
+ @decorators.idempotent_id('969b10c7-3d77-4e1b-a4f2-2d265980f7e5')
+ def test_create_with_repeated_name(self):
+ """Test creating volume type with a repeated name will fail"""
+ volume_type_name = self.create_volume_type()['name']
+ self.assertRaises(
+ lib_exc.Conflict,
+ self.admin_volume_types_client.create_volume_type,
+ name=volume_type_name)
diff --git a/tempest/scenario/test_minbw_allocation_placement.py b/tempest/scenario/test_minbw_allocation_placement.py
index 55b8d15..81bd24d 100644
--- a/tempest/scenario/test_minbw_allocation_placement.py
+++ b/tempest/scenario/test_minbw_allocation_placement.py
@@ -146,11 +146,8 @@
resources1='%s:%s' % (self.INGRESS_RESOURCE_CLASS,
self.SMALLEST_POSSIBLE_BW))
if len(alloc_candidates['provider_summaries']) == 0:
- # Skip if the backend does not support QoS minimum bandwidth
- # allocation in Placement API
- raise self.skipException(
- 'No allocation candidates are available for %s:%s' %
- (self.INGRESS_RESOURCE_CLASS, self.SMALLEST_POSSIBLE_BW))
+ self.fail('No allocation candidates are available for %s:%s' %
+ (self.INGRESS_RESOURCE_CLASS, self.SMALLEST_POSSIBLE_BW))
# Just to be sure check with impossible high (placement max_int),
# allocation
diff --git a/tempest/scenario/test_network_basic_ops.py b/tempest/scenario/test_network_basic_ops.py
index add5c32..cbe8c20 100644
--- a/tempest/scenario/test_network_basic_ops.py
+++ b/tempest/scenario/test_network_basic_ops.py
@@ -329,13 +329,16 @@
floating_ip, server = self.floating_ip_tuple
# get internal ports' ips:
# get all network and compute ports in the new network
+ # NOTE(ralonsoh): device_owner="network:distributed" ports are OVN
+ # metadata ports and should be filtered out.
internal_ips = (
p['fixed_ips'][0]['ip_address'] for p in
self.os_admin.ports_client.list_ports(
project_id=server['tenant_id'],
network_id=network['id'])['ports']
- if p['device_owner'].startswith('network') or
- p['device_owner'].startswith('compute')
+ if ((p['device_owner'].startswith('network') and
+ not p['device_owner'] == 'network:distributed') or
+ p['device_owner'].startswith('compute'))
)
self._check_server_connectivity(floating_ip,
diff --git a/tempest/tests/lib/cmd/test_check_uuid.py b/tempest/tests/lib/cmd/test_check_uuid.py
index 403de38..edfb2c8 100644
--- a/tempest/tests/lib/cmd/test_check_uuid.py
+++ b/tempest/tests/lib/cmd/test_check_uuid.py
@@ -28,37 +28,33 @@
" def test_tests(self):\n" \
" pass"
- def create_tests_file(self, directory):
- init_file = open(directory + "/__init__.py", "w")
+ def setUp(self):
+ super(TestCLInterface, self).setUp()
+ self.directory = tempfile.mkdtemp(prefix='check-uuid', dir=".")
+ self.addCleanup(shutil.rmtree, self.directory, ignore_errors=True)
+
+ init_file = open(self.directory + "/__init__.py", "w")
init_file.close()
- tests_file = directory + "/tests.py"
- with open(tests_file, "w") as fake_file:
+ self.tests_file = self.directory + "/tests.py"
+ with open(self.tests_file, "w") as fake_file:
fake_file.write(TestCLInterface.CODE)
fake_file.close()
- return tests_file
-
def test_fix_argument_no(self):
- temp_dir = tempfile.mkdtemp(prefix='check-uuid-no', dir=".")
- self.addCleanup(shutil.rmtree, temp_dir, ignore_errors=True)
- tests_file = self.create_tests_file(temp_dir)
sys.argv = [sys.argv[0]] + ["--package",
- os.path.relpath(temp_dir)]
+ os.path.relpath(self.directory)]
self.assertRaises(SystemExit, check_uuid.run)
- with open(tests_file, "r") as f:
+ with open(self.tests_file, "r") as f:
self.assertTrue(TestCLInterface.CODE == f.read())
def test_fix_argument_yes(self):
- temp_dir = tempfile.mkdtemp(prefix='check-uuid-yes', dir=".")
- self.addCleanup(shutil.rmtree, temp_dir, ignore_errors=True)
- tests_file = self.create_tests_file(temp_dir)
sys.argv = [sys.argv[0]] + ["--fix", "--package",
- os.path.relpath(temp_dir)]
+ os.path.relpath(self.directory)]
check_uuid.run()
- with open(tests_file, "r") as f:
+ with open(self.tests_file, "r") as f:
self.assertTrue(TestCLInterface.CODE != f.read())
diff --git a/zuul.d/integrated-gate.yaml b/zuul.d/integrated-gate.yaml
index 2faaa29..5bbb5e1 100644
--- a/zuul.d/integrated-gate.yaml
+++ b/zuul.d/integrated-gate.yaml
@@ -82,21 +82,9 @@
GLANCE_USE_IMPORT_WORKFLOW: True
devstack_plugins:
neutron: https://opendev.org/openstack/neutron
- devstack_local_conf:
- post-config:
- "/$NEUTRON_CORE_PLUGIN_CONF":
- ovs:
- bridge_mappings: public:br-ex
- resource_provider_bandwidths: br-ex:1000000:1000000
- test-config:
- $TEMPEST_CONFIG:
- network-feature-enabled:
- qos_placement_physnet: public
devstack_services:
# Enbale horizon so that we can run horizon test.
horizon: true
- neutron-placement: true
- neutron-qos: true
- job:
name: tempest-integrated-networking
@@ -229,30 +217,12 @@
USE_PYTHON3: true
devstack_plugins:
neutron: https://opendev.org/openstack/neutron
- devstack_local_conf:
- post-config:
- "/$NEUTRON_CORE_PLUGIN_CONF":
- ovs:
- bridge_mappings: public:br-ex
- resource_provider_bandwidths: br-ex:1000000:1000000
- test-config:
- $TEMPEST_CONFIG:
- network-feature-enabled:
- qos_placement_physnet: public
devstack_services:
- neutron-placement: true
- neutron-qos: true
neutron-trunk: true
group-vars:
subnode:
devstack_localrc:
USE_PYTHON3: true
- devstack_local_conf:
- post-config:
- "/$NEUTRON_CORE_PLUGIN_CONF":
- ovs:
- bridge_mappings: public:br-ex
- resource_provider_bandwidths: br-ex:1000000:1000000
- job:
name: tempest-slow