cinder.volume.volume_utils module

Volume-related Utilities and helpers.

class TraceWrapperMetaclass(classname, bases, classDict)

Bases: type

Metaclass that wraps all methods of a class with trace_method.

This metaclass will cause every function inside of the class to be decorated with the trace_method decorator.

To use the metaclass you define a class like so: class MyClass(object, metaclass=utils.TraceWrapperMetaclass):

class TraceWrapperWithABCMetaclass(name, bases, namespace, **kwargs)

Bases: abc.ABCMeta, cinder.volume.volume_utils.TraceWrapperMetaclass

Metaclass that wraps all methods of a class with trace.

append_host(host: Optional[str], pool: Optional[str]) Optional[str]

Encode pool into host info.

brick_attach_volume_encryptor(context: cinder.context.RequestContext, attach_info: dict, encryption: dict) None

Attach encryption layer.

brick_detach_volume_encryptor(attach_info: dict, encryption: dict) None

Detach encryption layer.

brick_get_connector(protocol: str, driver=None, use_multipath: bool = False, device_scan_attempts: int = 3, *args, **kwargs)

Wrapper to get a brick connector object.

This automatically populates the required protocol as well as the root_helper needed to execute commands.

brick_get_connector_properties(multipath: bool = False, enforce_multipath: bool = False)

Wrapper to automatically set root_helper in brick calls.

  • multipath – A boolean indicating whether the connector can support multipath.

  • enforce_multipath – If True, it raises exception when multipath=True is specified but multipathd is not running. If False, it falls back to multipath=False when multipathd is not running.

brick_get_encryptor(connection_info: dict, *args, **kwargs)

Wrapper to get a brick encryptor object.

check_already_managed_volume(vol_id: Optional[str])

Check cinder db for already managed volume.


vol_id – volume id parameter


bool – return True, if db entry with specified volume id exists, otherwise return False


ValueError if vol_id is not a valid uuid string

check_encryption_provider(volume: objects.Volume, context: cinder.context.RequestContext) dict

Check that this is a LUKS encryption provider.


encryption dict

check_for_odirect_support(src: str, dest: str, flag: str = 'oflag=direct') bool
check_image_metadata(image_meta: dict[str, Union[str, int]], vol_size: int) None

Validates the image metadata.

clear_volume(volume_size: int, volume_path: str, volume_clear: Optional[str] = None, volume_clear_size: Optional[int] = None, volume_clear_ionice: Optional[str] = None, throttle=None) None

Unprovision old volumes to prevent data leaking between users.

clone_encryption_key(context: cinder.context.RequestContext, key_manager, encryption_key_id: str) str
convert_config_string_to_dict(config_string: str) dict

Convert config file replication string to a dict.

The only supported form is as follows: “{‘key-1’=’val-1’ ‘key-2’=’val-2’…}”


config_string – Properly formatted string to convert to dict.


dict of string values

copy_image_to_volume(driver, context: context.RequestContext, volume: objects.Volume, image_meta: dict, image_location: Union[str, tuple[Optional[str], Any]], image_service) None

Downloads Glance image to the specified volume.

copy_volume(src: typing.Union[str, typing.BinaryIO], dest: typing.Union[str, typing.BinaryIO], size_in_m: int, blocksize: typing.Union[str, int], sync=False, execute=<function execute>, ionice=None, throttle=None, sparse=False) None

Copy data from the source volume to the destination volume.

The parameters ‘src’ and ‘dest’ are both typically of type str, which represents the path to each volume on the filesystem. Connectors can optionally return a volume handle of type RawIOBase for volumes that are not available on the local filesystem for open/close operations.

If either ‘src’ or ‘dest’ are not of type str, then they are assumed to be of type RawIOBase or any derivative that supports file operations such as read and write. In this case, the handles are treated as file handles instead of file paths and, at present moment, throttling is unavailable.

create_encryption_key(context: cinder.context.RequestContext, key_manager, volume_type_id: str) Optional[str]
delete_encryption_key(context: cinder.context.RequestContext, key_manager, encryption_key_id: str) None
enable_bootable_flag(volume: objects.Volume) None
extract_availability_zones_from_volume_type(volume_type: Union['objects.VolumeType', dict]) Optional[list[str]]
extract_host(host: Optional[str], level: str = 'backend', default_pool_name: bool = False) Optional[str]

Extract Host, Backend or Pool information from host string.

  • host – String for host, which could include host@backend#pool info

  • level – Indicate which level of information should be extracted from host string. Level can be ‘host’, ‘backend’ or ‘pool’, default value is ‘backend’

  • default_pool_name – this flag specify what to do if level == ‘pool’ and there is no ‘pool’ info encoded in host string. default_pool_name=True will return DEFAULT_POOL_NAME, otherwise we return None. Default value of this parameter is False.


expected information, string or None



For example:

host = ‘HostA@BackendB#PoolC’ ret = extract_host(host, ‘host’) # ret is ‘HostA’ ret = extract_host(host, ‘backend’) # ret is ‘HostA@BackendB’ ret = extract_host(host, ‘pool’) # ret is ‘PoolC’

host = ‘HostX@BackendY’ ret = extract_host(host, ‘pool’) # ret is None ret = extract_host(host, ‘pool’, True) # ret is ‘_pool0’

extract_id_from_snapshot_name(snap_name: str) Optional[str]

Return a snapshot’s ID from its name on the backend.

extract_id_from_volume_name(vol_name: str) Optional[str]
generate_password(length: int = 16, symbolgroups: tuple[str, ...] = ('23456789', 'ABCDEFGHJKLMNPQRSTUVWXYZ', 'abcdefghijkmnopqrstuvwxyz')) str

Generate a random password from the supplied symbol groups.

At least one symbol from each group will be included. Unpredictable results if length is less than the number of symbol groups.

Believed to be reasonably secure (with a reasonable password length!)

generate_username(length: int = 20, symbolgroups: tuple[str, ...] = ('23456789', 'ABCDEFGHJKLMNPQRSTUVWXYZ', 'abcdefghijkmnopqrstuvwxyz')) str
get_all_physical_volumes(vg_name=None) list
get_all_volume_groups(vg_name=None) list
get_backend_configuration(backend_name, backend_opts=None)

Get a configuration object for a specific backend.

get_base_image_ref(volume: objects.Volume)
get_max_over_subscription_ratio(str_value: Union[str, float], supports_auto: bool = False) Union[str, float]

Get the max_over_subscription_ratio from a string

As some drivers need to do some calculations with the value and we are now receiving a string value in the conf, this converts the value to float when appropriate.

  • str_value – Configuration object

  • supports_auto – Tell if the calling driver supports auto MOSR.


value of mosr

get_volume_image_metadata(image_id: str, image_meta: dict[str, Any]) dict
hosts_are_equivalent(host_1: str, host_2: str) bool
image_conversion_dir() str
is_boolean_str(str: Optional[str]) bool
is_group_a_cg_snapshot_type(group_or_snap) bool
is_group_a_type(group: objects.Group, key: str) bool
is_multiattach_spec(extra_specs: dict) bool
is_replicated_spec(extra_specs: dict) bool

Annoy the log about unsupported drivers.

matching_backend_name(src_volume_type, volume_type) bool
notify_about_backup_usage(context: cinder.context.RequestContext, backup: objects.Backup, event_suffix: str, extra_usage_info: Optional[dict] = None, host: Optional[str] = None) None
notify_about_capacity_usage(context: cinder.context.RequestContext, capacity: dict, suffix: str, extra_usage_info: Optional[dict] = None, host: Optional[str] = None) None
notify_about_cgsnapshot_usage(context: cinder.context.RequestContext, cgsnapshot: objects.CGSnapshot, event_suffix: str, extra_usage_info: Optional[dict] = None, host: Optional[str] = None) None
notify_about_consistencygroup_usage(context: cinder.context.RequestContext, group: objects.Group, event_suffix: str, extra_usage_info: Optional[dict] = None, host: Optional[str] = None) None
notify_about_group_snapshot_usage(context: cinder.context.RequestContext, group_snapshot: objects.GroupSnapshot, event_suffix: str, extra_usage_info=None, host: Optional[str] = None) None
notify_about_group_usage(context: cinder.context.RequestContext, group: objects.Group, event_suffix: str, extra_usage_info: Optional[dict] = None, host: Optional[str] = None) None
notify_about_snapshot_usage(context: cinder.context.RequestContext, snapshot: objects.Snapshot, event_suffix: str, extra_usage_info: Optional[dict] = None, host: Optional[str] = None) None
notify_about_volume_usage(context: cinder.context.RequestContext, volume: objects.Volume, event_suffix: str, extra_usage_info: Optional[dict] = None, host: Optional[str] = None) None
null_safe_str(s: Optional[str]) str
paginate_entries_list(entries: list[dict], marker: Optional[Union[dict, str]], limit: int, offset: Optional[int], sort_keys: list[str], sort_dirs: list[str]) list

Paginate a list of entries.


entries – list of dictionaries


The last element previously returned


The maximum number of items to return


The number of items to skip from the marker or from the first element.


A list of keys in the dictionaries to sort by


A list of sort directions, where each is either ‘asc’ or ‘dec’


Verifies if driver is initialized

If the driver is not initialized, an exception will be raised.

Params driver

The driver instance.



resolve_hostname(hostname: str) str

Resolves host name to IP address.

Resolves a host name ( to an IP address ( This routine also works if the data passed in hostname is already an IP. In this case, the same IP address will be returned.


hostname – Host name to resolve.


IP Address for Host name.

sanitize_host(host: str) str

Ensure IPv6 addresses are enclosed in [] for iSCSI portals.

sanitize_hostname(hostname) str

Return a hostname which conforms to RFC-952 and RFC-1123 specs.


Set global variables for each trace flag.

Sets variables TRACE_METHOD and TRACE_API, which represent whether to log methods or api traces.


trace_flags – a list of strings

supports_thin_provisioning() bool
trace(*dec_args, **dec_kwargs)

Trace calls to the decorated function.

This decorator should always be defined as the outermost decorator so it is defined last. This is important so it does not interfere with other decorators.

Using this decorator on a function will cause its execution to be logged at DEBUG level with arguments, return values, and exceptions.


a function decorator

trace_api(*dec_args, **dec_kwargs)

Decorates a function if TRACE_API is true.


Decorates a function if TRACE_METHOD is true.

update_backup_error(backup, err: str, status='error') None
upload_volume(context: cinder.context.RequestContext, image_service, image_meta, volume_path, volume: objects.Volume, volume_format: str = 'raw', run_as_root: bool = True, compress: bool = True) None