Merge "Prepare MinBwAllocationPlacementTest for new neutron API ext"
diff --git a/releasenotes/notes/swift-improve-cleanup-63cfc21ffb3aff6f.yaml b/releasenotes/notes/swift-improve-cleanup-63cfc21ffb3aff6f.yaml
new file mode 100644
index 0000000..9e48510
--- /dev/null
+++ b/releasenotes/notes/swift-improve-cleanup-63cfc21ffb3aff6f.yaml
@@ -0,0 +1,5 @@
+---
+fixes:
+ - |
+ Improve cleanup after Swift testing. Ensures containers are empty before
+ deleting to prevent errors due to delayed execution.
diff --git a/tempest/api/compute/volumes/test_attach_volume.py b/tempest/api/compute/volumes/test_attach_volume.py
index 7251e36..4c7c234 100644
--- a/tempest/api/compute/volumes/test_attach_volume.py
+++ b/tempest/api/compute/volumes/test_attach_volume.py
@@ -455,6 +455,8 @@
@utils.services('image')
@decorators.idempotent_id('885ac48a-2d7a-40c5-ae8b-1993882d724c')
+ @testtools.skipUnless(CONF.compute_feature_enabled.snapshot,
+ 'Snapshotting is not available.')
def test_snapshot_volume_backed_multiattach(self):
"""Boots a server from a multiattach volume and snapshots the server.
diff --git a/tempest/api/network/test_ports.py b/tempest/api/network/test_ports.py
index 63078cd..190f7e0 100644
--- a/tempest/api/network/test_ports.py
+++ b/tempest/api/network/test_ports.py
@@ -51,7 +51,8 @@
def _create_subnet(self, network, gateway='',
cidr=None, mask_bits=None, **kwargs):
- subnet = self.create_subnet(network, gateway, cidr, mask_bits)
+ subnet = self.create_subnet(
+ network, gateway, cidr, mask_bits, **kwargs)
self.addCleanup(test_utils.call_and_ignore_notfound_exc,
self.subnets_client.delete_subnet, subnet['id'])
return subnet
diff --git a/tempest/api/object_storage/base.py b/tempest/api/object_storage/base.py
index 77e26ef..8d8039b 100644
--- a/tempest/api/object_storage/base.py
+++ b/tempest/api/object_storage/base.py
@@ -29,11 +29,6 @@
The containers should be visible from the container_client given.
Will not throw any error if the containers don't exist.
- Will not check that object and container deletions succeed.
- After delete all the objects from a container, it will wait 2
- seconds before delete the container itself, in order to deployments
- using HA proxy sync the deletion properly, otherwise, the container
- might fail to be deleted because it's not empty.
:param containers: List of containers(or string of a container)
to be deleted
diff --git a/tempest/api/object_storage/test_container_services_negative.py b/tempest/api/object_storage/test_container_services_negative.py
index 31c33db..51c711f 100644
--- a/tempest/api/object_storage/test_container_services_negative.py
+++ b/tempest/api/object_storage/test_container_services_negative.py
@@ -36,6 +36,11 @@
body = cls.capabilities_client.list_capabilities()
cls.constraints = body['swift']
+ @classmethod
+ def resource_cleanup(cls):
+ cls.delete_containers()
+ super(ContainerNegativeTest, cls).resource_cleanup()
+
@decorators.attr(type=["negative"])
@decorators.idempotent_id('30686921-4bed-4764-a038-40d741ed4e78')
@testtools.skipUnless(
@@ -167,11 +172,7 @@
# create a container and an object within it
# attempt to delete a container that isn't empty.
container_name = self.create_container()
- self.addCleanup(self.container_client.delete_container,
- container_name)
object_name, _ = self.create_object(container_name)
- self.addCleanup(self.object_client.delete_object,
- container_name, object_name)
ex = self.assertRaises(exceptions.Conflict,
self.container_client.delete_container,
diff --git a/tempest/api/object_storage/test_container_sync.py b/tempest/api/object_storage/test_container_sync.py
index 276b826..6b1f849 100644
--- a/tempest/api/object_storage/test_container_sync.py
+++ b/tempest/api/object_storage/test_container_sync.py
@@ -58,6 +58,7 @@
# Default container-server config only allows localhost
cls.local_ip = '127.0.0.1'
+ cls.local_ip_v6 = '[::1]'
# Must be configure according to container-sync interval
container_sync_timeout = CONF.object_storage.container_sync_timeout
@@ -134,11 +135,18 @@
"""Test container synchronization"""
def make_headers(cont, cont_client):
# tell first container to synchronize to a second
- client_proxy_ip = \
- urlparse.urlparse(cont_client.base_url).netloc.split(':')[0]
- client_base_url = \
- cont_client.base_url.replace(client_proxy_ip,
- self.local_ip)
+ # use rsplit with a maxsplit of 1 to ensure ipv6 adresses are
+ # handled properly as well
+ client_proxy_ip = urlparse.urlparse(
+ cont_client.base_url).netloc.rsplit(':', 1)[0]
+ if client_proxy_ip.startswith("["): # lazy check
+ client_base_url = \
+ cont_client.base_url.replace(client_proxy_ip,
+ self.local_ip_v6)
+ else:
+ client_base_url = \
+ cont_client.base_url.replace(client_proxy_ip,
+ self.local_ip)
headers = {'X-Container-Sync-Key': 'sync_key',
'X-Container-Sync-To': "%s/%s" %
(client_base_url, str(cont))}
diff --git a/tempest/api/object_storage/test_object_services.py b/tempest/api/object_storage/test_object_services.py
index 93f6fdb..2823185 100644
--- a/tempest/api/object_storage/test_object_services.py
+++ b/tempest/api/object_storage/test_object_services.py
@@ -182,7 +182,7 @@
self.assertEqual(data, body)
@decorators.idempotent_id('4f84422a-e2f2-4403-b601-726a4220b54e')
- @decorators.skip_because(bug='1905432')
+ @decorators.unstable_test(bug='1905432')
def test_create_object_with_transfer_encoding(self):
"""Test creating object with transfer_encoding"""
object_name = data_utils.rand_name(name='TestObject')
diff --git a/tempest/api/object_storage/test_object_slo.py b/tempest/api/object_storage/test_object_slo.py
index 0c84357..22d12ce 100644
--- a/tempest/api/object_storage/test_object_slo.py
+++ b/tempest/api/object_storage/test_object_slo.py
@@ -18,7 +18,6 @@
from tempest.api.object_storage import base
from tempest.common import utils
from tempest.lib.common.utils import data_utils
-from tempest.lib.common.utils import test_utils
from tempest.lib import decorators
# Each segment, except for the final one, must be at least 1 megabyte
@@ -34,11 +33,7 @@
self.objects = []
def tearDown(self):
- for obj in self.objects:
- test_utils.call_and_ignore_notfound_exc(
- self.object_client.delete_object,
- self.container_name, obj)
- self.container_client.delete_container(self.container_name)
+ self.delete_containers()
super(ObjectSloTest, self).tearDown()
def _create_object(self, container_name, object_name, data, params=None):
diff --git a/tempest/api/volume/admin/test_group_snapshots.py b/tempest/api/volume/admin/test_group_snapshots.py
index 659e2c4..ddfc78a 100644
--- a/tempest/api/volume/admin/test_group_snapshots.py
+++ b/tempest/api/volume/admin/test_group_snapshots.py
@@ -64,8 +64,8 @@
class GroupSnapshotsTest(BaseGroupSnapshotsTest):
"""Test group snapshot"""
- min_microversion = '3.14'
- max_microversion = 'latest'
+ volume_min_microversion = '3.14'
+ volume_max_microversion = 'latest'
@decorators.idempotent_id('1298e537-f1f0-47a3-a1dd-8adec8168897')
def test_group_snapshot_create_show_list_delete(self):
@@ -252,8 +252,8 @@
class GroupSnapshotsV319Test(BaseGroupSnapshotsTest):
"""Test group snapshot with volume microversion greater than 3.18"""
- min_microversion = '3.19'
- max_microversion = 'latest'
+ volume_min_microversion = '3.19'
+ volume_max_microversion = 'latest'
@decorators.idempotent_id('3b42c9b9-c984-4444-816e-ca2e1ed30b40')
@decorators.skip_because(bug='1770179')
diff --git a/tempest/api/volume/admin/test_group_type_specs.py b/tempest/api/volume/admin/test_group_type_specs.py
index 5c5913e..63c3546 100644
--- a/tempest/api/volume/admin/test_group_type_specs.py
+++ b/tempest/api/volume/admin/test_group_type_specs.py
@@ -21,8 +21,8 @@
class GroupTypeSpecsTest(base.BaseVolumeAdminTest):
"""Test group type specs"""
- min_microversion = '3.11'
- max_microversion = 'latest'
+ volume_min_microversion = '3.11'
+ volume_max_microversion = 'latest'
@decorators.idempotent_id('bb4e30d0-de6e-4f4d-866c-dcc48d023b4e')
def test_group_type_specs_create_show_update_list_delete(self):
diff --git a/tempest/api/volume/admin/test_group_types.py b/tempest/api/volume/admin/test_group_types.py
index a7a5d6f..97455f3 100644
--- a/tempest/api/volume/admin/test_group_types.py
+++ b/tempest/api/volume/admin/test_group_types.py
@@ -21,8 +21,8 @@
class GroupTypesTest(base.BaseVolumeAdminTest):
"""Test group types"""
- min_microversion = '3.11'
- max_microversion = 'latest'
+ volume_min_microversion = '3.11'
+ volume_max_microversion = 'latest'
@decorators.idempotent_id('dd71e5f9-393e-4d4f-90e9-fa1b8d278864')
def test_group_type_create_list_update_show(self):
diff --git a/tempest/api/volume/admin/test_groups.py b/tempest/api/volume/admin/test_groups.py
index 747a194..f16e4d2 100644
--- a/tempest/api/volume/admin/test_groups.py
+++ b/tempest/api/volume/admin/test_groups.py
@@ -25,8 +25,8 @@
class GroupsTest(base.BaseVolumeAdminTest):
"""Tests of volume groups with microversion greater than 3.12"""
- min_microversion = '3.13'
- max_microversion = 'latest'
+ volume_min_microversion = '3.13'
+ volume_max_microversion = 'latest'
@decorators.idempotent_id('4b111d28-b73d-4908-9bd2-03dc2992e4d4')
def test_group_create_show_list_delete(self):
@@ -155,8 +155,8 @@
class GroupsV314Test(base.BaseVolumeAdminTest):
"""Tests of volume groups with microversion greater than 3.13"""
- min_microversion = '3.14'
- max_microversion = 'latest'
+ volume_min_microversion = '3.14'
+ volume_max_microversion = 'latest'
@decorators.idempotent_id('2424af8c-7851-4888-986a-794b10c3210e')
def test_create_group_from_group(self):
@@ -192,8 +192,8 @@
class GroupsV320Test(base.BaseVolumeAdminTest):
"""Tests of volume groups with microversion greater than 3.19"""
- min_microversion = '3.20'
- max_microversion = 'latest'
+ volume_min_microversion = '3.20'
+ volume_max_microversion = 'latest'
@decorators.idempotent_id('b20c696b-0cbc-49a5-8b3a-b1fb9338f45c')
def test_reset_group_status(self):
diff --git a/tempest/api/volume/admin/test_user_messages.py b/tempest/api/volume/admin/test_user_messages.py
index 768c129..00b7f3a 100644
--- a/tempest/api/volume/admin/test_user_messages.py
+++ b/tempest/api/volume/admin/test_user_messages.py
@@ -24,8 +24,8 @@
class UserMessagesTest(base.BaseVolumeAdminTest):
"""Test volume messages with microversion greater than 3.2"""
- min_microversion = '3.3'
- max_microversion = 'latest'
+ volume_min_microversion = '3.3'
+ volume_max_microversion = 'latest'
def _create_user_message(self):
"""Trigger a 'no valid host' situation to generate a message."""
diff --git a/tempest/api/volume/admin/test_volume_retype.py b/tempest/api/volume/admin/test_volume_retype.py
index 5c14d52..4a3f494 100644
--- a/tempest/api/volume/admin/test_volume_retype.py
+++ b/tempest/api/volume/admin/test_volume_retype.py
@@ -13,6 +13,7 @@
import abc
from oslo_log import log as logging
+import testtools
from tempest.api.volume import base
from tempest.common import waiters
@@ -146,6 +147,8 @@
self._retype_volume(src_vol, migration_policy='on-demand')
@decorators.idempotent_id('d0d9554f-e7a5-4104-8973-f35b27ccb60d')
+ @testtools.skipUnless(CONF.volume_feature_enabled.snapshot,
+ "Cinder volume snapshots are disabled.")
def test_volume_from_snapshot_retype_with_migration(self):
"""Test volume created from snapshot retype with migration
diff --git a/tempest/api/volume/base.py b/tempest/api/volume/base.py
index d5c6fd9..6e34dd6 100644
--- a/tempest/api/volume/base.py
+++ b/tempest/api/volume/base.py
@@ -13,10 +13,10 @@
# License for the specific language governing permissions and limitations
# under the License.
-from tempest.api.volume import api_microversion_fixture
from tempest.common import compute
from tempest.common import waiters
from tempest import config
+from tempest.lib.common import api_microversion_fixture
from tempest.lib.common import api_version_utils
from tempest.lib.common.utils import data_utils
from tempest.lib.common.utils import test_utils
@@ -43,7 +43,7 @@
raise cls.skipException(skip_msg)
api_version_utils.check_skip_with_microversion(
- cls.min_microversion, cls.max_microversion,
+ cls.volume_min_microversion, cls.volume_max_microversion,
CONF.volume.min_microversion, CONF.volume.max_microversion)
@classmethod
@@ -78,15 +78,20 @@
def setUp(self):
super(BaseVolumeTest, self).setUp()
self.useFixture(api_microversion_fixture.APIMicroversionFixture(
- self.request_microversion))
+ compute_microversion=self.compute_request_microversion,
+ volume_microversion=self.volume_request_microversion))
@classmethod
def resource_setup(cls):
super(BaseVolumeTest, cls).resource_setup()
- cls.request_microversion = (
+ cls.volume_request_microversion = (
+ api_version_utils.select_request_microversion(
+ cls.volume_min_microversion,
+ CONF.volume.min_microversion))
+ cls.compute_request_microversion = (
api_version_utils.select_request_microversion(
cls.min_microversion,
- CONF.volume.min_microversion))
+ CONF.compute.min_microversion))
cls.image_ref = CONF.compute.image_ref
cls.flavor_ref = CONF.compute.flavor_ref
diff --git a/tempest/api/volume/test_volume_transfers.py b/tempest/api/volume/test_volume_transfers.py
index 9600aa9..f1dec06 100644
--- a/tempest/api/volume/test_volume_transfers.py
+++ b/tempest/api/volume/test_volume_transfers.py
@@ -109,8 +109,8 @@
class VolumesTransfersV355Test(VolumesTransfersTest):
"""Test volume transfer for the "new" Transfers API mv 3.55"""
- min_microversion = '3.55'
- max_microversion = 'latest'
+ volume_min_microversion = '3.55'
+ volume_max_microversion = 'latest'
credentials = ['primary', 'alt', 'admin']
diff --git a/tempest/api/volume/test_volumes_backup.py b/tempest/api/volume/test_volumes_backup.py
index fff6a44..138d120 100644
--- a/tempest/api/volume/test_volumes_backup.py
+++ b/tempest/api/volume/test_volumes_backup.py
@@ -164,8 +164,8 @@
class VolumesBackupsV39Test(base.BaseVolumeTest):
"""Test volumes backup with volume microversion greater than 3.8"""
- min_microversion = '3.9'
- max_microversion = 'latest'
+ volume_min_microversion = '3.9'
+ volume_max_microversion = 'latest'
@classmethod
def skip_checks(cls):
diff --git a/tempest/api/volume/test_volumes_extend.py b/tempest/api/volume/test_volumes_extend.py
index d9790f3..fcbc982 100644
--- a/tempest/api/volume/test_volumes_extend.py
+++ b/tempest/api/volume/test_volumes_extend.py
@@ -80,7 +80,7 @@
# NOTE(mriedem): The minimum required volume API version is 3.42 and the
# minimum required compute API microversion is 2.51, but the compute call
# is implicit - Cinder calls Nova at that microversion, Tempest does not.
- min_microversion = '3.42'
+ volume_min_microversion = '3.42'
def _find_extend_volume_instance_action(self, server_id):
actions = self.servers_client.list_instance_actions(
diff --git a/tempest/api/volume/test_volumes_get.py b/tempest/api/volume/test_volumes_get.py
index 28e41bf..2009970 100644
--- a/tempest/api/volume/test_volumes_get.py
+++ b/tempest/api/volume/test_volumes_get.py
@@ -143,8 +143,8 @@
class VolumesSummaryTest(base.BaseVolumeTest):
"""Test volume summary"""
- min_microversion = '3.12'
- max_microversion = 'latest'
+ volume_min_microversion = '3.12'
+ volume_max_microversion = 'latest'
@decorators.idempotent_id('c4f2431e-4920-4736-9e00-4040386b6feb')
def test_show_volume_summary(self):
diff --git a/tempest/lib/common/jsonschema_validator.py b/tempest/lib/common/jsonschema_validator.py
index 0ac757d..1618175 100644
--- a/tempest/lib/common/jsonschema_validator.py
+++ b/tempest/lib/common/jsonschema_validator.py
@@ -31,7 +31,7 @@
@FORMAT_CHECKER.checks('iso8601-date-time')
def _validate_datetime_format(instance):
try:
- if isinstance(instance, jsonschema.compat.str_types):
+ if instance is not None:
timeutils.parse_isotime(instance)
except ValueError:
return False
diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml
index 566c2c3..7b3b028 100644
--- a/zuul.d/project.yaml
+++ b/zuul.d/project.yaml
@@ -31,6 +31,8 @@
- glance-multistore-cinder-import:
voting: false
irrelevant-files: *tempest-irrelevant-files
+ - tempest-full-xena:
+ irrelevant-files: *tempest-irrelevant-files
- tempest-full-wallaby-py3:
irrelevant-files: *tempest-irrelevant-files
- tempest-full-victoria-py3:
@@ -150,6 +152,7 @@
irrelevant-files: *tempest-irrelevant-files
periodic-stable:
jobs:
+ - tempest-full-xena
- tempest-full-wallaby-py3
- tempest-full-victoria-py3
- tempest-full-ussuri-py3
diff --git a/zuul.d/stable-jobs.yaml b/zuul.d/stable-jobs.yaml
index 852bafb..e682457 100644
--- a/zuul.d/stable-jobs.yaml
+++ b/zuul.d/stable-jobs.yaml
@@ -1,5 +1,10 @@
# NOTE(gmann): This file includes all stable release jobs definition.
- job:
+ name: tempest-full-xena
+ parent: tempest-full-py3
+ override-checkout: stable/xena
+
+- job:
name: tempest-full-wallaby-py3
parent: tempest-full-py3
override-checkout: stable/wallaby