Merge tag '1.12.0' into debian/caracal
cinder-tempest-plugin 1.12.0 release
meta:version: 1.12.0
meta:diff-start: -
meta:series: caracal
meta:branch: master
meta:release-type: release
meta:pypi: no
meta:first: no
meta:release:Author: Elod Illes <elod.illes@est.tech>
meta:release:Commit: Elod Illes <elod.illes@est.tech>
meta:release:Change-Id: Ifa47f802cea2b586dfa738d6bb863b8dc0b720cd
meta:release:Code-Review+1: Ghanshyam <gmann@ghanshyammann.com>
meta:release:Code-Review+2: Elod Illes <elod.illes@est.tech>
meta:release:Workflow+1: Thierry Carrez <thierry@openstack.org>
meta:release:Code-Review+2: Thierry Carrez <thierry@openstack.org>
meta:release:Code-Review+1: Rajat Dhasmana <rajatdhasmana@gmail.com>
Thomas Goirand
2 years ago
| 24 | 24 | # branches. That is what we need to do for all tempest plugins. Only jobs |
| 25 | 25 | # for the current releasable ("Maintained") stable branches should be listed |
| 26 | 26 | # here. |
| 27 | - cinder-tempest-plugin-basic-2023-2 | |
| 27 | 28 | - cinder-tempest-plugin-basic-2023-1 |
| 28 | 29 | - cinder-tempest-plugin-basic-zed |
| 29 | - cinder-tempest-plugin-basic-yoga | |
| 30 | 30 | - cinder-tempest-plugin-protection-functional |
| 31 | 31 | gate: |
| 32 | 32 | jobs: |
| 37 | 37 | - cinder-tempest-plugin-cbak-ceph |
| 38 | 38 | experimental: |
| 39 | 39 | jobs: |
| 40 | - cinder-tempest-plugin-cbak-ceph-2023-2 | |
| 40 | 41 | - cinder-tempest-plugin-cbak-ceph-2023-1 |
| 41 | 42 | - cinder-tempest-plugin-cbak-ceph-zed |
| 42 | - cinder-tempest-plugin-cbak-ceph-yoga | |
| 43 | 43 | |
| 44 | 44 | - job: |
| 45 | 45 | name: cinder-tempest-plugin-protection-functional |
| 268 | 268 | timeout: 10800 |
| 269 | 269 | |
| 270 | 270 | - job: |
| 271 | name: cinder-tempest-plugin-cbak-ceph-2023-2 | |
| 272 | parent: cinder-tempest-plugin-cbak-ceph | |
| 273 | nodeset: openstack-single-node-jammy | |
| 274 | override-checkout: stable/2023.2 | |
| 275 | ||
| 276 | - job: | |
| 271 | 277 | name: cinder-tempest-plugin-cbak-ceph-2023-1 |
| 272 | 278 | parent: cinder-tempest-plugin-cbak-ceph |
| 273 | 279 | nodeset: openstack-single-node-jammy |
| 278 | 284 | parent: cinder-tempest-plugin-cbak-ceph |
| 279 | 285 | nodeset: openstack-single-node-focal |
| 280 | 286 | override-checkout: stable/zed |
| 281 | ||
| 282 | - job: | |
| 283 | name: cinder-tempest-plugin-cbak-ceph-yoga | |
| 284 | parent: cinder-tempest-plugin-cbak-ceph | |
| 285 | nodeset: openstack-single-node-focal | |
| 286 | override-checkout: stable/yoga | |
| 287 | 287 | |
| 288 | 288 | # variant for pre-Ussuri branches (no volume revert for Ceph), |
| 289 | 289 | # should this job be used on those branches |
| 415 | 415 | - ^releasenotes/.*$ |
| 416 | 416 | |
| 417 | 417 | - job: |
| 418 | name: cinder-tempest-plugin-basic-2023-2 | |
| 419 | parent: cinder-tempest-plugin-basic | |
| 420 | nodeset: openstack-single-node-jammy | |
| 421 | override-checkout: stable/2023.2 | |
| 422 | ||
| 423 | - job: | |
| 418 | 424 | name: cinder-tempest-plugin-basic-2023-1 |
| 419 | 425 | parent: cinder-tempest-plugin-basic |
| 420 | 426 | nodeset: openstack-single-node-jammy |
| 425 | 431 | parent: cinder-tempest-plugin-basic |
| 426 | 432 | nodeset: openstack-single-node-focal |
| 427 | 433 | override-checkout: stable/zed |
| 428 | ||
| 429 | - job: | |
| 430 | name: cinder-tempest-plugin-basic-yoga | |
| 431 | parent: cinder-tempest-plugin-basic | |
| 432 | nodeset: openstack-single-node-focal | |
| 433 | override-checkout: stable/yoga | |
| 27 | 27 | class ConsistencyGroupsV2Test(base.BaseVolumeAdminTest): |
| 28 | 28 | @classmethod |
| 29 | 29 | def setup_clients(cls): |
| 30 | cls._api_version = 2 | |
| 31 | 30 | super(ConsistencyGroupsV2Test, cls).setup_clients() |
| 32 | cls.admin_volume_client = cls.os_admin.volumes_v2_client | |
| 33 | 31 | |
| 34 | 32 | manager = cinder_clients.Manager(cls.os_admin) |
| 35 | 33 | cls.consistencygroups_adm_client = manager.consistencygroups_adm_client |
| 22 | 22 | |
| 23 | 23 | |
| 24 | 24 | class VolumesBackupsTest(base.BaseVolumeAdminTest): |
| 25 | @classmethod | |
| 26 | def setup_clients(cls): | |
| 27 | super(VolumesBackupsTest, cls).setup_clients() | |
| 28 | cls.admin_volume_client = cls.os_admin.volumes_client_latest | |
| 29 | cls.backups_client = cls.os_primary.backups_client_latest | |
| 30 | cls.volumes_client = cls.os_primary.volumes_client_latest | |
| 31 | ||
| 32 | 25 | @classmethod |
| 33 | 26 | def skip_checks(cls): |
| 34 | 27 | super(VolumesBackupsTest, cls).skip_checks() |
| 15 | 15 | from tempest.common import compute |
| 16 | 16 | from tempest.common import waiters |
| 17 | 17 | from tempest import config |
| 18 | from tempest.lib.common import api_microversion_fixture | |
| 19 | 18 | from tempest.lib.common import api_version_utils |
| 20 | 19 | from tempest.lib.common.utils import data_utils |
| 21 | 20 | from tempest.lib.common.utils import test_utils |
| 56 | 55 | |
| 57 | 56 | def setUp(self): |
| 58 | 57 | super(BaseVolumeTest, self).setUp() |
| 59 | self.useFixture(api_microversion_fixture.APIMicroversionFixture( | |
| 60 | volume_microversion=self.request_microversion)) | |
| 61 | 58 | |
| 62 | 59 | @classmethod |
| 63 | 60 | def resource_setup(cls): |
| 66 | 63 | api_version_utils.select_request_microversion( |
| 67 | 64 | cls.min_microversion, |
| 68 | 65 | CONF.volume.min_microversion)) |
| 66 | cls.setup_api_microversion_fixture( | |
| 67 | volume_microversion=cls.request_microversion) | |
| 69 | 68 | |
| 70 | 69 | @classmethod |
| 71 | 70 | def create_volume(cls, wait_until='available', **kwargs): |
| 170 | 169 | |
| 171 | 170 | cls.admin_volume_types_client = cls.os_admin.volume_types_client_latest |
| 172 | 171 | cls.admin_backups_client = cls.os_admin.backups_client_latest |
| 173 | cls.admin_volumes_client = cls.os_admin.volumes_client_latest | |
| 172 | cls.admin_volume_client = cls.os_admin.volumes_client_latest | |
| 174 | 173 | |
| 175 | 174 | @classmethod |
| 176 | 175 | def create_volume_type(cls, name=None, **kwargs): |
| 193 | 192 | type_id = volume_type['id'] |
| 194 | 193 | type_name = volume_type['name'] |
| 195 | 194 | |
| 196 | volumes = cls.admin_volumes_client.list_volumes( | |
| 195 | volumes = cls.admin_volume_client.list_volumes( | |
| 197 | 196 | detail=True, params={'all_tenants': 1})['volumes'] |
| 198 | 197 | for volume in [v for v in volumes if v['volume_type'] == type_name]: |
| 199 | 198 | test_utils.call_and_ignore_notfound_exc( |
| 200 | cls.admin_volumes_client.delete_volume, volume['id']) | |
| 201 | cls.admin_volumes_client.wait_for_resource_deletion(volume['id']) | |
| 199 | cls.admin_volume_client.delete_volume, volume['id']) | |
| 200 | cls.admin_volume_client.wait_for_resource_deletion(volume['id']) | |
| 202 | 201 | |
| 203 | 202 | test_utils.call_and_ignore_notfound_exc( |
| 204 | 203 | cls.admin_volume_types_client.delete_volume_type, type_id) |
| 0 | # Copyright 2022 Red Hat, Inc. | |
| 1 | # All Rights Reserved. | |
| 2 | # | |
| 3 | # Licensed under the Apache License, Version 2.0 (the "License"); you may | |
| 4 | # not use this file except in compliance with the License. You may obtain | |
| 5 | # a copy of the License at | |
| 6 | # | |
| 7 | # http://www.apache.org/licenses/LICENSE-2.0 | |
| 8 | # | |
| 9 | # Unless required by applicable law or agreed to in writing, software | |
| 10 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | |
| 11 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | |
| 12 | # License for the specific language governing permissions and limitations | |
| 13 | # under the License. | |
| 14 | ||
| 15 | from tempest import config | |
| 16 | from tempest.lib import decorators | |
| 17 | ||
| 18 | from cinder_tempest_plugin.api.volume import base | |
| 19 | ||
| 20 | CONF = config.CONF | |
| 21 | ||
| 22 | ||
| 23 | class VolumeDependencyTests(base.BaseVolumeTest): | |
| 24 | min_microversion = '3.40' | |
| 25 | ||
| 26 | @classmethod | |
| 27 | def setup_clients(cls): | |
| 28 | super(VolumeDependencyTests, cls).setup_clients() | |
| 29 | ||
| 30 | @decorators.idempotent_id('42e9df95-854b-4840-9d55-ae62f65e9b8e') | |
| 31 | def test_delete_source_volume(self): | |
| 32 | """Test basic dependency deletion | |
| 33 | ||
| 34 | * Create a volume with source_volid | |
| 35 | * Delete the source volume | |
| 36 | """ | |
| 37 | source_volume = self.create_volume() | |
| 38 | kwargs = {'source_volid': source_volume['id']} | |
| 39 | cloned_volume = self.create_volume(**kwargs) | |
| 40 | self.assertEqual(source_volume['id'], cloned_volume['source_volid']) | |
| 41 | self.volumes_client.delete_volume(source_volume['id']) | |
| 42 | self.volumes_client.wait_for_resource_deletion(source_volume['id']) | |
| 43 | ||
| 44 | @decorators.idempotent_id('900d8ea5-2afd-4fe5-a0c3-fab4744f0d40') | |
| 45 | def test_delete_source_snapshot(self): | |
| 46 | """Test basic dependency deletion with snapshot | |
| 47 | ||
| 48 | * Create a snapshot from source volume | |
| 49 | * Create a volume from that snapshot | |
| 50 | * Delete the source snapshot | |
| 51 | * Delete the source volume | |
| 52 | """ | |
| 53 | source_volume = self.create_volume() | |
| 54 | snapshot_source_volume = self.create_snapshot(source_volume['id']) | |
| 55 | kwargs = {'snapshot_id': snapshot_source_volume['id']} | |
| 56 | volume_from_snapshot = self.create_volume(**kwargs) | |
| 57 | self.assertEqual(volume_from_snapshot['snapshot_id'], | |
| 58 | snapshot_source_volume['id']) | |
| 59 | ||
| 60 | self.snapshots_client.delete_snapshot(snapshot_source_volume['id']) | |
| 61 | self.snapshots_client.wait_for_resource_deletion( | |
| 62 | snapshot_source_volume['id']) | |
| 63 | self.volumes_client.delete_volume(source_volume['id']) | |
| 64 | self.volumes_client.wait_for_resource_deletion(source_volume['id']) | |
| 65 | ||
| 66 | def _delete_vol_and_wait(self, vol_id): | |
| 67 | self.volumes_client.delete_volume(vol_id) | |
| 68 | ||
| 69 | self.volumes_client.wait_for_resource_deletion(vol_id) | |
| 70 | ||
| 71 | def _delete_snap_and_wait(self, snap_id): | |
| 72 | self.snapshots_client.delete_snapshot(snap_id) | |
| 73 | ||
| 74 | self.snapshots_client.wait_for_resource_deletion(snap_id) | |
| 75 | ||
| 76 | @decorators.idempotent_id('f8278e5c-50ff-4a1d-8670-3ca0866d411a') | |
| 77 | def test_delete_dep_chain(self): | |
| 78 | """Test a complex chain of volume and snapshot dependency deletion.""" | |
| 79 | volume_1 = self.create_volume()['id'] | |
| 80 | snapshot_of_vol_1 = self.create_snapshot(volume_1)['id'] | |
| 81 | ||
| 82 | volume_2_args = {'snapshot_id': snapshot_of_vol_1} | |
| 83 | volume_2 = self.create_volume(**volume_2_args)['id'] | |
| 84 | ||
| 85 | snapshot_of_vol_2 = self.create_snapshot(volume_2)['id'] | |
| 86 | ||
| 87 | volume_3_args = {'snapshot_id': snapshot_of_vol_2} | |
| 88 | volume_3 = self.create_volume(**volume_3_args)['id'] | |
| 89 | ||
| 90 | volume_4_args = {'source_volid': volume_3} | |
| 91 | volume_4 = self.create_volume(**volume_4_args)['id'] | |
| 92 | ||
| 93 | self._delete_snap_and_wait(snapshot_of_vol_1) | |
| 94 | self._delete_snap_and_wait(snapshot_of_vol_2) | |
| 95 | ||
| 96 | self._delete_vol_and_wait(volume_3) | |
| 97 | self._delete_vol_and_wait(volume_1) | |
| 98 | self._delete_vol_and_wait(volume_2) | |
| 99 | self._delete_vol_and_wait(volume_4) | |
| 100 | ||
| 101 | @decorators.idempotent_id('63447ef8-e667-4796-ba66-1b9b883af1f1') | |
| 102 | def test_delete_dep_chain_2(self): | |
| 103 | """Test a different chain of volume/snapshot dependency deletion.""" | |
| 104 | volume_1 = self.create_volume()['id'] | |
| 105 | snapshot_of_vol_1 = self.create_snapshot(volume_1)['id'] | |
| 106 | ||
| 107 | volume_2_args = {'snapshot_id': snapshot_of_vol_1} | |
| 108 | volume_2 = self.create_volume(**volume_2_args)['id'] | |
| 109 | ||
| 110 | snapshot_of_vol_2 = self.create_snapshot(volume_2)['id'] | |
| 111 | ||
| 112 | volume_3_args = {'snapshot_id': snapshot_of_vol_2} | |
| 113 | volume_3 = self.create_volume(**volume_3_args)['id'] | |
| 114 | ||
| 115 | self._delete_snap_and_wait(snapshot_of_vol_1) | |
| 116 | self._delete_snap_and_wait(snapshot_of_vol_2) | |
| 117 | ||
| 118 | self._delete_vol_and_wait(volume_1) | |
| 119 | self._delete_vol_and_wait(volume_2) | |
| 120 | self._delete_vol_and_wait(volume_3) |
| 34 | 34 | |
| 35 | 35 | @classmethod |
| 36 | 36 | def setup_clients(cls): |
| 37 | cls._api_version = 3 | |
| 38 | 37 | super(VolumeRevertTests, cls).setup_clients() |
| 39 | 38 | |
| 40 | 39 | manager = cinder_clients.Manager(cls.os_primary) |
| 12 | 12 | |
| 13 | 13 | from tempest.common import waiters |
| 14 | 14 | from tempest import config |
| 15 | from tempest.lib.common import api_microversion_fixture | |
| 16 | 15 | from tempest.lib.common import api_version_utils |
| 17 | 16 | from tempest.lib.common.utils import data_utils |
| 18 | 17 | from tempest.lib.common.utils import test_utils |
| 50 | 49 | |
| 51 | 50 | def setUp(self): |
| 52 | 51 | super(VolumeV3RbacBaseTests, self).setUp() |
| 53 | self.useFixture(api_microversion_fixture.APIMicroversionFixture( | |
| 54 | volume_microversion=self.request_microversion)) | |
| 55 | 52 | |
| 56 | 53 | @classmethod |
| 57 | 54 | def resource_setup(cls): |
| 60 | 57 | api_version_utils.select_request_microversion( |
| 61 | 58 | cls.min_microversion, |
| 62 | 59 | CONF.volume.min_microversion)) |
| 60 | cls.setup_api_microversion_fixture( | |
| 61 | volume_microversion=cls.request_microversion) | |
| 63 | 62 | |
| 64 | 63 | def do_request(self, method, expected_status=200, client=None, **payload): |
| 65 | 64 | """Perform API call |