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
This commit is contained in:
Rajat Dhasmana 2021-06-10 05:41:37 -04:00 committed by whoami-rajat
parent 56ace0a8b0
commit f6b9cf6cf8
3 changed files with 125 additions and 61 deletions

View File

@ -72,7 +72,7 @@ class BaseVolumeTest(api_version_utils.BaseMicroversionTest,
def create_volume(cls, wait_until='available', **kwargs):
"""Wrapper utility that returns a test volume.
:param wait_until: wait till volume status.
:param wait_until: wait till volume status, None means no wait.
"""
if 'size' not in kwargs:
kwargs['size'] = CONF.volume.volume_size
@ -93,8 +93,9 @@ class BaseVolumeTest(api_version_utils.BaseMicroversionTest,
cls.addClassResourceCleanup(test_utils.call_and_ignore_notfound_exc,
cls.volumes_client.delete_volume,
volume['id'])
waiters.wait_for_volume_resource_status(cls.volumes_client,
volume['id'], wait_until)
if wait_until:
waiters.wait_for_volume_resource_status(cls.volumes_client,
volume['id'], wait_until)
return volume
@classmethod
@ -199,3 +200,19 @@ class BaseVolumeAdminTest(BaseVolumeTest):
cls.admin_volume_types_client.delete_volume_type, type_id)
test_utils.call_and_ignore_notfound_exc(
cls.admin_volume_types_client.wait_for_resource_deletion, type_id)
class CreateMultipleResourceTest(BaseVolumeTest):
def _create_multiple_resource(self, callback, repeat_count=5,
**kwargs):
res = []
for _ in range(repeat_count):
res.append(callback(**kwargs)['id'])
return res
def _wait_for_multiple_resources(self, callback, wait_list, **kwargs):
for r in wait_list:
callback(resource_id=r, **kwargs)

View File

@ -23,64 +23,6 @@ from cinder_tempest_plugin.api.volume import base
CONF = config.CONF
class VolumeFromImageTest(base.BaseVolumeTest):
@classmethod
def skip_checks(cls):
super(VolumeFromImageTest, cls).skip_checks()
if not CONF.service_available.glance:
raise cls.skipException("Glance service is disabled")
@classmethod
def create_volume_no_wait(cls, **kwargs):
"""Returns a test volume.
This does not wait for volume creation to finish,
so that multiple operations can happen on the
Cinder server in parallel.
"""
if 'size' not in kwargs:
kwargs['size'] = CONF.volume.volume_size
if 'imageRef' in kwargs:
image = cls.os_primary.image_client_v2.show_image(
kwargs['imageRef'])
min_disk = image['min_disk']
kwargs['size'] = max(kwargs['size'], min_disk)
if 'name' not in kwargs:
name = data_utils.rand_name(cls.__name__ + '-Volume')
kwargs['name'] = name
volume = cls.volumes_client.create_volume(**kwargs)['volume']
cls.addClassResourceCleanup(
cls.volumes_client.wait_for_resource_deletion, volume['id'])
cls.addClassResourceCleanup(test_utils.call_and_ignore_notfound_exc,
cls.volumes_client.delete_volume,
volume['id'])
return volume
@decorators.idempotent_id('8976a11b-1ddc-49b6-b66f-8c26adf3fa9e')
def test_create_from_image_multiple(self):
"""Create a handful of volumes from the same image at once.
The purpose of this test is to stress volume drivers,
image download, the image cache, etc., within Cinder.
"""
img_uuid = CONF.compute.image_ref
vols = []
for v in range(0, 5):
vols.append(self.create_volume_no_wait(imageRef=img_uuid))
for v in vols:
waiters.wait_for_volume_resource_status(self.volumes_client,
v['id'],
'available')
class VolumeAndVolumeTypeFromImageTest(base.BaseVolumeAdminTest):
# needs AdminTest as superclass to manipulate volume_types

View File

@ -0,0 +1,105 @@
# Copyright 2022 Red Hat, 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 import decorators
from cinder_tempest_plugin.api.volume import base
CONF = config.CONF
class CreateVolumesFromSnapshotTest(base.CreateMultipleResourceTest):
@decorators.idempotent_id('3b879ad1-d861-4ad3-b2c8-c89162e867c3')
def test_create_multiple_volume_from_snapshot(self):
"""Create multiple volumes from a snapshot."""
volume = self.create_volume()
snapshot = self.create_snapshot(volume_id=volume['id'])
kwargs_create = {"'snapshot_id": snapshot['id'], "wait_until": None}
res = self._create_multiple_resource(self.create_volume,
**kwargs_create)
kwargs_wait = {"client": self.volumes_client, "status": "available"}
self._wait_for_multiple_resources(
waiters.wait_for_volume_resource_status, res, **kwargs_wait)
class CreateVolumesFromSourceVolumeTest(base.CreateMultipleResourceTest):
@decorators.idempotent_id('b4a250d1-3ffd-4727-a2f5-9d858b298558')
def test_create_multiple_volume_from_source_volume(self):
"""Create multiple volumes from a source volume.
The purpose of this test is to check the synchronization
of driver clone method with simultaneous requests.
"""
volume = self.create_volume()
kwargs_create = {"'source_volid": volume['id'], "wait_until": None}
res = self._create_multiple_resource(self.create_volume,
**kwargs_create)
kwargs_wait = {"client": self.volumes_client, "status": "available"}
self._wait_for_multiple_resources(
waiters.wait_for_volume_resource_status, res, **kwargs_wait)
class CreateVolumesFromBackupTest(base.CreateMultipleResourceTest):
@classmethod
def skip_checks(cls):
super(CreateVolumesFromBackupTest, cls).skip_checks()
if not CONF.volume_feature_enabled.backup:
raise cls.skipException("Cinder backup feature disabled")
@decorators.idempotent_id('9db67083-bf1a-486c-8f77-3778467f39a1')
def test_create_multiple_volume_from_backup(self):
"""Create multiple volumes from a backup."""
volume = self.create_volume()
backup = self.create_backup(volume_id=volume['id'])
kwargs_create = {"'backup_id": backup['id'], "wait_until": None}
res = self._create_multiple_resource(self.create_volume,
**kwargs_create)
kwargs_wait = {"client": self.volumes_client, "status": "available"}
self._wait_for_multiple_resources(
waiters.wait_for_volume_resource_status, res, **kwargs_wait)
class CreateVolumesFromImageTest(base.CreateMultipleResourceTest):
@classmethod
def skip_checks(cls):
super(CreateVolumesFromImageTest, cls).skip_checks()
if not CONF.service_available.glance:
raise cls.skipException("Glance service is disabled")
@decorators.idempotent_id('8976a11b-1ddc-49b6-b66f-8c26adf3fa9e')
def test_create_from_image_multiple(self):
"""Create a handful of volumes from the same image at once.
The purpose of this test is to stress volume drivers,
image download, the image cache, etc., within Cinder.
"""
img_uuid = CONF.compute.image_ref
kwargs_create = {"'imageRef": img_uuid, "wait_until": None}
res = self._create_multiple_resource(self.create_volume,
**kwargs_create)
kwargs_wait = {"client": self.volumes_client, "status": "available"}
self._wait_for_multiple_resources(
waiters.wait_for_volume_resource_status, res, **kwargs_wait)