Support create_volume_kwargs for relevant scenarios

In some scenarios, rally creates a volume first and then it spins up a
VM using this volume.
Depending on the cloud configuration, there is a chance that volume will
be created in a different availability zone than a VM which will lead to
failure.

In some tests like 'boot_server_from_volume_and_resize' there already is
a support for 'create_volume_kwargs' and 'boot_server_kwargs' which
provide a way to define extra arguments for both volume and server
creation.

This patch implements 'create_volume_kwargs' and 'boot_server_kwargs'
for scenarios that may require it. It allows to explicitly define
availability zone when creating volume and a server.

'kwargs' argument in these scenarios was deprecated in favor of
'create_volume_kwargs' and 'boot_server_kwargs' but it's still supported
for backward compatiblity.

Change-Id: Ib43fa522e07afece38541d03ce70da87d8c836e4
This commit is contained in:
Damian Dabrowski
2024-12-23 11:29:58 +01:00
parent 85e56595d3
commit c06215267e

View File

@@ -166,7 +166,8 @@ class BootServerFromVolumeAndDelete(utils.NovaScenario,
cinder_utils.CinderBasic):
def run(self, image, flavor, volume_size, volume_type=None,
min_sleep=0, max_sleep=0, force_delete=False, **kwargs):
min_sleep=0, max_sleep=0, force_delete=False,
create_volume_kwargs=None, boot_server_kwargs=None, **kwargs):
"""Boot a server from volume and then delete it.
The scenario first creates a volume and then a server.
@@ -182,14 +183,21 @@ class BootServerFromVolumeAndDelete(utils.NovaScenario,
:param min_sleep: Minimum sleep time in seconds (non-negative)
:param max_sleep: Maximum sleep time in seconds (non-negative)
:param force_delete: True if force_delete should be used
:param boot_server_kwargs: optional arguments for VM creation
:param create_volume_kwargs: optional arguments for volume creation
:param kwargs: Optional additional arguments for server creation
(deprecated)
"""
boot_server_kwargs = boot_server_kwargs or kwargs
create_volume_kwargs = create_volume_kwargs or {}
volume = self.cinder.create_volume(volume_size, imageRef=image,
volume_type=volume_type)
volume_type=volume_type,
**create_volume_kwargs)
block_device_mapping = {"vda": "%s:::0" % volume.id}
server = self._boot_server(None, flavor,
block_device_mapping=block_device_mapping,
**kwargs)
**boot_server_kwargs)
self.sleep_between(min_sleep, max_sleep)
self._delete_server(server, force=force_delete)
@@ -339,7 +347,9 @@ class BootServer(utils.NovaScenario):
class BootServerFromVolume(utils.NovaScenario, cinder_utils.CinderBasic):
def run(self, image, flavor, volume_size,
volume_type=None, auto_assign_nic=False, **kwargs):
volume_type=None, auto_assign_nic=False,
create_volume_kwargs=None, boot_server_kwargs=None,
**kwargs):
"""Boot a server from volume.
The scenario first creates a volume and then a server.
@@ -351,14 +361,22 @@ class BootServerFromVolume(utils.NovaScenario, cinder_utils.CinderBasic):
:param volume_type: specifies volume type when there are
multiple backends
:param auto_assign_nic: True if NICs should be assigned
:param boot_server_kwargs: optional arguments for VM creation
:param create_volume_kwargs: optional arguments for volume creation
:param kwargs: Optional additional arguments for server creation
(deprecated)
"""
boot_server_kwargs = boot_server_kwargs or kwargs
create_volume_kwargs = create_volume_kwargs or {}
volume = self.cinder.create_volume(volume_size, imageRef=image,
volume_type=volume_type)
volume_type=volume_type,
**create_volume_kwargs)
block_device_mapping = {"vda": "%s:::0" % volume.id}
self._boot_server(None, flavor, auto_assign_nic=auto_assign_nic,
block_device_mapping=block_device_mapping,
**kwargs)
**boot_server_kwargs)
@types.convert(image={"type": "glance_image"},
@@ -794,7 +812,8 @@ class BootServerFromVolumeAndLiveMigrate(utils.NovaScenario,
def run(self, image, flavor, volume_size, volume_type=None,
block_migration=False, disk_over_commit=False, force_delete=False,
min_sleep=0, max_sleep=0, **kwargs):
min_sleep=0, max_sleep=0, create_volume_kwargs=None,
boot_server_kwargs=None, **kwargs):
"""Boot a server from volume and then migrate it.
The scenario first creates a volume and a server booted from
@@ -817,14 +836,21 @@ class BootServerFromVolumeAndLiveMigrate(utils.NovaScenario,
:param force_delete: True if force_delete should be used
:param min_sleep: Minimum sleep time in seconds (non-negative)
:param max_sleep: Maximum sleep time in seconds (non-negative)
:param boot_server_kwargs: optional arguments for VM creation
:param create_volume_kwargs: optional arguments for volume creation
:param kwargs: Optional additional arguments for server creation
(deprecated)
"""
boot_server_kwargs = boot_server_kwargs or kwargs
create_volume_kwargs = create_volume_kwargs or {}
volume = self.cinder.create_volume(volume_size, imageRef=image,
volume_type=volume_type)
volume_type=volume_type,
**create_volume_kwargs)
block_device_mapping = {"vda": "%s:::0" % volume.id}
server = self._boot_server(None, flavor,
block_device_mapping=block_device_mapping,
**kwargs)
**boot_server_kwargs)
self.sleep_between(min_sleep, max_sleep)
self._live_migrate(server, block_migration, disk_over_commit)
@@ -1129,7 +1155,8 @@ class BootServerFromVolumeSnapshot(utils.NovaScenario,
cinder_utils.CinderBasic):
def run(self, image, flavor, volume_size, volume_type=None,
auto_assign_nic=False, **kwargs):
auto_assign_nic=False, create_volume_kwargs=None,
boot_server_kwargs=None, **kwargs):
"""Boot a server from a snapshot.
The scenario first creates a volume and creates a
@@ -1143,15 +1170,22 @@ class BootServerFromVolumeSnapshot(utils.NovaScenario,
:param volume_type: specifies volume type when there are
multiple backends
:param auto_assign_nic: True if NICs should be assigned
:param boot_server_kwargs: optional arguments for VM creation
:param create_volume_kwargs: optional arguments for volume creation
:param kwargs: Optional additional arguments for server creation
(deprecated)
"""
boot_server_kwargs = boot_server_kwargs or kwargs
create_volume_kwargs = create_volume_kwargs or {}
volume = self.cinder.create_volume(volume_size, imageRef=image,
volume_type=volume_type)
volume_type=volume_type,
**create_volume_kwargs)
snapshot = self.cinder.create_snapshot(volume.id, force=False)
block_device_mapping = {"vda": "%s:snap::1" % snapshot.id}
self._boot_server(None, flavor, auto_assign_nic=auto_assign_nic,
block_device_mapping=block_device_mapping,
**kwargs)
**boot_server_kwargs)
@logging.log_deprecated_args(