Switch cinder scenarios to cinder service

1. need to fix the bug of cinder servcie
2. switch cinder scenarios to cinder service
3. port new method of cinder to cinder service

Change-Id: I49bef1d940acb09c64946ba31ca85bbd5230cc36
This commit is contained in:
chenhb-zte 2017-02-04 12:31:02 +08:00
parent 0cf7108577
commit 0f775893d5
25 changed files with 957 additions and 811 deletions

View File

@ -180,8 +180,7 @@
- -
args: args:
update_volume_kwargs: update_volume_kwargs:
display_name: "name_updated" description: "desc_updated"
display_description: "desc_updated"
size: 1 size: 1
runner: runner:
type: "constant" type: "constant"
@ -197,8 +196,7 @@
- -
args: args:
update_volume_kwargs: update_volume_kwargs:
display_name: "name_updated" description: "desc_updated"
display_description: "desc_updated"
size: 1 size: 1
image: image:
name: {{image_name}} name: {{image_name}}
@ -511,7 +509,6 @@
CinderVolumes.create_snapshot_and_attach_volume: CinderVolumes.create_snapshot_and_attach_volume:
- -
args: args:
volume_type: false
size: size:
min: 1 min: 1
max: 1 max: 1
@ -535,7 +532,7 @@
- -
args: args:
volume_type: true volume_type: "test"
size: size:
min: 1 min: 1
max: 1 max: 1
@ -553,6 +550,8 @@
flavor: flavor:
name: {{flavor_name}} name: {{flavor_name}}
servers_per_tenant: 1 servers_per_tenant: 1
volume_types:
- "test"
sla: sla:
failure_rate: failure_rate:
max: 0 max: 0

View File

@ -19,6 +19,7 @@ from oslo_config import cfg
from rally import exceptions from rally import exceptions
from rally.plugins.openstack import scenario from rally.plugins.openstack import scenario
from rally.plugins.openstack.services.storage import block
from rally.plugins.openstack.wrappers import cinder as cinder_wrapper from rally.plugins.openstack.wrappers import cinder as cinder_wrapper
from rally.plugins.openstack.wrappers import glance as glance_wrapper from rally.plugins.openstack.wrappers import glance as glance_wrapper
from rally.task import atomic from rally.task import atomic
@ -57,6 +58,23 @@ benchmark_group = cfg.OptGroup(name="benchmark", title="benchmark options")
CONF.register_opts(CINDER_BENCHMARK_OPTS, group=benchmark_group) CONF.register_opts(CINDER_BENCHMARK_OPTS, group=benchmark_group)
class CinderBasic(scenario.OpenStackScenario):
def __init__(self, context=None, admin_clients=None, clients=None):
super(CinderBasic, self).__init__(context, admin_clients, clients)
if hasattr(self, "_admin_clients"):
self.admin_cinder = block.BlockStorage(
self._admin_clients, name_generator=self.generate_random_name,
atomic_inst=self.atomic_actions())
if hasattr(self, "_clients"):
self.cinder = block.BlockStorage(
self._clients, name_generator=self.generate_random_name,
atomic_inst=self.atomic_actions())
def get_random_server(self):
server_id = random.choice(self.context["tenant"]["servers"])
return self.clients("nova").servers.get(server_id)
class CinderScenario(scenario.OpenStackScenario): class CinderScenario(scenario.OpenStackScenario):
"""Base class for Cinder scenarios with basic atomic actions.""" """Base class for Cinder scenarios with basic atomic actions."""

View File

@ -22,13 +22,17 @@ from rally.task import validation
@validation.number("size", minval=1, integer_only=True) @validation.number("size", minval=1, integer_only=True)
@validation.restricted_parameters(["name", "display_name"],
subdict="create_volume_kwargs")
@validation.restricted_parameters("name",
subdict="create_backup_kwargs")
@validation.required_cinder_services("cinder-backup") @validation.required_cinder_services("cinder-backup")
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["cinder"]}, @scenario.configure(context={"cleanup": ["cinder"]},
name="CinderVolumeBackups." name="CinderVolumeBackups."
"create_incremental_volume_backup") "create_incremental_volume_backup")
class CreateIncrementalVolumeBackup(cinder_utils.CinderScenario): class CreateIncrementalVolumeBackup(cinder_utils.CinderBasic):
def run(self, size, do_delete=True, create_volume_kwargs=None, def run(self, size, do_delete=True, create_volume_kwargs=None,
create_backup_kwargs=None): create_backup_kwargs=None):
"""Create a incremental volume backup. """Create a incremental volume backup.
@ -45,12 +49,12 @@ class CreateIncrementalVolumeBackup(cinder_utils.CinderScenario):
create_volume_kwargs = create_volume_kwargs or {} create_volume_kwargs = create_volume_kwargs or {}
create_backup_kwargs = create_backup_kwargs or {} create_backup_kwargs = create_backup_kwargs or {}
volume = self._create_volume(size, **create_volume_kwargs) volume = self.cinder.create_volume(size, **create_volume_kwargs)
backup1 = self._create_backup(volume.id, **create_backup_kwargs) backup1 = self.cinder.create_backup(volume.id, **create_backup_kwargs)
backup2 = self._create_backup(volume.id, incremental=True) backup2 = self.cinder.create_backup(volume.id, incremental=True)
if do_delete: if do_delete:
self._delete_backup(backup2) self.cinder.delete_backup(backup2)
self._delete_backup(backup1) self.cinder.delete_backup(backup1)
self._delete_volume(volume) self.cinder.delete_volume(volume)

View File

@ -23,11 +23,12 @@ from rally.task import validation
"""Scenarios for Cinder Volume Type.""" """Scenarios for Cinder Volume Type."""
@validation.restricted_parameters("name")
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_openstack(admin=True) @validation.required_openstack(admin=True)
@scenario.configure(context={"admin_cleanup": ["cinder"]}, @scenario.configure(context={"admin_cleanup": ["cinder"]},
name="CinderVolumeTypes.create_and_delete_volume_type") name="CinderVolumeTypes.create_and_delete_volume_type")
class CreateAndDeleteVolumeType(cinder_utils.CinderScenario): class CreateAndDeleteVolumeType(cinder_utils.CinderBasic):
def run(self, **kwargs): def run(self, **kwargs):
"""Create and delete a volume Type. """Create and delete a volume Type.
@ -35,15 +36,16 @@ class CreateAndDeleteVolumeType(cinder_utils.CinderScenario):
:param kwargs: Optional parameters used during volume :param kwargs: Optional parameters used during volume
type creation. type creation.
""" """
volume_type = self._create_volume_type(**kwargs) volume_type = self.admin_cinder.create_volume_type(**kwargs)
self._delete_volume_type(volume_type) self.admin_cinder.delete_volume_type(volume_type)
@validation.restricted_parameters("name")
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_openstack(admin=True) @validation.required_openstack(admin=True)
@scenario.configure(context={"admin_cleanup": ["cinder"]}, @scenario.configure(context={"admin_cleanup": ["cinder"]},
name="CinderVolumeTypes.create_and_get_volume_type") name="CinderVolumeTypes.create_and_get_volume_type")
class CreateAndGetVolumeType(cinder_utils.CinderScenario): class CreateAndGetVolumeType(cinder_utils.CinderBasic):
def run(self, **kwargs): def run(self, **kwargs):
"""Create a volume Type, then get the details of the type. """Create a volume Type, then get the details of the type.
@ -51,16 +53,17 @@ class CreateAndGetVolumeType(cinder_utils.CinderScenario):
:param kwargs: Optional parameters used during volume :param kwargs: Optional parameters used during volume
type creation. type creation.
""" """
volume_type = self._create_volume_type(**kwargs) volume_type = self.admin_cinder.create_volume_type(**kwargs)
self._get_volume_type(volume_type) self.admin_cinder.get_volume_type(volume_type)
@validation.restricted_parameters("name")
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_openstack(admin=True) @validation.required_openstack(admin=True)
@scenario.configure(context={"admin_cleanup": ["cinder"]}, @scenario.configure(context={"admin_cleanup": ["cinder"]},
name="CinderVolumeTypes.create_volume_type" name="CinderVolumeTypes.create_volume_type"
"_and_encryption_type") "_and_encryption_type")
class CreateVolumeTypeAndEncryptionType(cinder_utils.CinderScenario): class CreateVolumeTypeAndEncryptionType(cinder_utils.CinderBasic):
def run(self, specs, **kwargs): def run(self, specs, **kwargs):
"""Create encryption type """Create encryption type
@ -72,16 +75,18 @@ class CreateVolumeTypeAndEncryptionType(cinder_utils.CinderScenario):
:param kwargs: Optional parameters used during volume :param kwargs: Optional parameters used during volume
type creation. type creation.
""" """
volume_type = self._create_volume_type(**kwargs) volume_type = self.admin_cinder.create_volume_type(**kwargs)
self._create_encryption_type(volume_type, specs) self.admin_cinder.create_encryption_type(volume_type,
specs=specs)
@validation.restricted_parameters("name")
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_openstack(admin=True) @validation.required_openstack(admin=True)
@scenario.configure(context={"admin_cleanup": ["cinder"]}, @scenario.configure(context={"admin_cleanup": ["cinder"]},
name="CinderVolumeTypes.create_and_list_" name="CinderVolumeTypes.create_and_list_"
"encryption_type") "encryption_type")
class CreateAndListEncryptionType(cinder_utils.CinderScenario): class CreateAndListEncryptionType(cinder_utils.CinderBasic):
def run(self, specs, search_opts=None, **kwargs): def run(self, specs, search_opts=None, **kwargs):
"""Create and list encryption type """Create and list encryption type
@ -95,16 +100,18 @@ class CreateAndListEncryptionType(cinder_utils.CinderScenario):
:param kwargs: Optional parameters used during volume :param kwargs: Optional parameters used during volume
type creation. type creation.
""" """
volume_type = self._create_volume_type(**kwargs) volume_type = self.admin_cinder.create_volume_type(**kwargs)
self._create_encryption_type(volume_type, specs) self.admin_cinder.create_encryption_type(volume_type,
self._list_encryption_type(search_opts) specs=specs)
self.admin_cinder.list_encryption_type(search_opts)
@validation.restricted_parameters("name")
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_openstack(admin=True) @validation.required_openstack(admin=True)
@scenario.configure(context={"admin_cleanup": ["cinder"]}, @scenario.configure(context={"admin_cleanup": ["cinder"]},
name="CinderVolumeTypes.create_and_set_volume_type_keys") name="CinderVolumeTypes.create_and_set_volume_type_keys")
class CreateAndSetVolumeTypeKeys(cinder_utils.CinderScenario): class CreateAndSetVolumeTypeKeys(cinder_utils.CinderBasic):
def run(self, volume_type_key, **kwargs): def run(self, volume_type_key, **kwargs):
"""Create and set a volume type's extra specs. """Create and set a volume type's extra specs.
@ -113,9 +120,9 @@ class CreateAndSetVolumeTypeKeys(cinder_utils.CinderScenario):
:param kwargs: Optional parameters used during volume :param kwargs: Optional parameters used during volume
type creation. type creation.
""" """
volume_type = self._create_volume_type(**kwargs) volume_type = self.admin_cinder.create_volume_type(**kwargs)
self.admin_cinder.set_volume_type_keys(volume_type,
self._set_volume_type_keys(volume_type, volume_type_key) metadata=volume_type_key)
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@ -124,7 +131,7 @@ class CreateAndSetVolumeTypeKeys(cinder_utils.CinderScenario):
@scenario.configure(context={"admin_cleanup": ["cinder"]}, @scenario.configure(context={"admin_cleanup": ["cinder"]},
name="CinderVolumeTypes.create_and_delete_" name="CinderVolumeTypes.create_and_delete_"
"encryption_type") "encryption_type")
class CreateAndDeleteEncryptionType(cinder_utils.CinderScenario): class CreateAndDeleteEncryptionType(cinder_utils.CinderBasic):
def run(self, create_specs): def run(self, create_specs):
"""Create and delete encryption type """Create and delete encryption type
@ -135,5 +142,6 @@ class CreateAndDeleteEncryptionType(cinder_utils.CinderScenario):
:param create_specs: the encryption type specifications to add :param create_specs: the encryption type specifications to add
""" """
volume_type = random.choice(self.context["volume_types"]) volume_type = random.choice(self.context["volume_types"])
self._create_encryption_type(volume_type["id"], create_specs) self.admin_cinder.create_encryption_type(volume_type["id"],
self._delete_encryption_type(volume_type["id"]) specs=create_specs)
self.admin_cinder.delete_encryption_type(volume_type["id"])

294
rally/plugins/openstack/scenarios/cinder/volumes.py Executable file → Normal file
View File

@ -32,14 +32,13 @@ LOG = logging.getLogger(__name__)
@types.convert(image={"type": "glance_image"}) @types.convert(image={"type": "glance_image"})
@validation.restricted_parameters(["name", "display_name"])
@validation.image_exists("image", nullable=True) @validation.image_exists("image", nullable=True)
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["cinder"]}, @scenario.configure(context={"cleanup": ["cinder"]},
name="CinderVolumes.create_and_list_volume") name="CinderVolumes.create_and_list_volume")
class CreateAndListVolume(cinder_utils.CinderScenario, class CreateAndListVolume(cinder_utils.CinderBasic):
nova_utils.NovaScenario,
glance_utils.GlanceScenario):
def run(self, size, detailed=True, image=None, **kwargs): def run(self, size, detailed=True, image=None, **kwargs):
"""Create a volume and list all volumes. """Create a volume and list all volumes.
@ -64,19 +63,18 @@ class CreateAndListVolume(cinder_utils.CinderScenario,
if image: if image:
kwargs["imageRef"] = image kwargs["imageRef"] = image
self._create_volume(size, **kwargs) self.cinder.create_volume(size, **kwargs)
self._list_volumes(detailed) self.cinder.list_volumes(detailed)
@types.convert(image={"type": "glance_image"}) @types.convert(image={"type": "glance_image"})
@validation.restricted_parameters(["name", "display_name"])
@validation.image_exists("image", nullable=True) @validation.image_exists("image", nullable=True)
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["cinder"]}, @scenario.configure(context={"cleanup": ["cinder"]},
name="CinderVolumes.create_and_get_volume") name="CinderVolumes.create_and_get_volume")
class CreateAndGetVolume(cinder_utils.CinderScenario, class CreateAndGetVolume(cinder_utils.CinderBasic):
nova_utils.NovaScenario,
glance_utils.GlanceScenario):
def run(self, size, image=None, **kwargs): def run(self, size, image=None, **kwargs):
"""Create a volume and get the volume. """Create a volume and get the volume.
@ -93,17 +91,15 @@ class CreateAndGetVolume(cinder_utils.CinderScenario,
if image: if image:
kwargs["imageRef"] = image kwargs["imageRef"] = image
volume = self._create_volume(size, **kwargs) volume = self.cinder.create_volume(size, **kwargs)
self._get_volume(volume.id) self.cinder.get_volume(volume.id)
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["cinder"]}, @scenario.configure(context={"cleanup": ["cinder"]},
name="CinderVolumes.list_volumes") name="CinderVolumes.list_volumes")
class ListVolumes(cinder_utils.CinderScenario, class ListVolumes(cinder_utils.CinderBasic):
nova_utils.NovaScenario,
glance_utils.GlanceScenario):
def run(self, detailed=True): def run(self, detailed=True):
"""List all volumes. """List all volumes.
@ -115,13 +111,13 @@ class ListVolumes(cinder_utils.CinderScenario,
should be listed should be listed
""" """
self._list_volumes(detailed) self.cinder.list_volumes(detailed)
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(name="CinderVolumes.list_types") @scenario.configure(name="CinderVolumes.list_types")
class ListTypes(cinder_utils.CinderScenario): class ListTypes(cinder_utils.CinderBasic):
def run(self, search_opts=None, is_public=None): def run(self, search_opts=None, is_public=None):
"""List all volume types. """List all volume types.
@ -133,13 +129,13 @@ class ListTypes(cinder_utils.CinderScenario):
:param is_public: If query public volume type :param is_public: If query public volume type
""" """
self._list_types(search_opts, is_public) self.cinder.list_types(search_opts, is_public=is_public)
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(name="CinderVolumes.list_transfers") @scenario.configure(name="CinderVolumes.list_transfers")
class ListTransfers(cinder_utils.CinderScenario): class ListTransfers(cinder_utils.CinderBasic):
def run(self, detailed=True, search_opts=None): def run(self, detailed=True, search_opts=None):
"""List all transfers. """List all transfers.
@ -152,18 +148,20 @@ class ListTransfers(cinder_utils.CinderScenario):
:param search_opts: Search options to filter out volume transfers. :param search_opts: Search options to filter out volume transfers.
""" """
self._list_transfers(detailed, search_opts) self.cinder.list_transfers(detailed, search_opts=search_opts)
@types.convert(image={"type": "glance_image"}) @types.convert(image={"type": "glance_image"})
@validation.restricted_parameters(["name", "display_name"],
subdict="create_volume_kwargs")
@validation.restricted_parameters(["name", "display_name"],
subdict="update_volume_kwargs")
@validation.image_exists("image", nullable=True) @validation.image_exists("image", nullable=True)
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["cinder"]}, @scenario.configure(context={"cleanup": ["cinder"]},
name="CinderVolumes.create_and_update_volume") name="CinderVolumes.create_and_update_volume")
class CreateAndUpdateVolume(cinder_utils.CinderScenario, class CreateAndUpdateVolume(cinder_utils.CinderBasic):
nova_utils.NovaScenario,
glance_utils.GlanceScenario):
def run(self, size, image=None, create_volume_kwargs=None, def run(self, size, image=None, create_volume_kwargs=None,
update_volume_kwargs=None): update_volume_kwargs=None):
@ -173,24 +171,31 @@ class CreateAndUpdateVolume(cinder_utils.CinderScenario,
:param image: image to be used to create volume :param image: image to be used to create volume
:param create_volume_kwargs: dict, to be used to create volume :param create_volume_kwargs: dict, to be used to create volume
:param update_volume_kwargs: dict, to be used to update volume :param update_volume_kwargs: dict, to be used to update volume
update_volume_kwargs["update_name"]=True, if updating the
name of volume.
update_volume_kwargs["description"]="desp", if updating the
description of volume.
""" """
create_volume_kwargs = create_volume_kwargs or {} create_volume_kwargs = create_volume_kwargs or {}
update_volume_kwargs = update_volume_kwargs or {} update_volume_kwargs = update_volume_kwargs or {}
if image: if image:
create_volume_kwargs["imageRef"] = image create_volume_kwargs["imageRef"] = image
volume = self._create_volume(size, **create_volume_kwargs)
self._update_volume(volume, **update_volume_kwargs) if update_volume_kwargs.pop("update_name", False):
update_volume_kwargs["name"] = self.generate_random_name()
volume = self.cinder.create_volume(size, **create_volume_kwargs)
self.cinder.update_volume(volume, **update_volume_kwargs)
@types.convert(image={"type": "glance_image"}) @types.convert(image={"type": "glance_image"})
@validation.restricted_parameters(["name", "display_name"])
@validation.image_exists("image", nullable=True) @validation.image_exists("image", nullable=True)
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["cinder"]}, @scenario.configure(context={"cleanup": ["cinder"]},
name="CinderVolumes.create_and_delete_volume") name="CinderVolumes.create_and_delete_volume")
class CreateAndDeleteVolume(cinder_utils.CinderScenario, class CreateAndDeleteVolume(cinder_utils.CinderBasic):
nova_utils.NovaScenario,
glance_utils.GlanceScenario):
def run(self, size, image=None, min_sleep=0, max_sleep=0, **kwargs): def run(self, size, image=None, min_sleep=0, max_sleep=0, **kwargs):
"""Create and then delete a volume. """Create and then delete a volume.
@ -214,20 +219,19 @@ class CreateAndDeleteVolume(cinder_utils.CinderScenario,
if image: if image:
kwargs["imageRef"] = image kwargs["imageRef"] = image
volume = self._create_volume(size, **kwargs) volume = self.cinder.create_volume(size, **kwargs)
self.sleep_between(min_sleep, max_sleep) self.sleep_between(min_sleep, max_sleep)
self._delete_volume(volume) self.cinder.delete_volume(volume)
@types.convert(image={"type": "glance_image"}) @types.convert(image={"type": "glance_image"})
@validation.restricted_parameters(["name", "display_name"])
@validation.image_exists("image", nullable=True) @validation.image_exists("image", nullable=True)
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["cinder"]}, @scenario.configure(context={"cleanup": ["cinder"]},
name="CinderVolumes.create_volume") name="CinderVolumes.create_volume")
class CreateVolume(cinder_utils.CinderScenario, class CreateVolume(cinder_utils.CinderBasic):
nova_utils.NovaScenario,
glance_utils.GlanceScenario):
def run(self, size, image=None, **kwargs): def run(self, size, image=None, **kwargs):
"""Create a volume. """Create a volume.
@ -245,7 +249,7 @@ class CreateVolume(cinder_utils.CinderScenario,
if image: if image:
kwargs["imageRef"] = image kwargs["imageRef"] = image
self._create_volume(size, **kwargs) self.cinder.create_volume(size, **kwargs)
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@ -253,9 +257,7 @@ class CreateVolume(cinder_utils.CinderScenario,
@validation.required_contexts("volumes") @validation.required_contexts("volumes")
@scenario.configure(context={"cleanup": ["cinder"]}, @scenario.configure(context={"cleanup": ["cinder"]},
name="CinderVolumes.modify_volume_metadata") name="CinderVolumes.modify_volume_metadata")
class ModifyVolumeMetadata(cinder_utils.CinderScenario, class ModifyVolumeMetadata(cinder_utils.CinderBasic):
nova_utils.NovaScenario,
glance_utils.GlanceScenario):
def run(self, sets=10, set_size=3, deletes=5, delete_size=3): def run(self, sets=10, set_size=3, deletes=5, delete_size=3):
"""Modify a volume's metadata. """Modify a volume's metadata.
@ -279,17 +281,19 @@ class ModifyVolumeMetadata(cinder_utils.CinderScenario,
"num_deletes": deletes * delete_size}) "num_deletes": deletes * delete_size})
volume = random.choice(self.context["tenant"]["volumes"]) volume = random.choice(self.context["tenant"]["volumes"])
keys = self._set_metadata(volume["id"], sets, set_size) keys = self.cinder.set_metadata(volume["id"], sets=sets,
self._delete_metadata(volume["id"], keys, deletes, delete_size) set_size=set_size)
self.cinder.delete_metadata(volume["id"], keys=keys,
deletes=deletes,
delete_size=delete_size)
@validation.restricted_parameters(["name", "display_name"])
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["cinder"]}, @scenario.configure(context={"cleanup": ["cinder"]},
name="CinderVolumes.create_and_extend_volume") name="CinderVolumes.create_and_extend_volume")
class CreateAndExtendVolume(cinder_utils.CinderScenario, class CreateAndExtendVolume(cinder_utils.CinderBasic):
nova_utils.NovaScenario,
glance_utils.GlanceScenario):
def run(self, size, new_size, min_sleep=0, max_sleep=0, **kwargs): def run(self, size, new_size, min_sleep=0, max_sleep=0, **kwargs):
"""Create and extend a volume and then delete it. """Create and extend a volume and then delete it.
@ -311,20 +315,19 @@ class CreateAndExtendVolume(cinder_utils.CinderScenario,
deletion (in seconds) deletion (in seconds)
:param kwargs: optional args to extend the volume :param kwargs: optional args to extend the volume
""" """
volume = self._create_volume(size, **kwargs) volume = self.cinder.create_volume(size, **kwargs)
self._extend_volume(volume, new_size) self.cinder.extend_volume(volume, new_size=new_size)
self.sleep_between(min_sleep, max_sleep) self.sleep_between(min_sleep, max_sleep)
self._delete_volume(volume) self.cinder.delete_volume(volume)
@validation.restricted_parameters(["name", "display_name"])
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_contexts("volumes") @validation.required_contexts("volumes")
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["cinder"]}, @scenario.configure(context={"cleanup": ["cinder"]},
name="CinderVolumes.create_from_volume_and_delete_volume") name="CinderVolumes.create_from_volume_and_delete_volume")
class CreateFromVolumeAndDeleteVolume(cinder_utils.CinderScenario, class CreateFromVolumeAndDeleteVolume(cinder_utils.CinderBasic):
nova_utils.NovaScenario,
glance_utils.GlanceScenario):
def run(self, size, min_sleep=0, max_sleep=0, **kwargs): def run(self, size, min_sleep=0, max_sleep=0, **kwargs):
"""Create volume from volume and then delete it. """Create volume from volume and then delete it.
@ -346,20 +349,19 @@ class CreateFromVolumeAndDeleteVolume(cinder_utils.CinderScenario,
:param kwargs: optional args to create a volume :param kwargs: optional args to create a volume
""" """
source_vol = random.choice(self.context["tenant"]["volumes"]) source_vol = random.choice(self.context["tenant"]["volumes"])
volume = self._create_volume(size, source_volid=source_vol["id"], volume = self.cinder.create_volume(size, source_volid=source_vol["id"],
**kwargs) **kwargs)
self.sleep_between(min_sleep, max_sleep) self.sleep_between(min_sleep, max_sleep)
self._delete_volume(volume) self.cinder.delete_volume(volume)
@validation.restricted_parameters(["name", "display_name"])
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_contexts("volumes") @validation.required_contexts("volumes")
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["cinder"]}, @scenario.configure(context={"cleanup": ["cinder"]},
name="CinderVolumes.create_and_delete_snapshot") name="CinderVolumes.create_and_delete_snapshot")
class CreateAndDeleteSnapshot(cinder_utils.CinderScenario, class CreateAndDeleteSnapshot(cinder_utils.CinderBasic):
nova_utils.NovaScenario,
glance_utils.GlanceScenario):
def run(self, force=False, min_sleep=0, max_sleep=0, **kwargs): def run(self, force=False, min_sleep=0, max_sleep=0, **kwargs):
"""Create and then delete a volume-snapshot. """Create and then delete a volume-snapshot.
@ -377,21 +379,23 @@ class CreateAndDeleteSnapshot(cinder_utils.CinderScenario,
:param kwargs: optional args to create a snapshot :param kwargs: optional args to create a snapshot
""" """
volume = random.choice(self.context["tenant"]["volumes"]) volume = random.choice(self.context["tenant"]["volumes"])
snapshot = self._create_snapshot(volume["id"], force=force, **kwargs) snapshot = self.cinder.create_snapshot(volume["id"], force=force,
**kwargs)
self.sleep_between(min_sleep, max_sleep) self.sleep_between(min_sleep, max_sleep)
self._delete_snapshot(snapshot) self.cinder.delete_snapshot(snapshot)
@types.convert(image={"type": "glance_image"}, @types.convert(image={"type": "glance_image"},
flavor={"type": "nova_flavor"}) flavor={"type": "nova_flavor"})
@validation.restricted_parameters(["name", "display_name"],
subdict="create_volume_params")
@validation.image_valid_on_flavor("flavor", "image") @validation.image_valid_on_flavor("flavor", "image")
@validation.required_services(consts.Service.NOVA, consts.Service.CINDER) @validation.required_services(consts.Service.NOVA, consts.Service.CINDER)
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["cinder", "nova"]}, @scenario.configure(context={"cleanup": ["cinder", "nova"]},
name="CinderVolumes.create_and_attach_volume") name="CinderVolumes.create_and_attach_volume")
class CreateAndAttachVolume(cinder_utils.CinderScenario, class CreateAndAttachVolume(cinder_utils.CinderBasic,
nova_utils.NovaScenario, nova_utils.NovaScenario):
glance_utils.GlanceScenario):
@logging.log_deprecated_args( @logging.log_deprecated_args(
"Use 'create_vm_params' for additional instance parameters.", "Use 'create_vm_params' for additional instance parameters.",
@ -424,25 +428,25 @@ class CreateAndAttachVolume(cinder_utils.CinderScenario,
create_vm_params = create_vm_params or kwargs or {} create_vm_params = create_vm_params or kwargs or {}
server = self._boot_server(image, flavor, **create_vm_params) server = self._boot_server(image, flavor, **create_vm_params)
volume = self._create_volume(size, **create_volume_params) volume = self.cinder.create_volume(size, **create_volume_params)
attachment = self._attach_volume(server, volume) attachment = self._attach_volume(server, volume)
self._detach_volume(server, volume, attachment) self._detach_volume(server, volume, attachment)
self._delete_volume(volume) self.cinder.delete_volume(volume)
self._delete_server(server) self._delete_server(server)
@validation.restricted_parameters(["name", "display_name"])
@validation.volume_type_exists("volume_type") @validation.volume_type_exists("volume_type")
@validation.required_services(consts.Service.NOVA, consts.Service.CINDER) @validation.required_services(consts.Service.NOVA, consts.Service.CINDER)
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["cinder", "nova"]}, @scenario.configure(context={"cleanup": ["cinder", "nova"]},
name="CinderVolumes.create_snapshot_and_attach_volume") name="CinderVolumes.create_snapshot_and_attach_volume")
class CreateSnapshotAndAttachVolume(cinder_utils.CinderScenario, class CreateSnapshotAndAttachVolume(cinder_utils.CinderBasic,
nova_utils.NovaScenario, nova_utils.NovaScenario):
glance_utils.GlanceScenario):
def run(self, volume_type=False, size=None, **kwargs): def run(self, volume_type=None, size=None, **kwargs):
"""Create volume, snapshot and attach/detach volume. """Create volume, snapshot and attach/detach volume.
:param volume_type: Name of volume type to use :param volume_type: Name of volume type to use
@ -456,35 +460,30 @@ class CreateSnapshotAndAttachVolume(cinder_utils.CinderScenario,
if size is None: if size is None:
size = {"min": 1, "max": 5} size = {"min": 1, "max": 5}
if isinstance(volume_type, bool): volume = self.cinder.create_volume(size, volume_type=volume_type)
LOG.warning("Selecting a random volume type is deprecated" snapshot = self.cinder.create_snapshot(volume.id, force=False,
"as of Rally 0.7.0") **kwargs)
volume_types = [None]
volume_types_list = self.clients("cinder").volume_types.list()
for s in volume_types_list:
volume_types.append(s.name)
volume_type = random.choice(volume_types)
volume = self._create_volume(size, volume_type=volume_type)
snapshot = self._create_snapshot(volume.id, False, **kwargs)
server = self.get_random_server() server = self.get_random_server()
attachment = self._attach_volume(server, volume) attachment = self._attach_volume(server, volume)
self._detach_volume(server, volume, attachment) self._detach_volume(server, volume, attachment)
self._delete_snapshot(snapshot) self.cinder.delete_snapshot(snapshot)
self._delete_volume(volume) self.cinder.delete_volume(volume)
@validation.restricted_parameters(["name", "display_name"],
subdict="create_volume_kwargs")
@validation.restricted_parameters(["name", "display_name"],
subdict="create_snapshot_kwargs")
@validation.required_services(consts.Service.NOVA, consts.Service.CINDER) @validation.required_services(consts.Service.NOVA, consts.Service.CINDER)
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["cinder", "nova"]}, @scenario.configure(context={"cleanup": ["cinder", "nova"]},
name="CinderVolumes.create_nested_snapshots" name="CinderVolumes.create_nested_snapshots"
"_and_attach_volume") "_and_attach_volume")
class CreateNestedSnapshotsAndAttachVolume(cinder_utils.CinderScenario, class CreateNestedSnapshotsAndAttachVolume(cinder_utils.CinderBasic,
nova_utils.NovaScenario, nova_utils.NovaScenario):
glance_utils.GlanceScenario):
@logging.log_deprecated_args( @logging.log_deprecated_args(
"Use 'create_snapshot_kwargs' for additional snapshot kwargs.", "Use 'create_snapshot_kwargs' for additional snapshot kwargs.",
@ -521,16 +520,16 @@ class CreateNestedSnapshotsAndAttachVolume(cinder_utils.CinderScenario,
create_snapshot_kwargs = create_snapshot_kwargs or kwargs or {} create_snapshot_kwargs = create_snapshot_kwargs or kwargs or {}
server = self.get_random_server() server = self.get_random_server()
source_vol = self._create_volume(size, **create_volume_kwargs) source_vol = self.cinder.create_volume(size, **create_volume_kwargs)
snapshot = self._create_snapshot(source_vol.id, False, snapshot = self.cinder.create_snapshot(source_vol.id, force=False,
**create_snapshot_kwargs) **create_snapshot_kwargs)
attachment = self._attach_volume(server, source_vol) attachment = self._attach_volume(server, source_vol)
nes_objs = [(server, source_vol, snapshot, attachment)] nes_objs = [(server, source_vol, snapshot, attachment)]
for i in range(nested_level - 1): for i in range(nested_level - 1):
volume = self._create_volume(size, snapshot_id=snapshot.id) volume = self.cinder.create_volume(size, snapshot_id=snapshot.id)
snapshot = self._create_snapshot(volume.id, False, snapshot = self.cinder.create_snapshot(volume.id, force=False,
**create_snapshot_kwargs) **create_snapshot_kwargs)
server = self.get_random_server() server = self.get_random_server()
attachment = self._attach_volume(server, volume) attachment = self._attach_volume(server, volume)
@ -539,16 +538,17 @@ class CreateNestedSnapshotsAndAttachVolume(cinder_utils.CinderScenario,
nes_objs.reverse() nes_objs.reverse()
for server, volume, snapshot, attachment in nes_objs: for server, volume, snapshot, attachment in nes_objs:
self._detach_volume(server, volume, attachment) self._detach_volume(server, volume, attachment)
self._delete_snapshot(snapshot) self.cinder.delete_snapshot(snapshot)
self._delete_volume(volume) self.cinder.delete_volume(volume)
@validation.restricted_parameters(["name", "display_name"])
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_contexts("volumes") @validation.required_contexts("volumes")
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["cinder"]}, @scenario.configure(context={"cleanup": ["cinder"]},
name="CinderVolumes.create_and_list_snapshots") name="CinderVolumes.create_and_list_snapshots")
class CreateAndListSnapshots(cinder_utils.CinderScenario, class CreateAndListSnapshots(cinder_utils.CinderBasic,
nova_utils.NovaScenario, nova_utils.NovaScenario,
glance_utils.GlanceScenario): glance_utils.GlanceScenario):
@ -562,18 +562,18 @@ class CreateAndListSnapshots(cinder_utils.CinderScenario,
:param kwargs: optional args to create a snapshot :param kwargs: optional args to create a snapshot
""" """
volume = random.choice(self.context["tenant"]["volumes"]) volume = random.choice(self.context["tenant"]["volumes"])
self._create_snapshot(volume["id"], force=force, **kwargs) self.cinder.create_snapshot(volume["id"], force=force, **kwargs)
self._list_snapshots(detailed) self.cinder.list_snapshots(detailed)
@types.convert(image={"type": "glance_image"}) @types.convert(image={"type": "glance_image"})
@validation.restricted_parameters(["name", "display_name"])
@validation.required_services(consts.Service.CINDER, consts.Service.GLANCE) @validation.required_services(consts.Service.CINDER, consts.Service.GLANCE)
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@validation.required_parameters("size") @validation.required_parameters("size")
@scenario.configure(context={"cleanup": ["cinder", "glance"]}, @scenario.configure(context={"cleanup": ["cinder", "glance"]},
name="CinderVolumes.create_and_upload_volume_to_image") name="CinderVolumes.create_and_upload_volume_to_image")
class CreateAndUploadVolumeToImage(cinder_utils.CinderScenario, class CreateAndUploadVolumeToImage(cinder_utils.CinderBasic,
nova_utils.NovaScenario,
glance_utils.GlanceScenario): glance_utils.GlanceScenario):
def run(self, size, image=None, force=False, container_format="bare", def run(self, size, image=None, force=False, container_format="bare",
@ -594,23 +594,25 @@ class CreateAndUploadVolumeToImage(cinder_utils.CinderScenario,
""" """
if image: if image:
kwargs["imageRef"] = image kwargs["imageRef"] = image
volume = self._create_volume(size, **kwargs) volume = self.cinder.create_volume(size, **kwargs)
image = self._upload_volume_to_image(volume, force, container_format, image = self.cinder.upload_volume_to_image(
disk_format) volume, force=force, container_format=container_format,
disk_format=disk_format)
if do_delete: if do_delete:
self._delete_volume(volume) self.cinder.delete_volume(volume)
self._delete_image(image) self._delete_image(image)
@validation.restricted_parameters(["name", "display_name"],
subdict="create_volume_kwargs")
@validation.restricted_parameters("name", subdict="create_backup_kwargs")
@validation.required_cinder_services("cinder-backup") @validation.required_cinder_services("cinder-backup")
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["cinder"]}, @scenario.configure(context={"cleanup": ["cinder"]},
name="CinderVolumes.create_volume_backup") name="CinderVolumes.create_volume_backup")
class CreateVolumeBackup(cinder_utils.CinderScenario, class CreateVolumeBackup(cinder_utils.CinderBasic):
nova_utils.NovaScenario,
glance_utils.GlanceScenario):
def run(self, size, do_delete=True, create_volume_kwargs=None, def run(self, size, do_delete=True, create_volume_kwargs=None,
create_backup_kwargs=None): create_backup_kwargs=None):
@ -625,22 +627,23 @@ class CreateVolumeBackup(cinder_utils.CinderScenario,
create_volume_kwargs = create_volume_kwargs or {} create_volume_kwargs = create_volume_kwargs or {}
create_backup_kwargs = create_backup_kwargs or {} create_backup_kwargs = create_backup_kwargs or {}
volume = self._create_volume(size, **create_volume_kwargs) volume = self.cinder.create_volume(size, **create_volume_kwargs)
backup = self._create_backup(volume.id, **create_backup_kwargs) backup = self.cinder.create_backup(volume.id, **create_backup_kwargs)
if do_delete: if do_delete:
self._delete_volume(volume) self.cinder.delete_volume(volume)
self._delete_backup(backup) self.cinder.delete_backup(backup)
@validation.restricted_parameters(["name", "display_name"],
subdict="create_volume_kwargs")
@validation.restricted_parameters("name", subdict="create_backup_kwargs")
@validation.required_cinder_services("cinder-backup") @validation.required_cinder_services("cinder-backup")
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["cinder"]}, @scenario.configure(context={"cleanup": ["cinder"]},
name="CinderVolumes.create_and_restore_volume_backup") name="CinderVolumes.create_and_restore_volume_backup")
class CreateAndRestoreVolumeBackup(cinder_utils.CinderScenario, class CreateAndRestoreVolumeBackup(cinder_utils.CinderBasic):
nova_utils.NovaScenario,
glance_utils.GlanceScenario):
def run(self, size, do_delete=True, create_volume_kwargs=None, def run(self, size, do_delete=True, create_volume_kwargs=None,
create_backup_kwargs=None): create_backup_kwargs=None):
@ -655,23 +658,24 @@ class CreateAndRestoreVolumeBackup(cinder_utils.CinderScenario,
create_volume_kwargs = create_volume_kwargs or {} create_volume_kwargs = create_volume_kwargs or {}
create_backup_kwargs = create_backup_kwargs or {} create_backup_kwargs = create_backup_kwargs or {}
volume = self._create_volume(size, **create_volume_kwargs) volume = self.cinder.create_volume(size, **create_volume_kwargs)
backup = self._create_backup(volume.id, **create_backup_kwargs) backup = self.cinder.create_backup(volume.id, **create_backup_kwargs)
self._restore_backup(backup.id) self.cinder.restore_backup(backup.id)
if do_delete: if do_delete:
self._delete_volume(volume) self.cinder.delete_volume(volume)
self._delete_backup(backup) self.cinder.delete_backup(backup)
@validation.restricted_parameters(["name", "display_name"],
subdict="create_volume_kwargs")
@validation.restricted_parameters("name", subdict="create_backup_kwargs")
@validation.required_cinder_services("cinder-backup") @validation.required_cinder_services("cinder-backup")
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["cinder"]}, @scenario.configure(context={"cleanup": ["cinder"]},
name="CinderVolumes.create_and_list_volume_backups") name="CinderVolumes.create_and_list_volume_backups")
class CreateAndListVolumeBackups(cinder_utils.CinderScenario, class CreateAndListVolumeBackups(cinder_utils.CinderBasic):
nova_utils.NovaScenario,
glance_utils.GlanceScenario):
def run(self, size, detailed=True, do_delete=True, def run(self, size, detailed=True, do_delete=True,
create_volume_kwargs=None, create_backup_kwargs=None): create_volume_kwargs=None, create_backup_kwargs=None):
@ -687,24 +691,23 @@ class CreateAndListVolumeBackups(cinder_utils.CinderScenario,
create_volume_kwargs = create_volume_kwargs or {} create_volume_kwargs = create_volume_kwargs or {}
create_backup_kwargs = create_backup_kwargs or {} create_backup_kwargs = create_backup_kwargs or {}
volume = self._create_volume(size, **create_volume_kwargs) volume = self.cinder.create_volume(size, **create_volume_kwargs)
backup = self._create_backup(volume.id, **create_backup_kwargs) backup = self.cinder.create_backup(volume.id, **create_backup_kwargs)
self._list_backups(detailed) self.cinder.list_backups(detailed)
if do_delete: if do_delete:
self._delete_volume(volume) self.cinder.delete_volume(volume)
self._delete_backup(backup) self.cinder.delete_backup(backup)
@types.convert(image={"type": "glance_image"}) @types.convert(image={"type": "glance_image"})
@validation.restricted_parameters(["name", "display_name"])
@validation.image_exists("image", nullable=True) @validation.image_exists("image", nullable=True)
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["cinder"]}, @scenario.configure(context={"cleanup": ["cinder"]},
name="CinderVolumes.create_volume_and_clone") name="CinderVolumes.create_volume_and_clone")
class CreateVolumeAndClone(cinder_utils.CinderScenario, class CreateVolumeAndClone(cinder_utils.CinderBasic):
nova_utils.NovaScenario,
glance_utils.GlanceScenario):
def run(self, size, image=None, nested_level=1, **kwargs): def run(self, size, image=None, nested_level=1, **kwargs):
"""Create a volume, then clone it to another volume. """Create a volume, then clone it to another volume.
@ -728,24 +731,25 @@ class CreateVolumeAndClone(cinder_utils.CinderScenario,
if image: if image:
kwargs["imageRef"] = image kwargs["imageRef"] = image
source_vol = self._create_volume(size, **kwargs) source_vol = self.cinder.create_volume(size, **kwargs)
kwargs.pop("imageRef", None) kwargs.pop("imageRef", None)
for i in range(nested_level): for i in range(nested_level):
with atomic.ActionTimer(self, "cinder.clone_volume"): with atomic.ActionTimer(self, "cinder.clone_volume"):
source_vol = self._create_volume(source_vol.size, source_vol = self.cinder.create_volume(
source_volid=source_vol.id, source_vol.size, source_volid=source_vol.id,
atomic_action=False, **kwargs) **kwargs)
@validation.restricted_parameters(["name", "display_name"])
@validation.restricted_parameters(["name", "display_name"],
subdict="create_snapshot_kwargs")
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_contexts("volumes") @validation.required_contexts("volumes")
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["cinder"]}, @scenario.configure(context={"cleanup": ["cinder"]},
name="CinderVolumes.create_volume_from_snapshot") name="CinderVolumes.create_volume_from_snapshot")
class CreateVolumeFromSnapshot(cinder_utils.CinderScenario, class CreateVolumeFromSnapshot(cinder_utils.CinderBasic):
nova_utils.NovaScenario,
glance_utils.GlanceScenario):
def run(self, do_delete=True, create_snapshot_kwargs=None, **kwargs): def run(self, do_delete=True, create_snapshot_kwargs=None, **kwargs):
"""Create a volume-snapshot, then create a volume from this snapshot. """Create a volume-snapshot, then create a volume from this snapshot.
@ -758,26 +762,26 @@ class CreateVolumeFromSnapshot(cinder_utils.CinderScenario,
create_snapshot_kwargs = create_snapshot_kwargs or {} create_snapshot_kwargs = create_snapshot_kwargs or {}
src_volume = random.choice(self.context["tenant"]["volumes"]) src_volume = random.choice(self.context["tenant"]["volumes"])
snapshot = self._create_snapshot(src_volume["id"], snapshot = self.cinder.create_snapshot(src_volume["id"],
**create_snapshot_kwargs) **create_snapshot_kwargs)
volume = self._create_volume(src_volume["size"], volume = self.cinder.create_volume(src_volume["size"],
snapshot_id=snapshot.id, snapshot_id=snapshot.id,
**kwargs) **kwargs)
if do_delete: if do_delete:
self._delete_snapshot(snapshot) self.cinder.delete_snapshot(snapshot)
self._delete_volume(volume) self.cinder.delete_volume(volume)
@types.convert(image={"type": "glance_image"}) @types.convert(image={"type": "glance_image"})
@validation.restricted_parameters(["name", "display_name"])
@validation.image_exists("image", nullable=True) @validation.image_exists("image", nullable=True)
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["cinder"]}, @scenario.configure(context={"cleanup": ["cinder"]},
name="CinderVolumes.create_volume_" name="CinderVolumes.create_volume_"
"and_update_readonly_flag") "and_update_readonly_flag")
class CreateVolumeAndUpdateReadonlyFlag(cinder_utils.CinderScenario, class CreateVolumeAndUpdateReadonlyFlag(cinder_utils.CinderBasic):
glance_utils.GlanceScenario):
def run(self, size, image=None, read_only=True, **kwargs): def run(self, size, image=None, read_only=True, **kwargs):
"""Create a volume and then update its readonly flag. """Create a volume and then update its readonly flag.
@ -790,18 +794,18 @@ class CreateVolumeAndUpdateReadonlyFlag(cinder_utils.CinderScenario,
""" """
if image: if image:
kwargs["imageRef"] = image kwargs["imageRef"] = image
volume = self._create_volume(size, **kwargs) volume = self.cinder.create_volume(size, **kwargs)
self._update_readonly_flag(volume.id, read_only) self.cinder.update_readonly_flag(volume.id, read_only=read_only)
@types.convert(image={"type": "glance_image"}) @types.convert(image={"type": "glance_image"})
@validation.restricted_parameters(["name", "display_name"])
@validation.image_exists("image", nullable=True) @validation.image_exists("image", nullable=True)
@validation.required_services(consts.Service.CINDER) @validation.required_services(consts.Service.CINDER)
@validation.required_openstack(users=True) @validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["cinder"]}, @scenario.configure(context={"cleanup": ["cinder"]},
name="CinderVolumes.create_and_accept_transfer") name="CinderVolumes.create_and_accept_transfer")
class CreateAndAcceptTransfer(cinder_utils.CinderScenario, class CreateAndAcceptTransfer(cinder_utils.CinderBasic):
glance_utils.GlanceScenario):
def run(self, size, image=None, **kwargs): def run(self, size, image=None, **kwargs):
"""Create a volume transfer, then accept it """Create a volume transfer, then accept it
@ -814,6 +818,6 @@ class CreateAndAcceptTransfer(cinder_utils.CinderScenario,
""" """
if image: if image:
kwargs["imageRef"] = image kwargs["imageRef"] = image
volume = self._create_volume(size, **kwargs) volume = self.cinder.create_volume(size, **kwargs)
transfer = self._transfer_create(volume.id) transfer = self.cinder.transfer_create(volume.id)
self._transfer_accept(transfer.id, transfer.auth_key) self.cinder.transfer_accept(transfer.id, auth_key=transfer.auth_key)

9
rally/plugins/openstack/scenarios/nova/utils.py Executable file → Normal file
View File

@ -19,6 +19,7 @@ from oslo_config import cfg
from rally import exceptions from rally import exceptions
from rally.plugins.openstack import scenario from rally.plugins.openstack import scenario
from rally.plugins.openstack.scenarios.cinder import utils as cinder_utils
from rally.plugins.openstack.wrappers import glance as glance_wrapper from rally.plugins.openstack.wrappers import glance as glance_wrapper
from rally.plugins.openstack.wrappers import network as network_wrapper from rally.plugins.openstack.wrappers import network as network_wrapper
from rally.task import atomic from rally.task import atomic
@ -713,6 +714,10 @@ class NovaScenario(scenario.OpenStackScenario):
CONF.benchmark.nova_server_resize_revert_poll_interval) CONF.benchmark.nova_server_resize_revert_poll_interval)
) )
def _update_volume_resource(self, resource):
cinder_service = cinder_utils.CinderBasic(self.context)
return cinder_service.cinder.get_volume(resource.id)
@atomic.action_timer("nova.attach_volume") @atomic.action_timer("nova.attach_volume")
def _attach_volume(self, server, volume, device=None): def _attach_volume(self, server, volume, device=None):
server_id = server.id server_id = server.id
@ -722,7 +727,7 @@ class NovaScenario(scenario.OpenStackScenario):
utils.wait_for_status( utils.wait_for_status(
volume, volume,
ready_statuses=["in-use"], ready_statuses=["in-use"],
update_resource=utils.get_from_manager(), update_resource=self._update_volume_resource,
timeout=CONF.benchmark.nova_server_resize_revert_timeout, timeout=CONF.benchmark.nova_server_resize_revert_timeout,
check_interval=( check_interval=(
CONF.benchmark.nova_server_resize_revert_poll_interval) CONF.benchmark.nova_server_resize_revert_poll_interval)
@ -741,7 +746,7 @@ class NovaScenario(scenario.OpenStackScenario):
utils.wait_for_status( utils.wait_for_status(
volume, volume,
ready_statuses=["available"], ready_statuses=["available"],
update_resource=utils.get_from_manager(), update_resource=self._update_volume_resource,
timeout=CONF.benchmark.nova_detach_volume_timeout, timeout=CONF.benchmark.nova_detach_volume_timeout,
check_interval=CONF.benchmark.nova_detach_volume_poll_interval check_interval=CONF.benchmark.nova_detach_volume_poll_interval
) )

View File

@ -43,13 +43,16 @@ CONF = cfg.CONF
benchmark_group = cfg.OptGroup(name="benchmark", title="benchmark options") benchmark_group = cfg.OptGroup(name="benchmark", title="benchmark options")
CONF.register_opts(CINDER_BENCHMARK_OPTS, group=benchmark_group) CONF.register_opts(CINDER_BENCHMARK_OPTS, group=benchmark_group)
Volume = collections.namedtuple("Volume", ["id", "name", "size"]) Volume = collections.namedtuple("Volume", ["id", "name", "size", "status"])
VolumeSnapshot = collections.namedtuple("VolumeSnapshot", ["id", "name", VolumeSnapshot = collections.namedtuple("VolumeSnapshot", ["id", "name",
"volume_id"]) "volume_id",
"status"])
VolumeBackup = collections.namedtuple("VolumeBackup", ["id", "name", VolumeBackup = collections.namedtuple("VolumeBackup", ["id", "name",
"volume_id"]) "volume_id",
"status"])
VolumeTransfer = collections.namedtuple("VolumeTransfer", ["id", "name", VolumeTransfer = collections.namedtuple("VolumeTransfer", ["id", "name",
"volume_id"]) "volume_id",
"auth_key"])
VolumeEncryptionType = collections.namedtuple("VolumeEncryptionType", VolumeEncryptionType = collections.namedtuple("VolumeEncryptionType",
["id", "volume_type_id"]) ["id", "volume_type_id"])
@ -305,6 +308,15 @@ class BlockStorage(service.UnifiedOpenStackService):
description=description, description=description,
is_public=is_public) is_public=is_public)
@service.should_be_overridden
def get_volume_type(self, volume_type):
"""get details of volume_type.
:param volume_type: The ID of the :class:`VolumeType` to get
:returns: :class:`VolumeType`
"""
return self._impl.get_volume_type(volume_type)
@service.should_be_overridden @service.should_be_overridden
def delete_volume_type(self, volume_type): def delete_volume_type(self, volume_type):
"""delete a volume type. """delete a volume type.

View File

@ -28,11 +28,30 @@ class CinderMixin(object):
def _get_client(self): def _get_client(self):
return self._clients.cinder(self.version) return self._clients.cinder(self.version)
def _update_resource(self, resource):
try:
manager = getattr(resource, "manager", None)
if manager:
res = manager.get(resource.id)
else:
if isinstance(resource, block.Volume):
attr = "volumes"
elif isinstance(resource, block.VolumeSnapshot):
attr = "volume_snapshots"
elif isinstance(resource, block.VolumeBackup):
attr = "backups"
res = getattr(self._get_client(), attr).get(resource.id)
except Exception as e:
if getattr(e, "code", getattr(e, "http_status", 400)) == 404:
raise exceptions.GetResourceNotFound(resource=resource)
raise exceptions.GetResourceFailure(resource=resource, err=e)
return res
def _wait_available_volume(self, volume): def _wait_available_volume(self, volume):
return bench_utils.wait_for_status( return bench_utils.wait_for_status(
volume, volume,
ready_statuses=["available"], ready_statuses=["available"],
update_resource=bench_utils.get_from_manager(), update_resource=self._update_resource,
timeout=CONF.benchmark.cinder_volume_create_timeout, timeout=CONF.benchmark.cinder_volume_create_timeout,
check_interval=CONF.benchmark.cinder_volume_create_poll_interval check_interval=CONF.benchmark.cinder_volume_create_poll_interval
) )
@ -58,7 +77,7 @@ class CinderMixin(object):
volume, volume,
ready_statuses=["deleted"], ready_statuses=["deleted"],
check_deletion=True, check_deletion=True,
update_resource=bench_utils.get_from_manager(), update_resource=self._update_resource,
timeout=CONF.benchmark.cinder_volume_delete_timeout, timeout=CONF.benchmark.cinder_volume_delete_timeout,
check_interval=(CONF.benchmark check_interval=(CONF.benchmark
.cinder_volume_delete_poll_interval) .cinder_volume_delete_poll_interval)
@ -72,7 +91,7 @@ class CinderMixin(object):
aname = "cinder_v%s.extend_volume" % self.version aname = "cinder_v%s.extend_volume" % self.version
with atomic.ActionTimer(self, aname): with atomic.ActionTimer(self, aname):
self._get_client().volumes.extend(volume, new_size) self._get_client().volumes.extend(volume, new_size)
self._wait_available_volume(volume) return self._wait_available_volume(volume)
def list_snapshots(self, detailed=True): def list_snapshots(self, detailed=True):
"""Get a list of all snapshots.""" """Get a list of all snapshots."""
@ -199,7 +218,7 @@ class CinderMixin(object):
snapshot, snapshot,
ready_statuses=["deleted"], ready_statuses=["deleted"],
check_deletion=True, check_deletion=True,
update_resource=bench_utils.get_from_manager(), update_resource=self._update_resource,
timeout=CONF.benchmark.cinder_volume_delete_timeout, timeout=CONF.benchmark.cinder_volume_delete_timeout,
check_interval=(CONF.benchmark check_interval=(CONF.benchmark
.cinder_volume_delete_poll_interval) .cinder_volume_delete_poll_interval)
@ -219,7 +238,7 @@ class CinderMixin(object):
backup, backup,
ready_statuses=["deleted"], ready_statuses=["deleted"],
check_deletion=True, check_deletion=True,
update_resource=bench_utils.get_from_manager(), update_resource=self._update_resource,
timeout=CONF.benchmark.cinder_volume_delete_timeout, timeout=CONF.benchmark.cinder_volume_delete_timeout,
check_interval=(CONF.benchmark check_interval=(CONF.benchmark
.cinder_volume_delete_poll_interval) .cinder_volume_delete_poll_interval)
@ -259,6 +278,16 @@ class CinderMixin(object):
with atomic.ActionTimer(self, aname): with atomic.ActionTimer(self, aname):
return self._get_client().transfers.list(detailed, search_opts) return self._get_client().transfers.list(detailed, search_opts)
def get_volume_type(self, volume_type):
"""get details of volume_type.
:param volume_type: The ID of the :class:`VolumeType` to get
:returns: :class:`VolumeType`
"""
aname = "cinder_v%s.get_volume_type" % self.version
with atomic.ActionTimer(self, aname):
return self._get_client().volume_types.get(volume_type)
def delete_volume_type(self, volume_type): def delete_volume_type(self, volume_type):
"""delete a volume type. """delete a volume type.
@ -348,12 +377,15 @@ class UnifiedCinderMixin(object):
@staticmethod @staticmethod
def _unify_backup(backup): def _unify_backup(backup):
return block.VolumeBackup(id=backup.id, name=backup.name, return block.VolumeBackup(id=backup.id, name=backup.name,
volume_id=backup.volume_id) volume_id=backup.volume_id,
status=backup.status)
@staticmethod @staticmethod
def _unify_transfer(transfer): def _unify_transfer(transfer):
auth_key = transfer.auth_key if hasattr(transfer, "auth_key") else None
return block.VolumeTransfer(id=transfer.id, name=transfer.name, return block.VolumeTransfer(id=transfer.id, name=transfer.name,
volume_id=transfer.volume_id) volume_id=transfer.volume_id,
auth_key=auth_key)
@staticmethod @staticmethod
def _unify_encryption_type(encryption_type): def _unify_encryption_type(encryption_type):
@ -431,17 +463,6 @@ class UnifiedCinderMixin(object):
"""Delete a volume backup.""" """Delete a volume backup."""
self._impl.delete_backup(backup) self._impl.delete_backup(backup)
def restore_backup(self, backup_id, volume_id=None):
"""Restore the given backup.
:param backup_id: The ID of the backup to restore.
:param volume_id: The ID of the volume to restore the backup to.
:returns: Return the restored backup.
"""
return self._unify_backup(self._impl.restore_backup(
backup_id, volume_id=volume_id))
def list_backups(self, detailed=True): def list_backups(self, detailed=True):
"""Return user volume backups list.""" """Return user volume backups list."""
return [self._unify_backup(backup) return [self._unify_backup(backup)
@ -459,6 +480,14 @@ class UnifiedCinderMixin(object):
for transfer in self._impl.list_transfers( for transfer in self._impl.list_transfers(
detailed=detailed, search_opts=search_opts)] detailed=detailed, search_opts=search_opts)]
def get_volume_type(self, volume_type):
"""get details of volume_type.
:param volume_type: The ID of the :class:`VolumeType` to get
:returns: :class:`VolumeType`
"""
return self._impl.get_volume_type(volume_type)
def delete_volume_type(self, volume_type): def delete_volume_type(self, volume_type):
"""delete a volume type. """delete a volume type.

View File

@ -81,10 +81,14 @@ class CinderV1Service(service.Service, cinder_common.CinderMixin):
:returns: The updated volume. :returns: The updated volume.
""" """
display_name = display_name or self.generate_random_name() kwargs = {}
return self._get_client().volumes.update( if display_name is not None:
volume_id, display_name=display_name, kwargs["display_name"] = display_name
display_description=display_description) if display_description is not None:
kwargs["display_description"] = display_description
updated_volume = self._get_client().volumes.update(
volume_id, **kwargs)
return updated_volume["volume"]
@atomic.action_timer("cinder_v1.list_types") @atomic.action_timer("cinder_v1.list_types")
def list_types(self, search_opts=None): def list_types(self, search_opts=None):
@ -151,13 +155,18 @@ class UnifiedCinderV1Service(cinder_common.UnifiedCinderMixin,
@staticmethod @staticmethod
def _unify_volume(volume): def _unify_volume(volume):
return block.Volume(id=volume.id, name=volume.display_name, if isinstance(volume, dict):
size=volume.size) return block.Volume(id=volume["id"], name=volume["display_name"],
size=volume["size"], status=volume["status"])
else:
return block.Volume(id=volume.id, name=volume.display_name,
size=volume.size, status=volume.status)
@staticmethod @staticmethod
def _unify_snapshot(snapshot): def _unify_snapshot(snapshot):
return block.VolumeSnapshot(id=snapshot.id, name=snapshot.display_name, return block.VolumeSnapshot(id=snapshot.id, name=snapshot.display_name,
volume_id=snapshot.volume_id) volume_id=snapshot.volume_id,
status=snapshot.status)
def create_volume(self, size, consistencygroup_id=None, def create_volume(self, size, consistencygroup_id=None,
group_id=None, snapshot_id=None, source_volid=None, group_id=None, snapshot_id=None, source_volid=None,
@ -291,3 +300,14 @@ class UnifiedCinderV1Service(cinder_common.UnifiedCinderMixin,
:returns: Return the created volume type. :returns: Return the created volume type.
""" """
return self._impl.create_volume_type(name=name) return self._impl.create_volume_type(name=name)
def restore_backup(self, backup_id, volume_id=None):
"""Restore the given backup.
:param backup_id: The ID of the backup to restore.
:param volume_id: The ID of the volume to restore the backup to.
:returns: Return the restored backup.
"""
return self._unify_volume(self._impl.restore_backup(
backup_id, volume_id=volume_id))

View File

@ -92,9 +92,14 @@ class CinderV2Service(service.Service, cinder_common.CinderMixin):
:returns: The updated volume. :returns: The updated volume.
""" """
return self._get_client().volumes.update( kwargs = {}
volume_id, name=name or self.generate_random_name(), if name is not None:
description=description) kwargs["name"] = name
if description is not None:
kwargs["description"] = description
updated_volume = self._get_client().volumes.update(
volume_id, **kwargs)
return updated_volume["volume"]
@atomic.action_timer("cinder_v2.list_types") @atomic.action_timer("cinder_v2.list_types")
def list_types(self, search_opts=None, is_public=None): def list_types(self, search_opts=None, is_public=None):
@ -177,13 +182,18 @@ class UnifiedCinderV2Service(cinder_common.UnifiedCinderMixin,
@staticmethod @staticmethod
def _unify_volume(volume): def _unify_volume(volume):
return block.Volume(id=volume.id, name=volume.name, if isinstance(volume, dict):
size=volume.size) return block.Volume(id=volume["id"], name=volume["name"],
size=volume["size"], status=volume["status"])
else:
return block.Volume(id=volume.id, name=volume.name,
size=volume.size, status=volume.status)
@staticmethod @staticmethod
def _unify_snapshot(snapshot): def _unify_snapshot(snapshot):
return block.VolumeSnapshot(id=snapshot.id, name=snapshot.name, return block.VolumeSnapshot(id=snapshot.id, name=snapshot.name,
volume_id=snapshot.volume_id) volume_id=snapshot.volume_id,
status=snapshot.status)
def create_volume(self, size, consistencygroup_id=None, def create_volume(self, size, consistencygroup_id=None,
group_id=None, snapshot_id=None, source_volid=None, group_id=None, snapshot_id=None, source_volid=None,
@ -321,3 +331,14 @@ class UnifiedCinderV2Service(cinder_common.UnifiedCinderMixin,
return self._impl.create_volume_type(name=name, return self._impl.create_volume_type(name=name,
description=description, description=description,
is_public=is_public) is_public=is_public)
def restore_backup(self, backup_id, volume_id=None):
"""Restore the given backup.
:param backup_id: The ID of the backup to restore.
:param volume_id: The ID of the volume to restore the backup to.
:returns: Return the restored backup.
"""
return self._unify_volume(self._impl.restore_backup(
backup_id, volume_id=volume_id))

View File

@ -4,8 +4,7 @@
"args": { "args": {
"create_volume_kwargs": {}, "create_volume_kwargs": {},
"update_volume_kwargs": { "update_volume_kwargs": {
"display_name": "name_updated", "description": "desc_updated"
"display_description": "desc_updated"
}, },
"size": 1 "size": 1
}, },

View File

@ -3,8 +3,7 @@
- -
args: args:
update_volume_kwargs: update_volume_kwargs:
display_name: "name_updated" description: "desc_updated"
display_description: "desc_updated"
create_volume_kwargs: {} create_volume_kwargs: {}
size: 1 size: 1
runner: runner:

View File

@ -3,7 +3,6 @@
"CinderVolumes.create_snapshot_and_attach_volume": [ "CinderVolumes.create_snapshot_and_attach_volume": [
{ {
"args": { "args": {
"volume_type": false,
"size": { "size": {
"min": 1, "min": 1,
"max": 5 "max": 5
@ -32,7 +31,7 @@
}, },
{ {
"args": { "args": {
"volume_type": true, "volume_type": "test",
"size": { "size": {
"min": 1, "min": 1,
"max": 5 "max": 5
@ -56,7 +55,8 @@
"name": "{{flavor_name}}" "name": "{{flavor_name}}"
}, },
"servers_per_tenant": 2 "servers_per_tenant": 2
} },
"volume_types": ["test"]
} }
} }

View File

@ -3,7 +3,6 @@
CinderVolumes.create_snapshot_and_attach_volume: CinderVolumes.create_snapshot_and_attach_volume:
- -
args: args:
volume_type: false
size: size:
min: 1 min: 1
max: 5 max: 5
@ -23,7 +22,7 @@
servers_per_tenant: 2 servers_per_tenant: 2
- -
args: args:
volume_type: true volume_type: "test"
size: size:
min: 1 min: 1
max: 5 max: 5
@ -41,4 +40,5 @@
flavor: flavor:
name: "{{flavor_name}}" name: "{{flavor_name}}"
servers_per_tenant: 2 servers_per_tenant: 2
volume_types:
- "test"

View File

@ -26,6 +26,35 @@ CINDER_UTILS = "rally.plugins.openstack.scenarios.cinder.utils"
CONF = cfg.CONF CONF = cfg.CONF
class CinderBasicTestCase(test.ScenarioTestCase):
def _get_context(self):
context = test.get_test_context()
context.update({
"admin": {
"id": "fake_user_id",
"credential": mock.MagicMock()
},
"user": {"id": "fake_user_id",
"credential": mock.MagicMock()},
"tenant": {"id": "fake", "name": "fake",
"volumes": [{"id": "uuid", "size": 1}],
"servers": [1]}})
return context
def setUp(self):
super(CinderBasicTestCase, self).setUp()
@mock.patch("random.choice")
def test_get_random_server(self, mock_choice):
basic = utils.CinderBasic(self._get_context())
server_id = mock_choice(basic.context["tenant"]["servers"])
return_server = basic.get_random_server()
basic.clients("nova").servers.get.assert_called_once_with(server_id)
self.assertEqual(basic.clients("nova").servers.get.return_value,
return_server)
class CinderScenarioTestCase(test.ScenarioTestCase): class CinderScenarioTestCase(test.ScenarioTestCase):
def setUp(self): def setUp(self):

View File

@ -20,14 +20,29 @@ from tests.unit import test
class CinderBackupTestCase(test.ScenarioTestCase): class CinderBackupTestCase(test.ScenarioTestCase):
def setUp(self):
super(CinderBackupTestCase, self).setUp()
patch = mock.patch(
"rally.plugins.openstack.services.storage.block.BlockStorage")
self.addCleanup(patch.stop)
self.mock_cinder = patch.start()
def _get_context(self):
context = test.get_test_context()
context.update({
"admin": {
"id": "fake_user_id",
"credential": mock.MagicMock()
},
"user": {"id": "fake_user_id",
"credential": mock.MagicMock()},
"tenant": {"id": "fake", "name": "fake"}})
return context
def test_create_incremental_volume_backup(self): def test_create_incremental_volume_backup(self):
fake_volume = mock.MagicMock() mock_service = self.mock_cinder.return_value
fake_backup = mock.MagicMock() scenario = volume_backups.CreateIncrementalVolumeBackup(
scenario = volume_backups.CreateIncrementalVolumeBackup(self.context) self._get_context())
scenario._create_volume = mock.MagicMock(return_value=fake_volume)
scenario._create_backup = mock.MagicMock(return_value=fake_backup)
scenario._delete_volume = mock.MagicMock()
scenario._delete_backup = mock.MagicMock()
volume_kwargs = {"some_var": "zaq"} volume_kwargs = {"some_var": "zaq"}
backup_kwargs = {"incremental": True} backup_kwargs = {"incremental": True}
@ -35,7 +50,9 @@ class CinderBackupTestCase(test.ScenarioTestCase):
scenario.run(1, do_delete=True, create_volume_kwargs=volume_kwargs, scenario.run(1, do_delete=True, create_volume_kwargs=volume_kwargs,
create_backup_kwargs=backup_kwargs) create_backup_kwargs=backup_kwargs)
self.assertEqual(2, scenario._create_backup.call_count) self.assertEqual(2, mock_service.create_backup.call_count)
scenario._create_volume.assert_called_once_with(1, **volume_kwargs) mock_service.create_volume.assert_called_once_with(1, **volume_kwargs)
scenario._delete_backup.assert_has_calls(fake_backup) mock_service.delete_backup.assert_has_calls(
scenario._delete_volume.assert_called_once_with(fake_volume) mock_service.create_backup.return_value)
mock_service.delete_volume.assert_called_once_with(
mock_service.create_volume.return_value)

View File

@ -18,85 +18,91 @@ from rally.plugins.openstack.scenarios.cinder import volume_types
from tests.unit import test from tests.unit import test
class fake_type(object):
name = "fake"
class CinderVolumeTypesTestCase(test.ScenarioTestCase): class CinderVolumeTypesTestCase(test.ScenarioTestCase):
def setUp(self):
super(CinderVolumeTypesTestCase, self).setUp()
patch = mock.patch(
"rally.plugins.openstack.services.storage.block.BlockStorage")
self.addCleanup(patch.stop)
self.mock_cinder = patch.start()
def _get_context(self): def _get_context(self):
context = test.get_test_context() context = test.get_test_context()
context.update({ context.update({
"volume_types": [{"id": "fake_id", "admin": {
"name": "fake_name"}]}) "id": "fake_user_id",
"credential": mock.MagicMock()
},
"user": {"id": "fake_user_id",
"credential": mock.MagicMock()},
"tenant": {"id": "fake", "name": "fake"}})
return context return context
def test_create_and_get_volume_type(self): def test_create_and_get_volume_type(self):
scenario = volume_types.CreateAndGetVolumeType(self.context) mock_service = self.mock_cinder.return_value
scenario._create_volume_type = mock.Mock() scenario = volume_types.CreateAndGetVolumeType(self._get_context())
scenario._get_volume_type = mock.Mock()
scenario.run(fakeargs="f") scenario.run(fakeargs="f")
scenario._create_volume_type.assert_called_once_with(fakeargs="f") mock_service.create_volume_type.assert_called_once_with(fakeargs="f")
scenario._get_volume_type.assert_called_once_with( mock_service.get_volume_type.assert_called_once_with(
scenario._create_volume_type.return_value) mock_service.create_volume_type.return_value)
def test_create_and_delete_volume_type(self): def test_create_and_delete_volume_type(self):
scenario = volume_types.CreateAndDeleteVolumeType(self.context) mock_service = self.mock_cinder.return_value
scenario._create_volume_type = mock.Mock() scenario = volume_types.CreateAndDeleteVolumeType(self._get_context())
scenario._delete_volume_type = mock.Mock()
scenario.run(fakeargs="fakeargs") scenario.run(fakeargs="fakeargs")
scenario._create_volume_type.assert_called_once_with( mock_service.create_volume_type.assert_called_once_with(
fakeargs="fakeargs") fakeargs="fakeargs")
scenario._delete_volume_type.assert_called_once_with( mock_service.delete_volume_type.assert_called_once_with(
scenario._create_volume_type.return_value) mock_service.create_volume_type.return_value)
def test_create_and_delete_encryption_type(self): def test_create_and_delete_encryption_type(self):
scenario = volume_types.CreateAndDeleteEncryptionType( mock_service = self.mock_cinder.return_value
self._get_context()) context = self._get_context()
scenario._create_encryption_type = mock.Mock() context.update({
scenario._delete_encryption_type = mock.Mock() "volume_types": [{"id": "fake_id",
"name": "fake_name"}]})
scenario = volume_types.CreateAndDeleteEncryptionType(context)
scenario.run(create_specs="fakecreatespecs") scenario.run(create_specs="fakecreatespecs")
scenario._create_encryption_type.assert_called_once_with( mock_service.create_encryption_type.assert_called_once_with(
"fake_id", "fakecreatespecs") "fake_id", specs="fakecreatespecs")
scenario._delete_encryption_type.assert_called_once_with( mock_service.delete_encryption_type.assert_called_once_with(
"fake_id") "fake_id")
def test_create_volume_type_and_encryption_type(self): def test_create_volume_type_and_encryption_type(self):
scenario = volume_types.CreateVolumeTypeAndEncryptionType(self.context) mock_service = self.mock_cinder.return_value
scenario._create_volume_type = mock.Mock() scenario = volume_types.CreateVolumeTypeAndEncryptionType(
scenario._create_encryption_type = mock.Mock() self._get_context())
scenario.run(specs="fakespecs", fakeargs="fakeargs") scenario.run(specs="fakespecs", fakeargs="fakeargs")
scenario._create_volume_type.assert_called_once_with( mock_service.create_volume_type.assert_called_once_with(
fakeargs="fakeargs") fakeargs="fakeargs")
scenario._create_encryption_type.assert_called_once_with( mock_service.create_encryption_type.assert_called_once_with(
scenario._create_volume_type.return_value, "fakespecs") mock_service.create_volume_type.return_value,
specs="fakespecs")
def test_create_and_list_encryption_type(self): def test_create_and_list_encryption_type(self):
scenario = volume_types.CreateAndListEncryptionType(self.context) mock_service = self.mock_cinder.return_value
scenario._create_volume_type = mock.Mock() scenario = volume_types.CreateAndListEncryptionType(
scenario._create_encryption_type = mock.Mock() self._get_context())
scenario._list_encryption_type = mock.Mock()
scenario.run(specs="fakespecs", search_opts="fakeopts", scenario.run(specs="fakespecs", search_opts="fakeopts",
fakeargs="fakeargs") fakeargs="fakeargs")
scenario._create_volume_type.assert_called_once_with( mock_service.create_volume_type.assert_called_once_with(
fakeargs="fakeargs") fakeargs="fakeargs")
scenario._create_encryption_type.assert_called_once_with( mock_service.create_encryption_type.assert_called_once_with(
scenario._create_volume_type.return_value, "fakespecs") mock_service.create_volume_type.return_value,
scenario._list_encryption_type.assert_called_once_with( specs="fakespecs")
mock_service.list_encryption_type.assert_called_once_with(
"fakeopts") "fakeopts")
def test_create_and_set_volume_type_keys(self): def test_create_and_set_volume_type_keys(self):
scenario = volume_types.CreateAndSetVolumeTypeKeys(self.context) mock_service = self.mock_cinder.return_value
volume_type = mock.MagicMock()
volume_type_key = {"volume_backend_name": "LVM_iSCSI"} volume_type_key = {"volume_backend_name": "LVM_iSCSI"}
scenario._create_volume_type = mock.MagicMock() scenario = volume_types.CreateAndSetVolumeTypeKeys(
scenario._set_volume_type_keys = mock.MagicMock() self._get_context())
scenario._create_volume_type.return_value = volume_type
scenario.run(volume_type_key, fakeargs="fakeargs") scenario.run(volume_type_key, fakeargs="fakeargs")
scenario._create_volume_type.assert_called_once_with( mock_service.create_volume_type.assert_called_once_with(
fakeargs="fakeargs") fakeargs="fakeargs")
scenario._set_volume_type_keys.assert_called_once_with(volume_type, mock_service.set_volume_type_keys.assert_called_once_with(
volume_type_key) mock_service.create_volume_type.return_value,
metadata=volume_type_key)

File diff suppressed because it is too large Load Diff

View File

View File

View File

@ -37,8 +37,8 @@ class NovaScenarioTestCase(test.ScenarioTestCase):
self.volume = mock.Mock() self.volume = mock.Mock()
self.floating_ip = mock.Mock() self.floating_ip = mock.Mock()
self.image = mock.Mock() self.image = mock.Mock()
self.context["iteration"] = 3 self.context.update(
self.context["config"] = {"users": {"tenants": 2}} {"user": {"id": "fake_user_id", "credential": mock.MagicMock()}})
def _context_with_networks(self, networks): def _context_with_networks(self, networks):
retval = {"tenant": {"networks": networks}} retval = {"tenant": {"networks": networks}}
@ -596,6 +596,15 @@ class NovaScenarioTestCase(test.ScenarioTestCase):
self._test_atomic_action_timer(nova_scenario.atomic_actions(), self._test_atomic_action_timer(nova_scenario.atomic_actions(),
"nova.resize_revert") "nova.resize_revert")
@mock.patch("rally.plugins.openstack.services.storage.block.BlockStorage")
def test__update_volume_resource(self, mock_block_storage):
volume = fakes.FakeVolume(id=1)
cinder = mock_block_storage.return_value
cinder.get_volume = mock.MagicMock()
nova_scenario = utils.NovaScenario(context=self.context)
self.assertEqual(cinder.get_volume.return_value,
nova_scenario._update_volume_resource(volume))
def test__attach_volume(self): def test__attach_volume(self):
expect_attach = mock.MagicMock() expect_attach = mock.MagicMock()
device = None device = None

View File

@ -167,6 +167,13 @@ class BlockTestCase(test.TestCase):
self.service._impl.create_volume_type.assert_called_once_with( self.service._impl.create_volume_type.assert_called_once_with(
name="type", description=None, is_public=True) name="type", description=None, is_public=True)
def test_get_volume_type(self):
self.assertEqual(
self.service._impl.get_volume_type.return_value,
self.service.get_volume_type("volume_type"))
self.service._impl.get_volume_type.assert_called_once_with(
"volume_type")
def test_delete_volume_type(self): def test_delete_volume_type(self):
self.service.delete_volume_type("volume_type") self.service.delete_volume_type("volume_type")
self.service._impl.delete_volume_type.assert_called_once_with( self.service._impl.delete_volume_type.assert_called_once_with(

View File

@ -14,11 +14,13 @@
import uuid import uuid
import ddt
import mock import mock
from oslo_config import cfg from oslo_config import cfg
from rally import exceptions from rally import exceptions
from rally.plugins.openstack import service from rally.plugins.openstack import service
from rally.plugins.openstack.services.storage import block
from rally.plugins.openstack.services.storage import cinder_common from rally.plugins.openstack.services.storage import cinder_common
from tests.unit import fakes from tests.unit import fakes
from tests.unit import test from tests.unit import test
@ -32,6 +34,7 @@ class FullCinder(service.Service, cinder_common.CinderMixin):
pass pass
@ddt.ddt
class CinderMixinTestCase(test.ScenarioTestCase): class CinderMixinTestCase(test.ScenarioTestCase):
def setUp(self): def setUp(self):
super(CinderMixinTestCase, self).setUp() super(CinderMixinTestCase, self).setUp()
@ -50,20 +53,63 @@ class CinderMixinTestCase(test.ScenarioTestCase):
self.assertEqual(self.cinder, self.assertEqual(self.cinder,
self.service._get_client()) self.service._get_client())
def test__update_resource_with_manage(self):
resource = mock.MagicMock(id=1, manager=mock.MagicMock())
self.assertEqual(resource.manager.get.return_value,
self.service._update_resource(resource))
resource.manager.get.assert_called_once_with(
resource.id)
@ddt.data({"resource": block.Volume(id=1, name="vol",
size=1, status="st"),
"attr": "volumes"},
{"resource": block.VolumeSnapshot(id=2, name="snapshot",
volume_id=1, status="st"),
"attr": "volume_snapshots"},
{"resource": block.VolumeBackup(id=3, name="backup",
volume_id=1, status="st"),
"attr": "backups"})
@ddt.unpack
def test__update_resource_with_no_manage(self, resource, attr):
self.assertEqual(getattr(self.cinder, attr).get.return_value,
self.service._update_resource(resource))
getattr(self.cinder, attr).get.assert_called_once_with(
resource.id)
def test__update_resource_with_not_found(self):
manager = mock.MagicMock()
resource = fakes.FakeResource(manager=manager, status="ERROR")
class NotFoundException(Exception):
http_status = 404
manager.get = mock.MagicMock(side_effect=NotFoundException)
self.assertRaises(exceptions.GetResourceNotFound,
self.service._update_resource, resource)
def test__update_resource_with_http_exception(self):
manager = mock.MagicMock()
resource = fakes.FakeResource(manager=manager, status="ERROR")
class HTTPException(Exception):
pass
manager.get = mock.MagicMock(side_effect=HTTPException)
self.assertRaises(exceptions.GetResourceFailure,
self.service._update_resource, resource)
def test__wait_available_volume(self): def test__wait_available_volume(self):
volume = fakes.FakeVolume() volume = fakes.FakeVolume()
return_volume = self.service._wait_available_volume(volume) self.assertEqual(self.mock_wait_for_status.mock.return_value,
self.service._wait_available_volume(volume))
self.mock_get_from_manager.mock.assert_called_once_with()
self.mock_wait_for_status.mock.assert_called_once_with( self.mock_wait_for_status.mock.assert_called_once_with(
volume, volume,
ready_statuses=["available"], ready_statuses=["available"],
update_resource=self.mock_get_from_manager.mock.return_value, update_resource=self.service._update_resource,
timeout=CONF.benchmark.cinder_volume_create_timeout, timeout=CONF.benchmark.cinder_volume_create_timeout,
check_interval=CONF.benchmark.cinder_volume_create_poll_interval check_interval=CONF.benchmark.cinder_volume_create_poll_interval
) )
self.assertEqual(self.mock_wait_for_status.mock.return_value,
return_volume)
def test_list_volumes(self): def test_list_volumes(self):
self.assertEqual(self.cinder.volumes.list.return_value, self.assertEqual(self.cinder.volumes.list.return_value,
@ -81,12 +127,11 @@ class CinderMixinTestCase(test.ScenarioTestCase):
self.service.delete_volume(volume) self.service.delete_volume(volume)
self.cinder.volumes.delete.assert_called_once_with(volume) self.cinder.volumes.delete.assert_called_once_with(volume)
self.mock_get_from_manager.mock.assert_called_once_with()
self.mock_wait_for_status.mock.assert_called_once_with( self.mock_wait_for_status.mock.assert_called_once_with(
volume, volume,
ready_statuses=["deleted"], ready_statuses=["deleted"],
check_deletion=True, check_deletion=True,
update_resource=self.mock_get_from_manager.mock.return_value, update_resource=self.service._update_resource,
timeout=CONF.benchmark.cinder_volume_delete_timeout, timeout=CONF.benchmark.cinder_volume_delete_timeout,
check_interval=CONF.benchmark.cinder_volume_delete_poll_interval check_interval=CONF.benchmark.cinder_volume_delete_poll_interval
) )
@ -97,7 +142,8 @@ class CinderMixinTestCase(test.ScenarioTestCase):
self.service._wait_available_volume = mock.MagicMock() self.service._wait_available_volume = mock.MagicMock()
self.service._wait_available_volume.return_value = fakes.FakeVolume() self.service._wait_available_volume.return_value = fakes.FakeVolume()
self.service.extend_volume(volume, 1) self.assertEqual(self.service._wait_available_volume.return_value,
self.service.extend_volume(volume, 1))
self.cinder.volumes.extend.assert_called_once_with(volume, 1) self.cinder.volumes.extend.assert_called_once_with(volume, 1)
self.service._wait_available_volume.assert_called_once_with(volume) self.service._wait_available_volume.assert_called_once_with(volume)
@ -168,7 +214,7 @@ class CinderMixinTestCase(test.ScenarioTestCase):
mock.call( mock.call(
volume, volume,
ready_statuses=["available"], ready_statuses=["available"],
update_resource=self.mock_get_from_manager.mock.return_value, update_resource=self.service._update_resource,
timeout=CONF.benchmark.cinder_volume_create_timeout, timeout=CONF.benchmark.cinder_volume_create_timeout,
check_interval=CONF.benchmark. check_interval=CONF.benchmark.
cinder_volume_create_poll_interval), cinder_volume_create_poll_interval),
@ -180,7 +226,6 @@ class CinderMixinTestCase(test.ScenarioTestCase):
check_interval=CONF.benchmark. check_interval=CONF.benchmark.
glance_image_create_poll_interval) glance_image_create_poll_interval)
]) ])
self.mock_get_from_manager.mock.assert_called_once_with()
glance_client.images.get.assert_called_once_with(1) glance_client.images.get.assert_called_once_with(1)
def test_delete_snapshot(self): def test_delete_snapshot(self):
@ -191,11 +236,10 @@ class CinderMixinTestCase(test.ScenarioTestCase):
snapshot, snapshot,
ready_statuses=["deleted"], ready_statuses=["deleted"],
check_deletion=True, check_deletion=True,
update_resource=self.mock_get_from_manager.mock.return_value, update_resource=self.service._update_resource,
timeout=cfg.CONF.benchmark.cinder_volume_create_timeout, timeout=cfg.CONF.benchmark.cinder_volume_create_timeout,
check_interval=cfg.CONF.benchmark check_interval=cfg.CONF.benchmark
.cinder_volume_create_poll_interval) .cinder_volume_create_poll_interval)
self.mock_get_from_manager.mock.assert_called_once_with()
def test_delete_backup(self): def test_delete_backup(self):
backup = mock.Mock() backup = mock.Mock()
@ -205,11 +249,10 @@ class CinderMixinTestCase(test.ScenarioTestCase):
backup, backup,
ready_statuses=["deleted"], ready_statuses=["deleted"],
check_deletion=True, check_deletion=True,
update_resource=self.mock_get_from_manager.mock.return_value, update_resource=self.service._update_resource,
timeout=cfg.CONF.benchmark.cinder_volume_create_timeout, timeout=cfg.CONF.benchmark.cinder_volume_create_timeout,
check_interval=cfg.CONF.benchmark check_interval=cfg.CONF.benchmark
.cinder_volume_create_poll_interval) .cinder_volume_create_poll_interval)
self.mock_get_from_manager.mock.assert_called_once_with()
def test_restore_backup(self): def test_restore_backup(self):
backup = mock.Mock() backup = mock.Mock()
@ -238,6 +281,12 @@ class CinderMixinTestCase(test.ScenarioTestCase):
self.cinder.transfers.list.return_value, self.cinder.transfers.list.return_value,
return_transfers_list) return_transfers_list)
def test_get_volume_type(self):
self.assertEqual(self.cinder.volume_types.get.return_value,
self.service.get_volume_type("volume_type"))
self.cinder.volume_types.get.assert_called_once_with(
"volume_type")
def test_delete_volume_type(self): def test_delete_volume_type(self):
volume_type = mock.Mock() volume_type = mock.Mock()
self.service.delete_volume_type(volume_type) self.service.delete_volume_type(volume_type)
@ -341,20 +390,24 @@ class UnifiedCinderMixinTestCase(test.TestCase):
id = 1 id = 1
name = "backup" name = "backup"
volume_id = "volume" volume_id = "volume"
status = "st"
backup = self.service._unify_backup(SomeBackup()) backup = self.service._unify_backup(SomeBackup())
self.assertEqual(1, backup.id) self.assertEqual(1, backup.id)
self.assertEqual("backup", backup.name) self.assertEqual("backup", backup.name)
self.assertEqual("volume", backup.volume_id) self.assertEqual("volume", backup.volume_id)
self.assertEqual("st", backup.status)
def test__unify_transfer(self): def test__unify_transfer(self):
class SomeTransfer(object): class SomeTransfer(object):
id = 1 id = 1
name = "transfer" name = "transfer"
volume_id = "volume" volume_id = "volume"
status = "st"
transfer = self.service._unify_backup(SomeTransfer()) transfer = self.service._unify_backup(SomeTransfer())
self.assertEqual(1, transfer.id) self.assertEqual(1, transfer.id)
self.assertEqual("transfer", transfer.name) self.assertEqual("transfer", transfer.name)
self.assertEqual("volume", transfer.volume_id) self.assertEqual("volume", transfer.volume_id)
self.assertEqual("st", transfer.status)
def test__unify_encryption_type(self): def test__unify_encryption_type(self):
class SomeEncryptionType(object): class SomeEncryptionType(object):
@ -408,15 +461,6 @@ class UnifiedCinderMixinTestCase(test.TestCase):
self.service.delete_backup("backup") self.service.delete_backup("backup")
self.service._impl.delete_backup.assert_called_once_with("backup") self.service._impl.delete_backup.assert_called_once_with("backup")
def test_restore_backup(self):
self.service._unify_backup = mock.MagicMock()
self.assertEqual(self.service._unify_backup.return_value,
self.service.restore_backup(1, volume_id=1))
self.service._impl.restore_backup.assert_called_once_with(1,
volume_id=1)
self.service._unify_backup.assert_called_once_with(
self.service._impl.restore_backup.return_value)
def test_list_backups(self): def test_list_backups(self):
self.service._unify_backup = mock.MagicMock() self.service._unify_backup = mock.MagicMock()
self.service._impl.list_backups.return_value = ["backup"] self.service._impl.list_backups.return_value = ["backup"]
@ -437,6 +481,12 @@ class UnifiedCinderMixinTestCase(test.TestCase):
self.service._unify_transfer.assert_called_once_with( self.service._unify_transfer.assert_called_once_with(
"transfer") "transfer")
def test_get_volume_type(self):
self.assertEqual(self.service._impl.get_volume_type.return_value,
self.service.get_volume_type("volume_type"))
self.service._impl.get_volume_type.assert_called_once_with(
"volume_type")
def test_delete_volume_type(self): def test_delete_volume_type(self):
self.assertEqual(self.service._impl.delete_volume_type.return_value, self.assertEqual(self.service._impl.delete_volume_type.return_value,
self.service.delete_volume_type("volume_type")) self.service.delete_volume_type("volume_type"))

View File

@ -88,28 +88,25 @@ class CinderV1ServiceTestCase(test.ScenarioTestCase):
return_volume) return_volume)
def test_update_volume(self): def test_update_volume(self):
self.service.generate_random_name = mock.MagicMock( return_value = {"volume": fakes.FakeVolume()}
return_value="volume") self.cinder.volumes.update.return_value = return_value
return_volume = self.service.update_volume( self.assertEqual(return_value["volume"],
1, display_description="fake") self.service.update_volume(1))
self.cinder.volumes.update.assert_called_once_with(1)
self.service.generate_random_name.assert_called_once_with()
self.cinder.volumes.update.assert_called_once_with(
1, display_name="volume", display_description="fake")
self.assertEqual(self.cinder.volumes.update.return_value,
return_volume)
self._test_atomic_action_timer(self.atomic_actions(), self._test_atomic_action_timer(self.atomic_actions(),
"cinder_v1.update_volume") "cinder_v1.update_volume")
def test_update_volume_with_name(self): def test_update_volume_with_name_description(self):
return_value = {"volume": fakes.FakeVolume()}
self.cinder.volumes.update.return_value = return_value
return_volume = self.service.update_volume( return_volume = self.service.update_volume(
1, display_name="volume", display_description="fake") 1, display_name="volume", display_description="fake")
self.cinder.volumes.update.assert_called_once_with( self.cinder.volumes.update.assert_called_once_with(
1, display_name="volume", display_description="fake") 1, display_name="volume", display_description="fake")
self.assertEqual(self.cinder.volumes.update.return_value, self.assertEqual(return_value["volume"], return_volume)
return_volume)
self._test_atomic_action_timer(self.atomic_actions(), self._test_atomic_action_timer(self.atomic_actions(),
"cinder_v1.update_volume") "cinder_v1.update_volume")
@ -224,20 +221,33 @@ class UnifiedCinderV1ServiceTestCase(test.TestCase):
id = 1 id = 1
display_name = "volume" display_name = "volume"
size = 1 size = 1
status = "st"
volume = self.service._unify_volume(SomeVolume()) volume = self.service._unify_volume(SomeVolume())
self.assertEqual(1, volume.id) self.assertEqual(1, volume.id)
self.assertEqual("volume", volume.name) self.assertEqual("volume", volume.name)
self.assertEqual(1, volume.size) self.assertEqual(1, volume.size)
self.assertEqual("st", volume.status)
def test__unify_volume_with_dict(self):
some_volume = {"display_name": "volume", "id": 1,
"size": 1, "status": "st"}
volume = self.service._unify_volume(some_volume)
self.assertEqual(1, volume.id)
self.assertEqual("volume", volume.name)
self.assertEqual(1, volume.size)
self.assertEqual("st", volume.status)
def test__unify_snapshot(self): def test__unify_snapshot(self):
class SomeSnapshot(object): class SomeSnapshot(object):
id = 1 id = 1
display_name = "snapshot" display_name = "snapshot"
volume_id = "volume" volume_id = "volume"
status = "st"
snapshot = self.service._unify_snapshot(SomeSnapshot()) snapshot = self.service._unify_snapshot(SomeSnapshot())
self.assertEqual(1, snapshot.id) self.assertEqual(1, snapshot.id)
self.assertEqual("snapshot", snapshot.name) self.assertEqual("snapshot", snapshot.name)
self.assertEqual("volume", snapshot.volume_id) self.assertEqual("volume", snapshot.volume_id)
self.assertEqual("st", snapshot.status)
def test_create_volume(self): def test_create_volume(self):
self.service._unify_volume = mock.MagicMock() self.service._unify_volume = mock.MagicMock()
@ -334,3 +344,12 @@ class UnifiedCinderV1ServiceTestCase(test.TestCase):
self.service.create_volume_type(name="type")) self.service.create_volume_type(name="type"))
self.service._impl.create_volume_type.assert_called_once_with( self.service._impl.create_volume_type.assert_called_once_with(
name="type") name="type")
def test_restore_backup(self):
self.service._unify_volume = mock.MagicMock()
self.assertEqual(self.service._unify_volume.return_value,
self.service.restore_backup(1, volume_id=1))
self.service._impl.restore_backup.assert_called_once_with(1,
volume_id=1)
self.service._unify_volume.assert_called_once_with(
self.service._impl.restore_backup.return_value)

View File

@ -96,27 +96,25 @@ class CinderV2ServiceTestCase(test.ScenarioTestCase):
return_volume) return_volume)
def test_update_volume(self): def test_update_volume(self):
self.service.generate_random_name = mock.MagicMock( return_value = {"volume": fakes.FakeVolume()}
return_value="volume") self.cinder.volumes.update.return_value = return_value
return_volume = self.service.update_volume(1, description="fake") self.assertEqual(return_value["volume"],
self.service.update_volume(1))
self.service.generate_random_name.assert_called_once_with() self.cinder.volumes.update.assert_called_once_with(1)
self.cinder.volumes.update.assert_called_once_with(1, name="volume",
description="fake")
self.assertEqual(self.cinder.volumes.update.return_value,
return_volume)
self._test_atomic_action_timer(self.atomic_actions(), self._test_atomic_action_timer(self.atomic_actions(),
"cinder_v2.update_volume") "cinder_v2.update_volume")
def test_update_volume_with_name(self): def test_update_volume_with_name_description(self):
return_volume = self.service.update_volume(1, name="volume", return_value = {"volume": fakes.FakeVolume()}
description="fake") self.cinder.volumes.update.return_value = return_value
self.cinder.volumes.update.assert_called_once_with(1, name="volume", return_volume = self.service.update_volume(
description="fake") 1, name="volume", description="fake")
self.assertEqual(self.cinder.volumes.update.return_value,
return_volume) self.cinder.volumes.update.assert_called_once_with(
1, name="volume", description="fake")
self.assertEqual(return_value["volume"], return_volume)
self._test_atomic_action_timer(self.atomic_actions(), self._test_atomic_action_timer(self.atomic_actions(),
"cinder_v2.update_volume") "cinder_v2.update_volume")
@ -237,20 +235,32 @@ class UnifiedCinderV2ServiceTestCase(test.TestCase):
id = 1 id = 1
name = "volume" name = "volume"
size = 1 size = 1
status = "st"
volume = self.service._unify_volume(SomeVolume()) volume = self.service._unify_volume(SomeVolume())
self.assertEqual(1, volume.id) self.assertEqual(1, volume.id)
self.assertEqual("volume", volume.name) self.assertEqual("volume", volume.name)
self.assertEqual(1, volume.size) self.assertEqual(1, volume.size)
self.assertEqual("st", volume.status)
def test__unify_volume_with_dict(self):
some_volume = {"name": "volume", "id": 1, "size": 1, "status": "st"}
volume = self.service._unify_volume(some_volume)
self.assertEqual(1, volume.id)
self.assertEqual("volume", volume.name)
self.assertEqual(1, volume.size)
self.assertEqual("st", volume.status)
def test__unify_snapshot(self): def test__unify_snapshot(self):
class SomeSnapshot(object): class SomeSnapshot(object):
id = 1 id = 1
name = "snapshot" name = "snapshot"
volume_id = "volume" volume_id = "volume"
status = "st"
snapshot = self.service._unify_snapshot(SomeSnapshot()) snapshot = self.service._unify_snapshot(SomeSnapshot())
self.assertEqual(1, snapshot.id) self.assertEqual(1, snapshot.id)
self.assertEqual("snapshot", snapshot.name) self.assertEqual("snapshot", snapshot.name)
self.assertEqual("volume", snapshot.volume_id) self.assertEqual("volume", snapshot.volume_id)
self.assertEqual("st", snapshot.status)
def test_create_volume(self): def test_create_volume(self):
self.service._unify_volume = mock.MagicMock() self.service._unify_volume = mock.MagicMock()
@ -355,3 +365,12 @@ class UnifiedCinderV2ServiceTestCase(test.TestCase):
is_public=True)) is_public=True))
self.service._impl.create_volume_type.assert_called_once_with( self.service._impl.create_volume_type.assert_called_once_with(
name="type", description="desp", is_public=True) name="type", description="desp", is_public=True)
def test_restore_backup(self):
self.service._unify_volume = mock.MagicMock()
self.assertEqual(self.service._unify_volume.return_value,
self.service.restore_backup(1, volume_id=1))
self.service._impl.restore_backup.assert_called_once_with(1,
volume_id=1)
self.service._unify_volume.assert_called_once_with(
self.service._impl.restore_backup.return_value)