blob: 68bf72597fa3192b5a261091cbfe7924f4e2c6ba [file] [log] [blame]
ZhiQiang Fan39f97222013-09-20 04:49:44 +08001# Copyright 2012 OpenStack Foundation
Rohit Karajgidd47d7e2012-07-31 04:11:01 -07002# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
15
Joseph Lanouxa074c012015-08-04 15:44:07 +000016from tempest.common import compute
Lukas Piwowarski2c2484c2023-08-08 13:42:30 +000017from tempest.common import object_storage
Yaroslav Lobankoved3a35b2016-03-24 22:41:30 -050018from tempest.common import waiters
Matthew Treinish4d352bc2014-01-29 18:29:18 +000019from tempest import config
Ken'ichi Ohmichi8c189082017-04-03 13:47:54 -070020from tempest.lib.common import api_version_utils
Ken'ichi Ohmichief1c1ce2017-03-10 11:07:10 -080021from tempest.lib.common.utils import data_utils
Jordan Pittier9e227c52016-02-09 14:35:18 +010022from tempest.lib.common.utils import test_utils
Benny Kopilov951b8062022-05-04 08:50:03 +030023from tempest.lib.decorators import cleanup_order
Dan Smith40ba5502023-02-21 12:48:53 -080024from tempest.lib import exceptions as lib_exc
Attila Fazekasdc216422013-01-29 15:12:14 +010025import tempest.test
Rohit Karajgidd47d7e2012-07-31 04:11:01 -070026
Matthew Treinish4d352bc2014-01-29 18:29:18 +000027CONF = config.CONF
28
Rohit Karajgidd47d7e2012-07-31 04:11:01 -070029
Ken'ichi Ohmichi8c189082017-04-03 13:47:54 -070030class BaseVolumeTest(api_version_utils.BaseMicroversionTest,
31 tempest.test.BaseTestCase):
Sean Daguef237ccb2013-01-04 15:19:14 -050032 """Base test case class for all Cinder API tests."""
Rohit Karajgidd47d7e2012-07-31 04:11:01 -070033
Ghanshyam Mann7d91b692020-03-03 10:21:50 -060034 # Set this to True in subclasses to create a default network. See
35 # https://bugs.launchpad.net/tempest/+bug/1844568
36 create_default_network = False
Andrea Frittolib21de6c2015-02-06 20:12:38 +000037 credentials = ['primary']
Zhi Kun Liu6e6cf832014-05-08 17:25:22 +080038
Rohit Karajgidd47d7e2012-07-31 04:11:01 -070039 @classmethod
Rohan Kanade05749152015-01-30 17:15:18 +053040 def skip_checks(cls):
41 super(BaseVolumeTest, cls).skip_checks()
Rohit Karajgidd47d7e2012-07-31 04:11:01 -070042
Matthew Treinish4d352bc2014-01-29 18:29:18 +000043 if not CONF.service_available.cinder:
Matthew Treinish4c412922013-07-16 15:27:42 -040044 skip_msg = ("%s skipped as Cinder is not available" % cls.__name__)
45 raise cls.skipException(skip_msg)
Ghanshyam Mannfd90dac2023-08-03 16:26:44 -070046 if cls.create_default_network and not CONF.service_available.neutron:
47 skip_msg = (
48 "%s skipped as Neutron is not available" % cls.__name__)
49 raise cls.skipException(skip_msg)
Rohan Kanade05749152015-01-30 17:15:18 +053050
Ken'ichi Ohmichi8c189082017-04-03 13:47:54 -070051 api_version_utils.check_skip_with_microversion(
Sophie Huangd458bf32021-10-12 17:08:41 +000052 cls.volume_min_microversion, cls.volume_max_microversion,
Ken'ichi Ohmichi8c189082017-04-03 13:47:54 -070053 CONF.volume.min_microversion, CONF.volume.max_microversion)
54
Rohan Kanade05749152015-01-30 17:15:18 +053055 @classmethod
56 def setup_credentials(cls):
Ghanshyam Mann7d91b692020-03-03 10:21:50 -060057 cls.set_network_resources(
58 network=cls.create_default_network,
Dan Smithed1797c2023-05-01 09:19:31 -070059 router=cls.create_default_network,
60 dhcp=cls.create_default_network,
Ghanshyam Mann7d91b692020-03-03 10:21:50 -060061 subnet=cls.create_default_network)
Rohan Kanade05749152015-01-30 17:15:18 +053062 super(BaseVolumeTest, cls).setup_credentials()
Rohan Kanade05749152015-01-30 17:15:18 +053063
64 @classmethod
65 def setup_clients(cls):
66 super(BaseVolumeTest, cls).setup_clients()
Jordan Pittier8160d312017-04-18 11:52:23 +020067 cls.servers_client = cls.os_primary.servers_client
Rohan Kanade05749152015-01-30 17:15:18 +053068
jeremy.zhang0a427162017-04-21 12:47:56 +080069 if CONF.service_available.glance:
Jordan Pittier8160d312017-04-18 11:52:23 +020070 cls.images_client = cls.os_primary.image_client_v2
jeremy.zhang0a427162017-04-21 12:47:56 +080071
Lukas Piwowarski2c2484c2023-08-08 13:42:30 +000072 cls.container_client = cls.os_primary.container_client
73 cls.object_client = cls.os_primary.object_client
ghanshyam6c682ff2018-08-06 09:54:45 +000074 cls.backups_client = cls.os_primary.backups_client_latest
75 cls.volumes_client = cls.os_primary.volumes_client_latest
76 cls.messages_client = cls.os_primary.volume_messages_client_latest
77 cls.versions_client = cls.os_primary.volume_versions_client_latest
78 cls.groups_client = cls.os_primary.groups_client_latest
79 cls.group_snapshots_client = (
80 cls.os_primary.group_snapshots_client_latest)
81 cls.snapshots_client = cls.os_primary.snapshots_client_latest
Jordan Pittier8160d312017-04-18 11:52:23 +020082 cls.volumes_extension_client =\
ghanshyam6c682ff2018-08-06 09:54:45 +000083 cls.os_primary.volumes_extension_client_latest
Ken'ichi Ohmichic4fcdbb2017-03-15 16:53:28 -070084 cls.availability_zone_client = (
ghanshyam6c682ff2018-08-06 09:54:45 +000085 cls.os_primary.volume_availability_zone_client_latest)
86 cls.volume_limits_client = cls.os_primary.volume_limits_client_latest
jeremy.zhang79a1cbf2017-05-07 16:09:17 +080087
Rohan Kanade05749152015-01-30 17:15:18 +053088 @classmethod
89 def resource_setup(cls):
90 super(BaseVolumeTest, cls).resource_setup()
Sophie Huangd458bf32021-10-12 17:08:41 +000091 cls.volume_request_microversion = (
92 api_version_utils.select_request_microversion(
93 cls.volume_min_microversion,
94 CONF.volume.min_microversion))
95 cls.compute_request_microversion = (
Ken'ichi Ohmichi8c189082017-04-03 13:47:54 -070096 api_version_utils.select_request_microversion(
97 cls.min_microversion,
Sophie Huangd458bf32021-10-12 17:08:41 +000098 CONF.compute.min_microversion))
Ghanshyam Mann18b45d72021-12-07 12:37:29 -060099 cls.setup_api_microversion_fixture(
100 compute_microversion=cls.compute_request_microversion,
101 volume_microversion=cls.volume_request_microversion)
Rohan Kanade05749152015-01-30 17:15:18 +0530102
Rohan Kanade05749152015-01-30 17:15:18 +0530103 cls.image_ref = CONF.compute.image_ref
104 cls.flavor_ref = CONF.compute.flavor_ref
105 cls.build_interval = CONF.volume.build_interval
106 cls.build_timeout = CONF.volume.build_timeout
107
Benny Kopilov951b8062022-05-04 08:50:03 +0300108 @cleanup_order
109 def create_volume(self, wait_until='available', **kwargs):
Benny Kopilov8a33ee12016-11-09 10:35:23 +0200110 """Wrapper utility that returns a test volume.
111
Benny Kopilov7beb2d02022-04-12 20:33:53 +0300112 :param wait_until: wait till volume status, None means no wait.
Benny Kopilov8a33ee12016-11-09 10:35:23 +0200113 """
Ken'ichi Ohmichiadb905e2016-08-26 15:16:23 -0700114 if 'size' not in kwargs:
115 kwargs['size'] = CONF.volume.volume_size
116
Nuno Santosb746d992016-11-17 15:41:55 -0500117 if 'imageRef' in kwargs:
Benny Kopilov951b8062022-05-04 08:50:03 +0300118 image = self.images_client.show_image(kwargs['imageRef'])
jeremy.zhangcb0dd582017-04-25 08:48:38 +0800119 min_disk = image['min_disk']
Nuno Santosb746d992016-11-17 15:41:55 -0500120 kwargs['size'] = max(kwargs['size'], min_disk)
121
zhufla57530c2017-03-23 11:38:12 +0800122 if 'name' not in kwargs:
Benny Kopilov951b8062022-05-04 08:50:03 +0300123 name = data_utils.rand_name(self.__name__ + '-Volume')
zhufla57530c2017-03-23 11:38:12 +0800124 kwargs['name'] = name
Zhi Kun Liu3d6d9862014-06-16 16:43:59 +0800125
Ansuman Bebarta46d540d2021-02-16 18:48:33 +0530126 if CONF.volume.volume_type and 'volume_type' not in kwargs:
127 # If volume_type is not provided in config then no need to
128 # add a volume type and
129 # if volume_type has already been added by child class then
130 # no need to override.
131 kwargs['volume_type'] = CONF.volume.volume_type
132
Martin Kopec00e6d6c2019-06-05 14:30:06 +0000133 if CONF.compute.compute_volume_common_az:
134 kwargs.setdefault('availability_zone',
135 CONF.compute.compute_volume_common_az)
136
Benny Kopilov951b8062022-05-04 08:50:03 +0300137 volume = self.volumes_client.create_volume(**kwargs)['volume']
138 self.cleanup(test_utils.call_and_ignore_notfound_exc,
Dan Smith40ba5502023-02-21 12:48:53 -0800139 self._delete_volume_for_cleanup,
140 self.volumes_client, volume['id'])
Benny Kopilov7beb2d02022-04-12 20:33:53 +0300141 if wait_until:
Benny Kopilov951b8062022-05-04 08:50:03 +0300142 waiters.wait_for_volume_resource_status(self.volumes_client,
Benny Kopilov7beb2d02022-04-12 20:33:53 +0300143 volume['id'], wait_until)
Zhi Kun Liu6e6cf832014-05-08 17:25:22 +0800144 return volume
145
Dan Smith40ba5502023-02-21 12:48:53 -0800146 @staticmethod
147 def _delete_volume_for_cleanup(volumes_client, volume_id):
148 """Delete a volume (only) for cleanup.
149
150 If it is attached to a server, wait for it to become available,
151 assuming we have already deleted the server and just need nova to
152 complete the delete operation before it is available to be deleted.
153 Otherwise proceed to the regular delete_volume().
154 """
155 try:
156 vol = volumes_client.show_volume(volume_id)['volume']
157 if vol['status'] == 'in-use':
158 waiters.wait_for_volume_resource_status(volumes_client,
159 volume_id,
160 'available')
161 except lib_exc.NotFound:
162 pass
163 BaseVolumeTest.delete_volume(volumes_client, volume_id)
164
Benny Kopilov951b8062022-05-04 08:50:03 +0300165 @cleanup_order
166 def create_snapshot(self, volume_id=1, **kwargs):
Attila Fazekas36b1fcf2013-01-31 16:41:04 +0100167 """Wrapper utility that returns a test snapshot."""
zhufla57530c2017-03-23 11:38:12 +0800168 if 'name' not in kwargs:
Benny Kopilov951b8062022-05-04 08:50:03 +0300169 name = data_utils.rand_name(self.__name__ + '-Snapshot')
zhufla57530c2017-03-23 11:38:12 +0800170 kwargs['name'] = name
zhufl354b2fb2016-10-24 15:24:22 +0800171
Benny Kopilov951b8062022-05-04 08:50:03 +0300172 snapshot = self.snapshots_client.create_snapshot(
Ghanshyam0b75b632015-12-11 15:08:28 +0900173 volume_id=volume_id, **kwargs)['snapshot']
Benny Kopilov951b8062022-05-04 08:50:03 +0300174 self.cleanup(test_utils.call_and_ignore_notfound_exc,
175 self.delete_snapshot, snapshot['id'])
176 waiters.wait_for_volume_resource_status(self.snapshots_client,
lkuchlan52d7b0d2016-11-07 20:53:19 +0200177 snapshot['id'], 'available')
Attila Fazekas36b1fcf2013-01-31 16:41:04 +0100178 return snapshot
179
Lukas Piwowarski2c2484c2023-08-08 13:42:30 +0000180 def create_backup(self, volume_id, backup_client=None, object_client=None,
181 container_client=None, **kwargs):
lkuchlana2beb492016-08-17 12:42:44 +0300182 """Wrapper utility that returns a test backup."""
183 if backup_client is None:
184 backup_client = self.backups_client
Lukas Piwowarski2c2484c2023-08-08 13:42:30 +0000185 if container_client is None:
186 container_client = self.container_client
187 if object_client is None:
188 object_client = self.object_client
zhuflefe033a2017-03-31 15:45:15 +0800189 if 'name' not in kwargs:
190 name = data_utils.rand_name(self.__class__.__name__ + '-Backup')
191 kwargs['name'] = name
Lukas Piwowarski2c2484c2023-08-08 13:42:30 +0000192 if 'container' not in kwargs:
193 cont_name = self.__class__.__name__ + '-backup-container'
194 cont = data_utils.rand_name(cont_name)
195 kwargs['container'] = cont
lkuchlana2beb492016-08-17 12:42:44 +0300196
197 backup = backup_client.create_backup(
198 volume_id=volume_id, **kwargs)['backup']
Lukas Piwowarski2c2484c2023-08-08 13:42:30 +0000199
200 if CONF.service_available.swift:
201 self.addCleanup(object_storage.delete_containers,
202 kwargs['container'], container_client,
203 object_client)
204
Sampat Ponnagantief552162021-03-17 18:07:36 +0000205 # addCleanup uses list pop to cleanup. Wait should be added before
206 # the backup is deleted
207 self.addCleanup(backup_client.wait_for_resource_deletion,
208 backup['id'])
Ghanshyam Mannb0d15bf2017-05-02 04:55:47 +0000209 self.addCleanup(backup_client.delete_backup, backup['id'])
210 waiters.wait_for_volume_resource_status(backup_client, backup['id'],
211 'available')
lkuchlana2beb492016-08-17 12:42:44 +0300212 return backup
213
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200214 # NOTE(afazekas): these create_* and clean_* could be defined
Attila Fazekas36b1fcf2013-01-31 16:41:04 +0100215 # only in a single location in the source, and could be more general.
216
lkuchlane9a15952017-01-08 08:11:23 +0200217 @staticmethod
218 def delete_volume(client, volume_id):
lkuchlan9bf9fac2016-06-19 15:32:33 +0300219 """Delete volume by the given client"""
220 client.delete_volume(volume_id)
221 client.wait_for_resource_deletion(volume_id)
222
Benny Kopilov951b8062022-05-04 08:50:03 +0300223 @cleanup_order
224 def delete_snapshot(self, snapshot_id, snapshots_client=None):
lkuchlancb2f8592016-07-17 15:18:01 +0300225 """Delete snapshot by the given client"""
lkuchlan5b2b3622017-02-14 15:48:36 +0200226 if snapshots_client is None:
Benny Kopilov951b8062022-05-04 08:50:03 +0300227 snapshots_client = self.snapshots_client
lkuchlan5b2b3622017-02-14 15:48:36 +0200228 snapshots_client.delete_snapshot(snapshot_id)
229 snapshots_client.wait_for_resource_deletion(snapshot_id)
lkuchlancb2f8592016-07-17 15:18:01 +0300230
Dan Smith40ba5502023-02-21 12:48:53 -0800231 def attach_volume(self, server_id, volume_id, wait_for_detach=True):
lkuchlan46437232017-01-08 08:29:25 +0200232 """Attach a volume to a server"""
Erlon R. Cruzba19bc72016-09-28 14:32:11 -0300233 self.servers_client.attach_volume(
234 server_id, volumeId=volume_id,
235 device='/dev/%s' % CONF.compute.volume_device_name)
lkuchlan52d7b0d2016-11-07 20:53:19 +0200236 waiters.wait_for_volume_resource_status(self.volumes_client,
237 volume_id, 'in-use')
Dan Smith40ba5502023-02-21 12:48:53 -0800238 if wait_for_detach:
239 self.addCleanup(waiters.wait_for_volume_resource_status,
240 self.volumes_client, volume_id, 'available',
241 server_id, self.servers_client)
Erlon R. Cruzba19bc72016-09-28 14:32:11 -0300242 self.addCleanup(self.servers_client.detach_volume, server_id,
zhufleba284e2016-12-16 10:44:41 +0800243 volume_id)
Erlon R. Cruzba19bc72016-09-28 14:32:11 -0300244
lkuchland4ecd0e2017-06-11 12:01:27 +0300245 def create_server(self, wait_until='ACTIVE', **kwargs):
zhufl22403a02016-10-26 10:25:19 +0800246 name = kwargs.pop(
zhufl7867a6e2016-10-18 15:37:12 +0800247 'name',
248 data_utils.rand_name(self.__class__.__name__ + '-instance'))
249
Dan Smith8f9c77b2023-05-01 14:02:46 -0700250 if wait_until == 'SSHABLE' and not kwargs.get('validation_resources'):
251 # If we were asked for SSHABLE but were not provided with the
252 # required validation_resources and validatable flag, ensure we
253 # pass them to create_test_server() so that it will actually wait.
254 kwargs['validation_resources'] = (
255 self.get_test_validation_resources(self.os_primary))
256 kwargs['validatable'] = True
257
lkuchlan5fc69362016-09-05 08:42:34 +0300258 tenant_network = self.get_tenant_network()
Joseph Lanouxa074c012015-08-04 15:44:07 +0000259 body, _ = compute.create_test_server(
zhufl04190882017-05-23 10:21:48 +0800260 self.os_primary,
Joseph Lanouxa074c012015-08-04 15:44:07 +0000261 tenant_network=tenant_network,
262 name=name,
lkuchland4ecd0e2017-06-11 12:01:27 +0300263 wait_until=wait_until,
Joseph Lanouxa074c012015-08-04 15:44:07 +0000264 **kwargs)
lkuchlan5fc69362016-09-05 08:42:34 +0300265
Matthew Treinish445f5982016-09-14 19:27:04 -0400266 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
267 waiters.wait_for_server_termination,
268 self.servers_client, body['id'])
lkuchlan5fc69362016-09-05 08:42:34 +0300269 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
270 self.servers_client.delete_server, body['id'])
Joseph Lanouxa074c012015-08-04 15:44:07 +0000271 return body
Rohan Kanade9ce97df2013-12-10 18:59:35 +0530272
jeremy.zhang2abe00a2017-11-21 10:14:09 +0800273 def create_group(self, **kwargs):
274 if 'name' not in kwargs:
275 kwargs['name'] = data_utils.rand_name(
276 self.__class__.__name__ + '-Group')
277
278 group = self.groups_client.create_group(**kwargs)['group']
279 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
280 self.delete_group, group['id'])
281 waiters.wait_for_volume_resource_status(
282 self.groups_client, group['id'], 'available')
283 return group
284
285 def delete_group(self, group_id, delete_volumes=True):
Gupta, Sangeet (sg774j)423ae452020-06-04 17:12:49 +0000286 group_vols = []
jeremy.zhang2abe00a2017-11-21 10:14:09 +0800287 if delete_volumes:
288 vols = self.volumes_client.list_volumes(detail=True)['volumes']
289 for vol in vols:
290 if vol['group_id'] == group_id:
Gupta, Sangeet (sg774j)423ae452020-06-04 17:12:49 +0000291 group_vols.append(vol['id'])
292 self.groups_client.delete_group(group_id, delete_volumes)
293 for vol in group_vols:
294 self.volumes_client.wait_for_resource_deletion(vol)
jeremy.zhang2abe00a2017-11-21 10:14:09 +0800295 self.groups_client.wait_for_resource_deletion(group_id)
296
James E. Blaire6d8ee12013-01-18 21:33:45 +0000297
Swapnil Kulkarni7dba3e62014-08-14 09:05:07 +0000298class BaseVolumeAdminTest(BaseVolumeTest):
Attila Fazekas3dcdae12013-02-14 12:50:04 +0100299 """Base test case class for all Volume Admin API tests."""
Swapnil Kulkarni7dba3e62014-08-14 09:05:07 +0000300
Andrea Frittolib21de6c2015-02-06 20:12:38 +0000301 credentials = ['primary', 'admin']
Swapnil Kulkarni7dba3e62014-08-14 09:05:07 +0000302
Rohan Kanade05749152015-01-30 17:15:18 +0530303 @classmethod
304 def setup_clients(cls):
305 super(BaseVolumeAdminTest, cls).setup_clients()
Swapnil Kulkarni7dba3e62014-08-14 09:05:07 +0000306
ghanshyam6c682ff2018-08-06 09:54:45 +0000307 cls.admin_volume_qos_client = cls.os_admin.volume_qos_client_latest
Ken'ichi Ohmichic4fcdbb2017-03-15 16:53:28 -0700308 cls.admin_volume_services_client = \
ghanshyam6c682ff2018-08-06 09:54:45 +0000309 cls.os_admin.volume_services_client_latest
310 cls.admin_volume_types_client = cls.os_admin.volume_types_client_latest
311 cls.admin_volume_manage_client = (
312 cls.os_admin.volume_manage_client_latest)
313 cls.admin_volume_client = cls.os_admin.volumes_client_latest
314 cls.admin_groups_client = cls.os_admin.groups_client_latest
315 cls.admin_messages_client = cls.os_admin.volume_messages_client_latest
316 cls.admin_group_snapshots_client = \
317 cls.os_admin.group_snapshots_client_latest
318 cls.admin_group_types_client = cls.os_admin.group_types_client_latest
319 cls.admin_hosts_client = cls.os_admin.volume_hosts_client_latest
Ken'ichi Ohmichic4fcdbb2017-03-15 16:53:28 -0700320 cls.admin_snapshot_manage_client = \
ghanshyam6c682ff2018-08-06 09:54:45 +0000321 cls.os_admin.snapshot_manage_client_latest
322 cls.admin_snapshots_client = cls.os_admin.snapshots_client_latest
323 cls.admin_backups_client = cls.os_admin.backups_client_latest
Ken'ichi Ohmichic4fcdbb2017-03-15 16:53:28 -0700324 cls.admin_encryption_types_client = \
ghanshyam6c682ff2018-08-06 09:54:45 +0000325 cls.os_admin.encryption_types_client_latest
jeremy.zhang644b01d2017-04-13 12:59:49 +0800326 cls.admin_quota_classes_client = \
ghanshyam6c682ff2018-08-06 09:54:45 +0000327 cls.os_admin.volume_quota_classes_client_latest
328 cls.admin_quotas_client = cls.os_admin.volume_quotas_client_latest
329 cls.admin_volume_limits_client = (
330 cls.os_admin.volume_limits_client_latest)
Ken'ichi Ohmichic4fcdbb2017-03-15 16:53:28 -0700331 cls.admin_capabilities_client = \
ghanshyam6c682ff2018-08-06 09:54:45 +0000332 cls.os_admin.volume_capabilities_client_latest
Ken'ichi Ohmichic4fcdbb2017-03-15 16:53:28 -0700333 cls.admin_scheduler_stats_client = \
ghanshyam6c682ff2018-08-06 09:54:45 +0000334 cls.os_admin.volume_scheduler_stats_client_latest
jeremy.zhang79a1cbf2017-05-07 16:09:17 +0800335
Benny Kopilov951b8062022-05-04 08:50:03 +0300336 @cleanup_order
337 def create_test_qos_specs(self, name=None, consumer=None, **kwargs):
Swapnil Kulkarni7dba3e62014-08-14 09:05:07 +0000338 """create a test Qos-Specs."""
Benny Kopilov951b8062022-05-04 08:50:03 +0300339 name = name or data_utils.rand_name(self.__name__ + '-QoS')
Swapnil Kulkarni7dba3e62014-08-14 09:05:07 +0000340 consumer = consumer or 'front-end'
Benny Kopilov951b8062022-05-04 08:50:03 +0300341 qos_specs = self.admin_volume_qos_client.create_qos(
Jordan Pittier0359c4d2015-12-09 14:34:58 +0100342 name=name, consumer=consumer, **kwargs)['qos_specs']
Benny Kopilov951b8062022-05-04 08:50:03 +0300343 self.cleanup(self.clear_qos_spec, qos_specs['id'])
Swapnil Kulkarni7dba3e62014-08-14 09:05:07 +0000344 return qos_specs
345
Benny Kopilov951b8062022-05-04 08:50:03 +0300346 @cleanup_order
347 def create_volume_type(self, name=None, **kwargs):
lkuchlan76650572016-05-23 12:30:10 +0300348 """Create a test volume-type"""
Benny Kopilov951b8062022-05-04 08:50:03 +0300349 name = name or data_utils.rand_name(self.__name__ + '-volume-type')
350 volume_type = self.admin_volume_types_client.create_volume_type(
lkuchlan76650572016-05-23 12:30:10 +0300351 name=name, **kwargs)['volume_type']
Benny Kopilov951b8062022-05-04 08:50:03 +0300352 self.cleanup(self.clear_volume_type, volume_type['id'])
lkuchlan76650572016-05-23 12:30:10 +0300353 return volume_type
354
Lee Yarwood4bd9edb2020-01-31 17:26:25 +0000355 def create_encryption_type(self, type_id=None, provider=None,
356 key_size=None, cipher=None,
357 control_location=None):
358 if not type_id:
359 volume_type = self.create_volume_type()
360 type_id = volume_type['id']
361 self.admin_encryption_types_client.create_encryption_type(
362 type_id, provider=provider, key_size=key_size, cipher=cipher,
363 control_location=control_location)
364
365 def create_encrypted_volume(self, encryption_provider, key_size=256,
366 cipher='aes-xts-plain64',
367 control_location='front-end'):
368 volume_type = self.create_volume_type()
369 self.create_encryption_type(type_id=volume_type['id'],
370 provider=encryption_provider,
371 key_size=key_size,
372 cipher=cipher,
373 control_location=control_location)
374 return self.create_volume(volume_type=volume_type['name'])
375
Xing Yang0ddf83e2015-11-17 22:15:25 -0500376 def create_group_type(self, name=None, **kwargs):
377 """Create a test group-type"""
378 name = name or data_utils.rand_name(
379 self.__class__.__name__ + '-group-type')
380 group_type = self.admin_group_types_client.create_group_type(
381 name=name, **kwargs)['group_type']
382 self.addCleanup(self.admin_group_types_client.delete_group_type,
383 group_type['id'])
384 return group_type
385
Benny Kopilov951b8062022-05-04 08:50:03 +0300386 @cleanup_order
387 def clear_qos_spec(self, qos_id):
zhuflcae2a752017-11-24 12:43:43 +0800388 test_utils.call_and_ignore_notfound_exc(
Benny Kopilov951b8062022-05-04 08:50:03 +0300389 self.admin_volume_qos_client.delete_qos, qos_id)
Swapnil Kulkarni7dba3e62014-08-14 09:05:07 +0000390
zhuflcae2a752017-11-24 12:43:43 +0800391 test_utils.call_and_ignore_notfound_exc(
Benny Kopilov951b8062022-05-04 08:50:03 +0300392 self.admin_volume_qos_client.wait_for_resource_deletion, qos_id)
lkuchlan76650572016-05-23 12:30:10 +0300393
Benny Kopilov951b8062022-05-04 08:50:03 +0300394 @cleanup_order
395 def clear_volume_type(self, vol_type_id):
zhuflcae2a752017-11-24 12:43:43 +0800396 test_utils.call_and_ignore_notfound_exc(
Benny Kopilov951b8062022-05-04 08:50:03 +0300397 self.admin_volume_types_client.delete_volume_type, vol_type_id)
lkuchlan76650572016-05-23 12:30:10 +0300398
zhuflcae2a752017-11-24 12:43:43 +0800399 test_utils.call_and_ignore_notfound_exc(
Benny Kopilov951b8062022-05-04 08:50:03 +0300400 self.admin_volume_types_client.wait_for_resource_deletion,
zhuflcae2a752017-11-24 12:43:43 +0800401 vol_type_id)