Codebase list cinder-tempest-plugin / f6b9cf6
Add test to create multiple volume from resource This patch adds tests for creating multiple volumes from resources like snapshot, source volume, backup etc. It also moves creating multiple volumes from image test to the same file as other resource tests. Change-Id: Iddc4c40854a5a301ccfbdcf93e03886cc4ee9709 Rajat Dhasmana authored 4 years ago whoami-rajat committed 3 years ago
3 changed file(s) with 125 addition(s) and 61 deletion(s). Raw diff Collapse all Expand all
7171 def create_volume(cls, wait_until='available', **kwargs):
7272 """Wrapper utility that returns a test volume.
7373
74 :param wait_until: wait till volume status.
74 :param wait_until: wait till volume status, None means no wait.
7575 """
7676 if 'size' not in kwargs:
7777 kwargs['size'] = CONF.volume.volume_size
9292 cls.addClassResourceCleanup(test_utils.call_and_ignore_notfound_exc,
9393 cls.volumes_client.delete_volume,
9494 volume['id'])
95 waiters.wait_for_volume_resource_status(cls.volumes_client,
96 volume['id'], wait_until)
95 if wait_until:
96 waiters.wait_for_volume_resource_status(cls.volumes_client,
97 volume['id'], wait_until)
9798 return volume
9899
99100 @classmethod
198199 cls.admin_volume_types_client.delete_volume_type, type_id)
199200 test_utils.call_and_ignore_notfound_exc(
200201 cls.admin_volume_types_client.wait_for_resource_deletion, type_id)
202
203
204 class CreateMultipleResourceTest(BaseVolumeTest):
205
206 def _create_multiple_resource(self, callback, repeat_count=5,
207 **kwargs):
208
209 res = []
210 for _ in range(repeat_count):
211 res.append(callback(**kwargs)['id'])
212 return res
213
214 def _wait_for_multiple_resources(self, callback, wait_list, **kwargs):
215
216 for r in wait_list:
217 callback(resource_id=r, **kwargs)
2020 from cinder_tempest_plugin.api.volume import base
2121
2222 CONF = config.CONF
23
24
25 class VolumeFromImageTest(base.BaseVolumeTest):
26
27 @classmethod
28 def skip_checks(cls):
29 super(VolumeFromImageTest, cls).skip_checks()
30 if not CONF.service_available.glance:
31 raise cls.skipException("Glance service is disabled")
32
33 @classmethod
34 def create_volume_no_wait(cls, **kwargs):
35 """Returns a test volume.
36
37 This does not wait for volume creation to finish,
38 so that multiple operations can happen on the
39 Cinder server in parallel.
40 """
41 if 'size' not in kwargs:
42 kwargs['size'] = CONF.volume.volume_size
43
44 if 'imageRef' in kwargs:
45 image = cls.os_primary.image_client_v2.show_image(
46 kwargs['imageRef'])
47 min_disk = image['min_disk']
48 kwargs['size'] = max(kwargs['size'], min_disk)
49
50 if 'name' not in kwargs:
51 name = data_utils.rand_name(cls.__name__ + '-Volume')
52 kwargs['name'] = name
53
54 volume = cls.volumes_client.create_volume(**kwargs)['volume']
55 cls.addClassResourceCleanup(
56 cls.volumes_client.wait_for_resource_deletion, volume['id'])
57 cls.addClassResourceCleanup(test_utils.call_and_ignore_notfound_exc,
58 cls.volumes_client.delete_volume,
59 volume['id'])
60
61 return volume
62
63 @decorators.idempotent_id('8976a11b-1ddc-49b6-b66f-8c26adf3fa9e')
64 def test_create_from_image_multiple(self):
65 """Create a handful of volumes from the same image at once.
66
67 The purpose of this test is to stress volume drivers,
68 image download, the image cache, etc., within Cinder.
69 """
70
71 img_uuid = CONF.compute.image_ref
72
73 vols = []
74 for v in range(0, 5):
75 vols.append(self.create_volume_no_wait(imageRef=img_uuid))
76
77 for v in vols:
78 waiters.wait_for_volume_resource_status(self.volumes_client,
79 v['id'],
80 'available')
8123
8224
8325 class VolumeAndVolumeTypeFromImageTest(base.BaseVolumeAdminTest):
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.common import waiters
16 from tempest import config
17 from tempest.lib import decorators
18
19 from cinder_tempest_plugin.api.volume import base
20
21 CONF = config.CONF
22
23
24 class CreateVolumesFromSnapshotTest(base.CreateMultipleResourceTest):
25
26 @decorators.idempotent_id('3b879ad1-d861-4ad3-b2c8-c89162e867c3')
27 def test_create_multiple_volume_from_snapshot(self):
28 """Create multiple volumes from a snapshot."""
29
30 volume = self.create_volume()
31 snapshot = self.create_snapshot(volume_id=volume['id'])
32 kwargs_create = {"'snapshot_id": snapshot['id'], "wait_until": None}
33 res = self._create_multiple_resource(self.create_volume,
34 **kwargs_create)
35 kwargs_wait = {"client": self.volumes_client, "status": "available"}
36 self._wait_for_multiple_resources(
37 waiters.wait_for_volume_resource_status, res, **kwargs_wait)
38
39
40 class CreateVolumesFromSourceVolumeTest(base.CreateMultipleResourceTest):
41
42 @decorators.idempotent_id('b4a250d1-3ffd-4727-a2f5-9d858b298558')
43 def test_create_multiple_volume_from_source_volume(self):
44 """Create multiple volumes from a source volume.
45
46 The purpose of this test is to check the synchronization
47 of driver clone method with simultaneous requests.
48 """
49
50 volume = self.create_volume()
51 kwargs_create = {"'source_volid": volume['id'], "wait_until": None}
52 res = self._create_multiple_resource(self.create_volume,
53 **kwargs_create)
54 kwargs_wait = {"client": self.volumes_client, "status": "available"}
55 self._wait_for_multiple_resources(
56 waiters.wait_for_volume_resource_status, res, **kwargs_wait)
57
58
59 class CreateVolumesFromBackupTest(base.CreateMultipleResourceTest):
60
61 @classmethod
62 def skip_checks(cls):
63 super(CreateVolumesFromBackupTest, cls).skip_checks()
64 if not CONF.volume_feature_enabled.backup:
65 raise cls.skipException("Cinder backup feature disabled")
66
67 @decorators.idempotent_id('9db67083-bf1a-486c-8f77-3778467f39a1')
68 def test_create_multiple_volume_from_backup(self):
69 """Create multiple volumes from a backup."""
70
71 volume = self.create_volume()
72 backup = self.create_backup(volume_id=volume['id'])
73 kwargs_create = {"'backup_id": backup['id'], "wait_until": None}
74 res = self._create_multiple_resource(self.create_volume,
75 **kwargs_create)
76 kwargs_wait = {"client": self.volumes_client, "status": "available"}
77 self._wait_for_multiple_resources(
78 waiters.wait_for_volume_resource_status, res, **kwargs_wait)
79
80
81 class CreateVolumesFromImageTest(base.CreateMultipleResourceTest):
82
83 @classmethod
84 def skip_checks(cls):
85 super(CreateVolumesFromImageTest, cls).skip_checks()
86 if not CONF.service_available.glance:
87 raise cls.skipException("Glance service is disabled")
88
89 @decorators.idempotent_id('8976a11b-1ddc-49b6-b66f-8c26adf3fa9e')
90 def test_create_from_image_multiple(self):
91 """Create a handful of volumes from the same image at once.
92
93 The purpose of this test is to stress volume drivers,
94 image download, the image cache, etc., within Cinder.
95 """
96
97 img_uuid = CONF.compute.image_ref
98
99 kwargs_create = {"'imageRef": img_uuid, "wait_until": None}
100 res = self._create_multiple_resource(self.create_volume,
101 **kwargs_create)
102 kwargs_wait = {"client": self.volumes_client, "status": "available"}
103 self._wait_for_multiple_resources(
104 waiters.wait_for_volume_resource_status, res, **kwargs_wait)