diff --git a/cinder_tempest_plugin/api/volume/admin/__init__.py b/cinder_tempest_plugin/api/volume/admin/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cinder_tempest_plugin/api/volume/admin/test_consistencygroups.py b/cinder_tempest_plugin/api/volume/admin/test_consistencygroups.py new file mode 100644 index 0000000..15d19dc --- /dev/null +++ b/cinder_tempest_plugin/api/volume/admin/test_consistencygroups.py @@ -0,0 +1,283 @@ +# Copyright (C) 2015 EMC Corporation. +# Copyright (C) 2016 Pure Storage, Inc. +# 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.common import waiters +from tempest import config +from tempest.lib.common.utils import data_utils +from tempest.lib import decorators + +from cinder_tempest_plugin.api.volume import base +from cinder_tempest_plugin import cinder_clients + +CONF = config.CONF + + +class ConsistencyGroupsV2Test(base.BaseVolumeAdminTest): + @classmethod + def setup_clients(cls): + cls._api_version = 2 + super(ConsistencyGroupsV2Test, cls).setup_clients() + cls.admin_volume_client = cls.os_admin.volumes_v2_client + + manager = cinder_clients.Manager(cls.os_admin) + cls.consistencygroups_adm_client = manager.consistencygroups_adm_client + + @classmethod + def skip_checks(cls): + super(ConsistencyGroupsV2Test, cls).skip_checks() + if not CONF.volume_feature_enabled.consistency_group: + raise cls.skipException("Cinder consistency group " + "feature disabled") + + def _delete_consistencygroup(self, cg_id): + self.consistencygroups_adm_client.delete_consistencygroup(cg_id) + vols = self.admin_volume_client.list_volumes(detail=True)['volumes'] + for vol in vols: + if vol['consistencygroup_id'] == cg_id: + self.admin_volume_client.wait_for_resource_deletion(vol['id']) + self.consistencygroups_adm_client.wait_for_consistencygroup_deletion( + cg_id) + + def _delete_cgsnapshot(self, cgsnapshot_id, cg_id): + self.consistencygroups_adm_client.delete_cgsnapshot(cgsnapshot_id) + vols = self.admin_volume_client.list_volumes(detail=True)['volumes'] + snapshots = self.os_admin.snapshots_v2_client.list_snapshots( + detail=True)['snapshots'] + for vol in vols: + for snap in snapshots: + if (vol['consistencygroup_id'] == cg_id and + vol['id'] == snap['volume_id']): + (self.snapshots_client. + wait_for_resource_deletion(snap['id'])) + self.consistencygroups_adm_client.wait_for_cgsnapshot_deletion( + cgsnapshot_id) + + @decorators.idempotent_id('3fe776ba-ec1f-4e6c-8d78-4b14c3a7fc44') + def test_consistencygroup_create_delete(self): + # Create volume type + name = data_utils.rand_name("volume-type") + volume_type = self.os_admin.volume_types_v2_client.create_volume_type( + name=name)['volume_type'] + + # Create CG + cg_name = data_utils.rand_name('CG') + create_consistencygroup = ( + self.consistencygroups_adm_client.create_consistencygroup) + cg = create_consistencygroup(volume_type['id'], + name=cg_name)['consistencygroup'] + vol_name = data_utils.rand_name("volume") + params = {'name': vol_name, + 'volume_type': volume_type['id'], + 'consistencygroup_id': cg['id'], + 'size': CONF.volume.volume_size} + + # Create volume + volume = self.admin_volume_client.create_volume(**params)['volume'] + + waiters.wait_for_volume_resource_status(self.admin_volume_client, + volume['id'], 'available') + self.consistencygroups_adm_client.wait_for_consistencygroup_status( + cg['id'], 'available') + self.assertEqual(cg_name, cg['name']) + + # Get a given CG + cg = self.consistencygroups_adm_client.show_consistencygroup( + cg['id'])['consistencygroup'] + self.assertEqual(cg_name, cg['name']) + + # Get all CGs with detail + cgs = self.consistencygroups_adm_client.list_consistencygroups( + detail=True)['consistencygroups'] + self.assertIn((cg['name'], cg['id']), + [(m['name'], m['id']) for m in cgs]) + + # Clean up + self._delete_consistencygroup(cg['id']) + self.os_admin.volume_types_v2_client.delete_volume_type( + volume_type['id']) + + @decorators.idempotent_id('2134dd52-f333-4456-bb05-6cb0f009a44f') + def test_consistencygroup_cgsnapshot_create_delete(self): + # Create volume type + name = data_utils.rand_name("volume-type") + volume_type = self.admin_volume_types_client.create_volume_type( + name=name)['volume_type'] + + # Create CG + cg_name = data_utils.rand_name('CG') + create_consistencygroup = ( + self.consistencygroups_adm_client.create_consistencygroup) + cg = create_consistencygroup(volume_type['id'], + name=cg_name)['consistencygroup'] + vol_name = data_utils.rand_name("volume") + params = {'name': vol_name, + 'volume_type': volume_type['id'], + 'consistencygroup_id': cg['id'], + 'size': CONF.volume.volume_size} + + # Create volume + volume = self.admin_volume_client.create_volume(**params)['volume'] + waiters.wait_for_volume_resource_status(self.admin_volume_client, + volume['id'], 'available') + self.consistencygroups_adm_client.wait_for_consistencygroup_status( + cg['id'], 'available') + self.assertEqual(cg_name, cg['name']) + + # Create cgsnapshot + cgsnapshot_name = data_utils.rand_name('cgsnapshot') + create_cgsnapshot = ( + self.consistencygroups_adm_client.create_cgsnapshot) + cgsnapshot = create_cgsnapshot(cg['id'], + name=cgsnapshot_name)['cgsnapshot'] + snapshots = self.os_admin.snapshots_v2_client.list_snapshots( + detail=True)['snapshots'] + for snap in snapshots: + if volume['id'] == snap['volume_id']: + waiters.wait_for_volume_resource_status( + self.os_admin.snapshots_v2_client, + snap['id'], 'available') + self.consistencygroups_adm_client.wait_for_cgsnapshot_status( + cgsnapshot['id'], 'available') + self.assertEqual(cgsnapshot_name, cgsnapshot['name']) + + # Get a given CG snapshot + cgsnapshot = self.consistencygroups_adm_client.show_cgsnapshot( + cgsnapshot['id'])['cgsnapshot'] + self.assertEqual(cgsnapshot_name, cgsnapshot['name']) + + # Get all CG snapshots with detail + cgsnapshots = self.consistencygroups_adm_client.list_cgsnapshots( + detail=True)['cgsnapshots'] + self.assertIn((cgsnapshot['name'], cgsnapshot['id']), + [(m['name'], m['id']) for m in cgsnapshots]) + + # Clean up + self._delete_cgsnapshot(cgsnapshot['id'], cg['id']) + self._delete_consistencygroup(cg['id']) + self.admin_volume_types_client.delete_volume_type(volume_type['id']) + + @decorators.idempotent_id('3a6a5525-25ca-4a6c-aac4-cac6fa8f5b43') + def test_create_consistencygroup_from_cgsnapshot(self): + # Create volume type + name = data_utils.rand_name("volume-type") + volume_type = self.admin_volume_types_client.create_volume_type( + name=name)['volume_type'] + + # Create CG + cg_name = data_utils.rand_name('CG') + create_consistencygroup = ( + self.consistencygroups_adm_client.create_consistencygroup) + cg = create_consistencygroup(volume_type['id'], + name=cg_name)['consistencygroup'] + vol_name = data_utils.rand_name("volume") + params = {'name': vol_name, + 'volume_type': volume_type['id'], + 'consistencygroup_id': cg['id'], + 'size': CONF.volume.volume_size} + + # Create volume + volume = self.admin_volume_client.create_volume(**params)['volume'] + waiters.wait_for_volume_resource_status(self.admin_volume_client, + volume['id'], 'available') + self.consistencygroups_adm_client.wait_for_consistencygroup_status( + cg['id'], 'available') + self.assertEqual(cg_name, cg['name']) + + # Create cgsnapshot + cgsnapshot_name = data_utils.rand_name('cgsnapshot') + create_cgsnapshot = ( + self.consistencygroups_adm_client.create_cgsnapshot) + cgsnapshot = create_cgsnapshot(cg['id'], + name=cgsnapshot_name)['cgsnapshot'] + snapshots = self.snapshots_client.list_snapshots( + detail=True)['snapshots'] + for snap in snapshots: + if volume['id'] == snap['volume_id']: + waiters.wait_for_volume_resource_status( + self.os_admin.snapshots_v2_client, snap['id'], 'available') + self.consistencygroups_adm_client.wait_for_cgsnapshot_status( + cgsnapshot['id'], 'available') + self.assertEqual(cgsnapshot_name, cgsnapshot['name']) + + # Create CG from CG snapshot + cg_name2 = data_utils.rand_name('CG_from_snap') + create_consistencygroup2 = ( + self.consistencygroups_adm_client.create_consistencygroup_from_src) + cg2 = create_consistencygroup2(cgsnapshot_id=cgsnapshot['id'], + name=cg_name2)['consistencygroup'] + vols = self.admin_volume_client.list_volumes( + detail=True)['volumes'] + for vol in vols: + if vol['consistencygroup_id'] == cg2['id']: + waiters.wait_for_volume_resource_status( + self.admin_volume_client, vol['id'], 'available') + self.consistencygroups_adm_client.wait_for_consistencygroup_status( + cg2['id'], 'available') + self.assertEqual(cg_name2, cg2['name']) + + # Clean up + self._delete_consistencygroup(cg2['id']) + self._delete_cgsnapshot(cgsnapshot['id'], cg['id']) + self._delete_consistencygroup(cg['id']) + self.admin_volume_types_client.delete_volume_type(volume_type['id']) + + @decorators.idempotent_id('556121ae-de9c-4342-9897-e54260447a19') + def test_create_consistencygroup_from_consistencygroup(self): + # Create volume type + name = data_utils.rand_name("volume-type") + volume_type = self.admin_volume_types_client.create_volume_type( + name=name)['volume_type'] + + # Create CG + cg_name = data_utils.rand_name('CG') + create_consistencygroup = ( + self.consistencygroups_adm_client.create_consistencygroup) + cg = create_consistencygroup(volume_type['id'], + name=cg_name)['consistencygroup'] + vol_name = data_utils.rand_name("volume") + params = {'name': vol_name, + 'volume_type': volume_type['id'], + 'consistencygroup_id': cg['id'], + 'size': CONF.volume.volume_size} + + # Create volume + volume = self.admin_volume_client.create_volume(**params)['volume'] + waiters.wait_for_volume_resource_status(self.admin_volume_client, + volume['id'], 'available') + self.consistencygroups_adm_client.wait_for_consistencygroup_status( + cg['id'], 'available') + self.assertEqual(cg_name, cg['name']) + + # Create CG from CG + cg_name2 = data_utils.rand_name('CG_from_cg') + create_consistencygroup2 = ( + self.consistencygroups_adm_client.create_consistencygroup_from_src) + cg2 = create_consistencygroup2(source_cgid=cg['id'], + name=cg_name2)['consistencygroup'] + vols = self.admin_volume_client.list_volumes( + detail=True)['volumes'] + for vol in vols: + if vol['consistencygroup_id'] == cg2['id']: + waiters.wait_for_volume_resource_status( + self.admin_volume_client, vol['id'], 'available') + self.consistencygroups_adm_client.wait_for_consistencygroup_status( + cg2['id'], 'available') + self.assertEqual(cg_name2, cg2['name']) + + # Clean up + self._delete_consistencygroup(cg2['id']) + self._delete_consistencygroup(cg['id']) + self.admin_volume_types_client.delete_volume_type(volume_type['id']) diff --git a/cinder_tempest_plugin/api/volume/base.py b/cinder_tempest_plugin/api/volume/base.py index b3765e0..d1e71ef 100644 --- a/cinder_tempest_plugin/api/volume/base.py +++ b/cinder_tempest_plugin/api/volume/base.py @@ -168,3 +168,15 @@ self.os_primary.servers_client.delete_server, body['id']) return body + + +class BaseVolumeAdminTest(BaseVolumeTest): + """Base test case class for all Volume Admin API tests.""" + + credentials = ['primary', 'admin'] + + @classmethod + def setup_clients(cls): + super(BaseVolumeAdminTest, cls).setup_clients() + + cls.admin_volume_types_client = cls.os_admin.volume_types_client_latest diff --git a/cinder_tempest_plugin/api/volume/test_consistencygroups.py b/cinder_tempest_plugin/api/volume/test_consistencygroups.py deleted file mode 100644 index d6b8e4a..0000000 --- a/cinder_tempest_plugin/api/volume/test_consistencygroups.py +++ /dev/null @@ -1,283 +0,0 @@ -# Copyright (C) 2015 EMC Corporation. -# Copyright (C) 2016 Pure Storage, Inc. -# 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.common import waiters -from tempest import config -from tempest.lib.common.utils import data_utils -from tempest.lib import decorators - -from cinder_tempest_plugin.api.volume import base -from cinder_tempest_plugin import cinder_clients - -CONF = config.CONF - - -class ConsistencyGroupsV2Test(base.BaseVolumeTest): - @classmethod - def setup_clients(cls): - cls._api_version = 2 - super(ConsistencyGroupsV2Test, cls).setup_clients() - cls.admin_volume_client = cls.os_admin.volumes_v2_client - - manager = cinder_clients.Manager(cls.os_admin) - cls.consistencygroups_adm_client = manager.consistencygroups_adm_client - - @classmethod - def skip_checks(cls): - super(ConsistencyGroupsV2Test, cls).skip_checks() - if not CONF.volume_feature_enabled.consistency_group: - raise cls.skipException("Cinder consistency group " - "feature disabled") - - def _delete_consistencygroup(self, cg_id): - self.consistencygroups_adm_client.delete_consistencygroup(cg_id) - vols = self.admin_volume_client.list_volumes(detail=True)['volumes'] - for vol in vols: - if vol['consistencygroup_id'] == cg_id: - self.admin_volume_client.wait_for_resource_deletion(vol['id']) - self.consistencygroups_adm_client.wait_for_consistencygroup_deletion( - cg_id) - - def _delete_cgsnapshot(self, cgsnapshot_id, cg_id): - self.consistencygroups_adm_client.delete_cgsnapshot(cgsnapshot_id) - vols = self.admin_volume_client.list_volumes(detail=True)['volumes'] - snapshots = self.os_admin.snapshots_v2_client.list_snapshots( - detail=True)['snapshots'] - for vol in vols: - for snap in snapshots: - if (vol['consistencygroup_id'] == cg_id and - vol['id'] == snap['volume_id']): - (self.snapshots_client. - wait_for_resource_deletion(snap['id'])) - self.consistencygroups_adm_client.wait_for_cgsnapshot_deletion( - cgsnapshot_id) - - @decorators.idempotent_id('3fe776ba-ec1f-4e6c-8d78-4b14c3a7fc44') - def test_consistencygroup_create_delete(self): - # Create volume type - name = data_utils.rand_name("volume-type") - volume_type = self.os_admin.volume_types_v2_client.create_volume_type( - name=name)['volume_type'] - - # Create CG - cg_name = data_utils.rand_name('CG') - create_consistencygroup = ( - self.consistencygroups_adm_client.create_consistencygroup) - cg = create_consistencygroup(volume_type['id'], - name=cg_name)['consistencygroup'] - vol_name = data_utils.rand_name("volume") - params = {'name': vol_name, - 'volume_type': volume_type['id'], - 'consistencygroup_id': cg['id'], - 'size': CONF.volume.volume_size} - - # Create volume - volume = self.admin_volume_client.create_volume(**params)['volume'] - - waiters.wait_for_volume_resource_status(self.admin_volume_client, - volume['id'], 'available') - self.consistencygroups_adm_client.wait_for_consistencygroup_status( - cg['id'], 'available') - self.assertEqual(cg_name, cg['name']) - - # Get a given CG - cg = self.consistencygroups_adm_client.show_consistencygroup( - cg['id'])['consistencygroup'] - self.assertEqual(cg_name, cg['name']) - - # Get all CGs with detail - cgs = self.consistencygroups_adm_client.list_consistencygroups( - detail=True)['consistencygroups'] - self.assertIn((cg['name'], cg['id']), - [(m['name'], m['id']) for m in cgs]) - - # Clean up - self._delete_consistencygroup(cg['id']) - self.os_admin.volume_types_v2_client.delete_volume_type( - volume_type['id']) - - @decorators.idempotent_id('2134dd52-f333-4456-bb05-6cb0f009a44f') - def test_consistencygroup_cgsnapshot_create_delete(self): - # Create volume type - name = data_utils.rand_name("volume-type") - volume_type = self.admin_volume_types_client.create_volume_type( - name=name)['volume_type'] - - # Create CG - cg_name = data_utils.rand_name('CG') - create_consistencygroup = ( - self.consistencygroups_adm_client.create_consistencygroup) - cg = create_consistencygroup(volume_type['id'], - name=cg_name)['consistencygroup'] - vol_name = data_utils.rand_name("volume") - params = {'name': vol_name, - 'volume_type': volume_type['id'], - 'consistencygroup_id': cg['id'], - 'size': CONF.volume.volume_size} - - # Create volume - volume = self.admin_volume_client.create_volume(**params)['volume'] - waiters.wait_for_volume_resource_status(self.admin_volume_client, - volume['id'], 'available') - self.consistencygroups_adm_client.wait_for_consistencygroup_status( - cg['id'], 'available') - self.assertEqual(cg_name, cg['name']) - - # Create cgsnapshot - cgsnapshot_name = data_utils.rand_name('cgsnapshot') - create_cgsnapshot = ( - self.consistencygroups_adm_client.create_cgsnapshot) - cgsnapshot = create_cgsnapshot(cg['id'], - name=cgsnapshot_name)['cgsnapshot'] - snapshots = self.os_admin.snapshots_v2_client.list_snapshots( - detail=True)['snapshots'] - for snap in snapshots: - if volume['id'] == snap['volume_id']: - waiters.wait_for_volume_resource_status( - self.os_admin.snapshots_v2_client, - snap['id'], 'available') - self.consistencygroups_adm_client.wait_for_cgsnapshot_status( - cgsnapshot['id'], 'available') - self.assertEqual(cgsnapshot_name, cgsnapshot['name']) - - # Get a given CG snapshot - cgsnapshot = self.consistencygroups_adm_client.show_cgsnapshot( - cgsnapshot['id'])['cgsnapshot'] - self.assertEqual(cgsnapshot_name, cgsnapshot['name']) - - # Get all CG snapshots with detail - cgsnapshots = self.consistencygroups_adm_client.list_cgsnapshots( - detail=True)['cgsnapshots'] - self.assertIn((cgsnapshot['name'], cgsnapshot['id']), - [(m['name'], m['id']) for m in cgsnapshots]) - - # Clean up - self._delete_cgsnapshot(cgsnapshot['id'], cg['id']) - self._delete_consistencygroup(cg['id']) - self.admin_volume_types_client.delete_volume_type(volume_type['id']) - - @decorators.idempotent_id('3a6a5525-25ca-4a6c-aac4-cac6fa8f5b43') - def test_create_consistencygroup_from_cgsnapshot(self): - # Create volume type - name = data_utils.rand_name("volume-type") - volume_type = self.admin_volume_types_client.create_volume_type( - name=name)['volume_type'] - - # Create CG - cg_name = data_utils.rand_name('CG') - create_consistencygroup = ( - self.consistencygroups_adm_client.create_consistencygroup) - cg = create_consistencygroup(volume_type['id'], - name=cg_name)['consistencygroup'] - vol_name = data_utils.rand_name("volume") - params = {'name': vol_name, - 'volume_type': volume_type['id'], - 'consistencygroup_id': cg['id'], - 'size': CONF.volume.volume_size} - - # Create volume - volume = self.admin_volume_client.create_volume(**params)['volume'] - waiters.wait_for_volume_resource_status(self.admin_volume_client, - volume['id'], 'available') - self.consistencygroups_adm_client.wait_for_consistencygroup_status( - cg['id'], 'available') - self.assertEqual(cg_name, cg['name']) - - # Create cgsnapshot - cgsnapshot_name = data_utils.rand_name('cgsnapshot') - create_cgsnapshot = ( - self.consistencygroups_adm_client.create_cgsnapshot) - cgsnapshot = create_cgsnapshot(cg['id'], - name=cgsnapshot_name)['cgsnapshot'] - snapshots = self.snapshots_client.list_snapshots( - detail=True)['snapshots'] - for snap in snapshots: - if volume['id'] == snap['volume_id']: - waiters.wait_for_volume_resource_status( - self.os_admin.snapshots_v2_client, snap['id'], 'available') - self.consistencygroups_adm_client.wait_for_cgsnapshot_status( - cgsnapshot['id'], 'available') - self.assertEqual(cgsnapshot_name, cgsnapshot['name']) - - # Create CG from CG snapshot - cg_name2 = data_utils.rand_name('CG_from_snap') - create_consistencygroup2 = ( - self.consistencygroups_adm_client.create_consistencygroup_from_src) - cg2 = create_consistencygroup2(cgsnapshot_id=cgsnapshot['id'], - name=cg_name2)['consistencygroup'] - vols = self.admin_volume_client.list_volumes( - detail=True)['volumes'] - for vol in vols: - if vol['consistencygroup_id'] == cg2['id']: - waiters.wait_for_volume_resource_status( - self.admin_volume_client, vol['id'], 'available') - self.consistencygroups_adm_client.wait_for_consistencygroup_status( - cg2['id'], 'available') - self.assertEqual(cg_name2, cg2['name']) - - # Clean up - self._delete_consistencygroup(cg2['id']) - self._delete_cgsnapshot(cgsnapshot['id'], cg['id']) - self._delete_consistencygroup(cg['id']) - self.admin_volume_types_client.delete_volume_type(volume_type['id']) - - @decorators.idempotent_id('556121ae-de9c-4342-9897-e54260447a19') - def test_create_consistencygroup_from_consistencygroup(self): - # Create volume type - name = data_utils.rand_name("volume-type") - volume_type = self.admin_volume_types_client.create_volume_type( - name=name)['volume_type'] - - # Create CG - cg_name = data_utils.rand_name('CG') - create_consistencygroup = ( - self.consistencygroups_adm_client.create_consistencygroup) - cg = create_consistencygroup(volume_type['id'], - name=cg_name)['consistencygroup'] - vol_name = data_utils.rand_name("volume") - params = {'name': vol_name, - 'volume_type': volume_type['id'], - 'consistencygroup_id': cg['id'], - 'size': CONF.volume.volume_size} - - # Create volume - volume = self.admin_volume_client.create_volume(**params)['volume'] - waiters.wait_for_volume_resource_status(self.admin_volume_client, - volume['id'], 'available') - self.consistencygroups_adm_client.wait_for_consistencygroup_status( - cg['id'], 'available') - self.assertEqual(cg_name, cg['name']) - - # Create CG from CG - cg_name2 = data_utils.rand_name('CG_from_cg') - create_consistencygroup2 = ( - self.consistencygroups_adm_client.create_consistencygroup_from_src) - cg2 = create_consistencygroup2(source_cgid=cg['id'], - name=cg_name2)['consistencygroup'] - vols = self.admin_volume_client.list_volumes( - detail=True)['volumes'] - for vol in vols: - if vol['consistencygroup_id'] == cg2['id']: - waiters.wait_for_volume_resource_status( - self.admin_volume_client, vol['id'], 'available') - self.consistencygroups_adm_client.wait_for_consistencygroup_status( - cg2['id'], 'available') - self.assertEqual(cg_name2, cg2['name']) - - # Clean up - self._delete_consistencygroup(cg2['id']) - self._delete_consistencygroup(cg['id']) - self.admin_volume_types_client.delete_volume_type(volume_type['id'])