From c06215267e408ed3159e018732202c18bb46b964 Mon Sep 17 00:00:00 2001 From: Damian Dabrowski Date: Mon, 23 Dec 2024 11:29:58 +0100 Subject: [PATCH] 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 --- .../task/scenarios/nova/servers.py | 58 +++++++++++++++---- 1 file changed, 46 insertions(+), 12 deletions(-) diff --git a/rally_openstack/task/scenarios/nova/servers.py b/rally_openstack/task/scenarios/nova/servers.py index f7af5b0f..d72e0826 100644 --- a/rally_openstack/task/scenarios/nova/servers.py +++ b/rally_openstack/task/scenarios/nova/servers.py @@ -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(