The cinder.volume.drivers.solidfire Module

The cinder.volume.drivers.solidfire Module

class SolidFireDriver(*args, **kwargs)

Bases: cinder.volume.drivers.san.san.SanISCSIDriver

OpenStack driver to enable SolidFire cluster.

Version history:
    1.0 - Initial driver
    1.1 - Refactor, clone support, qos by type and minor bug fixes
    1.2 - Add xfr and retype support
    1.2.1 - Add export/import support
    1.2.2 - Catch VolumeNotFound on accept xfr
    2.0.0 - Move from httplib to requests
    2.0.1 - Implement SolidFire Snapshots
    2.0.2 - Implement secondary account
    2.0.3 - Implement cluster pairing
    2.0.4 - Implement volume replication
    2.0.5 - Try and deal with the stupid retry/clear issues from objects
            and tflow
    2.0.6 - Add a lock decorator around the clone_image method
    2.0.7 - Add scaled IOPS
    2.0.8 - Add active status filter to get volume ops
    2.0.9 - Always purge on delete volume
    2.0.10 - Add response to debug on retryable errors
    2.0.11 - Add ability to failback replicating volumes
    2.0.12 - Fix bug #1744005
CI_WIKI_NAME = 'NetApp_SolidFire_CI'
VERSION = '2.0.12'
accept_transfer(context, volume, new_user, new_project)
attach_volume(context, volume, instance_uuid, host_name, mountpoint)
clone_image(inst, *args, **kwargs)
cluster_stats = {}
create_cloned_volume(inst, *args, **kwargs)
create_group(ctxt, group)
create_group_from_src(ctxt, group, volumes, group_snapshots=None, snapshots=None, source_group=None, source_vols=None)
create_group_snapshot(ctxt, group_snapshot, snapshots)

Create volume on SolidFire device.

The account is where CHAP settings are derived from, volume is created and exported. Note that the new volume is immediately ready for use.

One caveat here is that an existing user account must be specified in the API call to create a new volume. We use a set algorithm to determine account info based on passed in cinder volume object. First we check to see if the account already exists (and use it), or if it does not already exist, we’ll go ahead and create it.

create_volume_from_snapshot(inst, *args, **kwargs)
delete_group(ctxt, group, volumes)

Delete the specified snapshot from the SolidFire cluster.


Delete SolidFire Volume from device.

SolidFire allows multiple volumes with same name, volumeID is what’s guaranteed unique.

detach_volume(context, volume, attachment=None)
driver_prefix = 'solidfire'
extend_volume(volume, new_size)

Extend an existing volume.

failover_host(context, volumes, secondary_id=None, groups=None)

Failover to replication target.

In order to do failback, you MUST specify the original/default cluster using secondary_id option. You can do this simply by specifying: secondary_id=default


Freeze backend notification.


Get volume status.

If ‘refresh’ is True, run update first. The name is a bit misleading as the majority of the data here is cluster data

initialize_connection(volume, connector)

Initialize the connection and return connection info.

Optionally checks and utilizes volume access groups.

locked_image_id_operation(f, external=False)
locked_source_id_operation(f, external=False)
manage_existing(volume, external_ref)

Manages an existing SolidFire Volume (import to Cinder).

Renames the Volume to match the expected name for the volume. Also need to consider things like QoS, Emulation, account/tenant.

manage_existing_get_size(volume, external_ref)

Return size of an existing LV for manage_existing.

existing_ref is a dictionary of the form: {‘name’: <name of existing volume on SF Cluster>}

retry_exc_tuple = (<class 'cinder.exception.SolidFireRetryableException'>, <class 'requests.exceptions.ConnectionError'>)
retryable_errors = ['xDBVersionMismatch', 'xMaxSnapshotsPerVolumeExceeded', 'xMaxClonesPerVolumeExceeded', 'xMaxSnapshotsPerNodeExceeded', 'xMaxClonesPerNodeExceeded', 'xSliceNotRegistered', 'xNotReadyForIO']
retype(ctxt, volume, new_type, diff, host)

Convert the volume to be of the new type.

Returns a boolean indicating whether the retype occurred.

  • ctxt – Context
  • volume – A dictionary describing the volume to migrate
  • new_type – A dictionary describing the volume type to convert to
  • diff – A dictionary with the difference between the two types
  • host – A dictionary describing the host to migrate to, where host[‘host’] is its name, and host[‘capabilities’] is a dictionary of its reported capabilities (Not Used).
sf_iops_lim_max = {'burstIOPS': 200000, 'minIOPS': 15000, 'maxIOPS': 200000}
sf_iops_lim_min = {'burstIOPS': 100, 'minIOPS': 100, 'maxIOPS': 100}
sf_qos_dict = {'performant': {'burstIOPS': 4000, 'minIOPS': 2000, 'maxIOPS': 4000}, 'medium': {'burstIOPS': 400, 'minIOPS': 200, 'maxIOPS': 400}, 'slow': {'burstIOPS': 200, 'minIOPS': 100, 'maxIOPS': 200}, 'off': None, 'fast': {'burstIOPS': 1000, 'minIOPS': 500, 'maxIOPS': 1000}}
sf_qos_keys = ['minIOPS', 'maxIOPS', 'burstIOPS']
sf_scale_qos_keys = ['scaledIOPS', 'scaleMin', 'scaleMax', 'scaleBurst']
terminate_connection(volume, properties, force)

Thaw backend notification.


Mark SolidFire Volume as unmanaged (export from Cinder).

update_group(ctxt, group, add_volumes=None, remove_volumes=None)
update_provider_info(vrefs, snaprefs)
class SolidFireISCSI(*args, **kwargs)

Bases: cinder.volume.targets.iscsi.SanISCSITarget

create_export(context, volume, volume_path)
ensure_export(context, volume, volume_path)
remove_export(context, volume)
terminate_connection(volume, connector, **kwargs)
retry(exc_tuple, tries=5, delay=1, backoff=2)
Creative Commons Attribution 3.0 License

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.