The Database Layer

The cinder.db.api Module

Defines interface for DB access.

Functions in this module are imported into the cinder.db namespace. Call these functions from cinder.db namespace, not the cinder.db.api namespace.

All functions in this module return objects that implement a dictionary-like interface. Currently, many of these objects are sqlalchemy objects that implement a dictionary interface. However, a future goal is to have all of these objects be simple dictionaries.

Related Flags

connection:string specifying the sqlalchemy connection to use, like: sqlite:///var/lib/cinder/cinder.sqlite.
enable_new_services:
 when adding a new service to the database, is it in the pool of available hardware (Default: True)
class Case(whens, value=None, else_=None)

Bases: object

Class for conditional value selection for conditional_update.

class Condition(value, field=None)

Bases: object

Class for normal condition values for conditional_update.

get_filter(model, field=None)
class Not(value, field=None, auto_none=True)

Bases: cinder.db.api.Condition

Class for negated condition values for conditional_update.

By default NULL values will be treated like Python treats None instead of how SQL treats it.

So for example when values are (1, 2) it will evaluate to True when we have value 3 or NULL, instead of only with 3 like SQL does.

get_filter(model, field=None)
attachment_destroy(context, attachment_id)

Destroy the attachment or raise if it does not exist.

attachment_specs_delete(context, attachment_id, key)

Delete the given attachment specs item.

attachment_specs_get(context, attachment_id)

Get all specs for an attachment.

attachment_specs_update_or_create(context, attachment_id, specs)

Create or update attachment specs.

This adds or modifies the key/value pairs specified in the attachment specs dict argument.

backup_create(context, values)

Create a backup from the values dictionary.

backup_destroy(context, backup_id)

Destroy the backup or raise if it does not exist.

backup_get(context, backup_id, read_deleted=None, project_only=True)

Get a backup or raise if it does not exist.

backup_get_all(context, filters=None, marker=None, limit=None, offset=None, sort_keys=None, sort_dirs=None)

Get all backups.

backup_get_all_active_by_window(context, begin, end=None, project_id=None)

Get all the backups inside the window.

Specifying a project_id will filter for a certain project.

backup_get_all_by_host(context, host)

Get all backups belonging to a host.

backup_get_all_by_project(context, project_id, filters=None, marker=None, limit=None, offset=None, sort_keys=None, sort_dirs=None)

Get all backups belonging to a project.

backup_get_all_by_volume(context, volume_id, filters=None)

Get all backups belonging to a volume.

backup_update(context, backup_id, values)

Set the given properties on a backup and update it.

Raises NotFound if backup does not exist.

cg_creating_from_src(cg_id=None, cgsnapshot_id=None)

Return a filter to check if a CG is being used as creation source.

Returned filter is meant to be used in the Conditional Update mechanism and checks if provided CG ID or CG Snapshot ID is currently being used to create another CG.

This filter will not include CGs that have used the ID but have already finished their creation (status is no longer creating).

Filter uses a subquery that allows it to be used on updates to the consistencygroups table.

cg_has_cgsnapshot_filter()

Return a filter that checks if a CG has CG Snapshots.

cg_has_volumes_filter(attached_or_with_snapshots=False)

Return a filter to check if a CG has volumes.

When attached_or_with_snapshots parameter is given a True value only attached volumes or those with snapshots will be considered.

cgsnapshot_create(context, values)

Create a cgsnapshot from the values dictionary.

cgsnapshot_creating_from_src()

Get a filter that checks if a CGSnapshot is being created from a CG.

cgsnapshot_destroy(context, cgsnapshot_id)

Destroy the cgsnapshot or raise if it does not exist.

cgsnapshot_get(context, cgsnapshot_id)

Get a cgsnapshot or raise if it does not exist.

cgsnapshot_get_all(context, filters=None)

Get all cgsnapshots.

cgsnapshot_get_all_by_group(context, group_id, filters=None)

Get all cgsnapshots belonging to a consistency group.

cgsnapshot_get_all_by_project(context, project_id, filters=None)

Get all cgsnapshots belonging to a project.

cgsnapshot_update(context, cgsnapshot_id, values)

Set the given properties on a cgsnapshot and update it.

Raises NotFound if cgsnapshot does not exist.

cluster_create(context, values)

Create a cluster from the values dictionary.

cluster_destroy(context, id)

Destroy the cluster or raise if it does not exist or has hosts.

Raises:ClusterNotFound – If cluster doesn’t exist.
cluster_get(context, id=None, is_up=None, get_services=False, services_summary=False, read_deleted='no', name_match_level=None, **filters)

Get a cluster that matches the criteria.

Parameters:
  • id – Id of the cluster.
  • is_up – Boolean value to filter based on the cluster’s up status.
  • get_services – If we want to load all services from this cluster.
  • services_summary – If we want to load num_hosts and num_down_hosts fields.
  • read_deleted – Filtering based on delete status. Default value is “no”.
  • name_match_level – ‘pool’, ‘backend’, or ‘host’ for name filter (as defined in _filter_host method)
  • filters – Field based filters in the form of key/value.
Raises:

ClusterNotFound – If cluster doesn’t exist.

cluster_get_all(context, is_up=None, get_services=False, services_summary=False, read_deleted='no', name_match_level=None, **filters)

Get all clusters that match the criteria.

Parameters:
  • is_up – Boolean value to filter based on the cluster’s up status.
  • get_services – If we want to load all services from this cluster.
  • services_summary – If we want to load num_hosts and num_down_hosts fields.
  • read_deleted – Filtering based on delete status. Default value is “no”.
  • name_match_level – ‘pool’, ‘backend’, or ‘host’ for name filter (as defined in _filter_host method)
  • filters – Field based filters in the form of key/value.
cluster_update(context, id, values)

Set the given properties on an cluster and update it.

Raises ClusterNotFound if cluster does not exist.

conditional_update(context, model, values, expected_values, filters=(), include_deleted='no', project_only=False, order=None)

Compare-and-swap conditional update.

Update will only occur in the DB if conditions are met.

We have 4 different condition types we can use in expected_values:
  • Equality: {‘status’: ‘available’}
  • Inequality: {‘status’: vol_obj.Not(‘deleting’)}
  • In range: {‘status’: [‘available’, ‘error’]
  • Not in range: {‘status’: vol_obj.Not([‘in-use’, ‘attaching’])

Method accepts additional filters, which are basically anything that can be passed to a sqlalchemy query’s filter method, for example:

[~sql.exists().where(models.Volume.id == models.Snapshot.volume_id)]

We can select values based on conditions using Case objects in the ‘values’ argument. For example:

has_snapshot_filter = sql.exists().where(
    models.Snapshot.volume_id == models.Volume.id)
case_values = db.Case([(has_snapshot_filter, 'has-snapshot')],
                      else_='no-snapshot')
db.conditional_update(context, models.Volume, {'status': case_values},
                      {'status': 'available'})

And we can use DB fields for example to store previous status in the corresponding field even though we don’t know which value is in the db from those we allowed:

db.conditional_update(context, models.Volume,
                      {'status': 'deleting',
                       'previous_status': models.Volume.status},
                      {'status': ('available', 'error')})
Parameters:
  • values – Dictionary of key-values to update in the DB.
  • expected_values – Dictionary of conditions that must be met for the update to be executed.
  • filters – Iterable with additional filters.
  • include_deleted – Should the update include deleted items, this is equivalent to read_deleted.
  • project_only – Should the query be limited to context’s project.
  • order – Specific order of fields in which to update the values

:returns number of db rows that were updated.

consistencygroup_create(context, values, cg_snap_id=None, cg_id=None)

Create a consistencygroup from the values dictionary.

consistencygroup_destroy(context, consistencygroup_id)

Destroy the consistencygroup or raise if it does not exist.

consistencygroup_get(context, consistencygroup_id)

Get a consistencygroup or raise if it does not exist.

consistencygroup_get_all(context, filters=None, marker=None, limit=None, offset=None, sort_keys=None, sort_dirs=None)

Get all consistencygroups.

consistencygroup_get_all_by_project(context, project_id, filters=None, marker=None, limit=None, offset=None, sort_keys=None, sort_dirs=None)

Get all consistencygroups belonging to a project.

consistencygroup_include_in_cluster(context, cluster, partial_rename=True, **filters)

Include all consistency groups matching the filters into a cluster.

When partial_rename is set we will not set the cluster_name with cluster parameter value directly, we’ll replace provided cluster_name or host filter value with cluster instead.

This is useful when we want to replace just the cluster name but leave the backend and pool information as it is. If we are using cluster_name to filter, we’ll use that same DB field to replace the cluster value and leave the rest as it is. Likewise if we use the host to filter.

Returns the number of consistency groups that have been changed.

consistencygroup_update(context, consistencygroup_id, values)

Set the given properties on a consistencygroup and update it.

Raises NotFound if consistencygroup does not exist.

dispose_engine()

Force the engine to establish new connections.

driver_initiator_data_get(context, initiator, namespace)

Query for an DriverInitiatorData that has the specified key

driver_initiator_data_insert_by_key(context, initiator, namespace, key, value)

Updates DriverInitiatorData entry.

Sets the value for the specified key within the namespace.

If the entry already exists return False, if it inserted successfully return True.

get_booleans_for_table(table_name)
get_by_id(context, model, id, *args, **kwargs)
get_model_for_versioned_object(versioned_object)
get_volume_summary_all(context)

Get all volume summary.

get_volume_summary_by_project(context, project_id)

Get all volume summary belonging to a project.

group_create(context, values, group_snapshot_id=None, group_id=None)

Create a group from the values dictionary.

group_creating_from_src(group_id=None, group_snapshot_id=None)

Return a filter to check if a Group is being used as creation source.

Returned filter is meant to be used in the Conditional Update mechanism and checks if provided Group ID or Group Snapshot ID is currently being used to create another Group.

This filter will not include Groups that have used the ID but have already finished their creation (status is no longer creating).

Filter uses a subquery that allows it to be used on updates to the groups table.

group_destroy(context, group_id)

Destroy the group or raise if it does not exist.

group_get(context, group_id)

Get a group or raise if it does not exist.

group_get_all(context, filters=None, marker=None, limit=None, offset=None, sort_keys=None, sort_dirs=None)

Get all groups.

group_get_all_by_project(context, project_id, filters=None, marker=None, limit=None, offset=None, sort_keys=None, sort_dirs=None)

Get all groups belonging to a project.

group_has_group_snapshot_filter()

Return a filter that checks if a Group has Group Snapshots.

group_has_volumes_filter(attached_or_with_snapshots=False)

Return a filter to check if a Group has volumes.

When attached_or_with_snapshots parameter is given a True value only attached volumes or those with snapshots will be considered.

group_snapshot_create(context, values)

Create a group snapshot from the values dictionary.

group_snapshot_creating_from_src()

Get a filter to check if a grp snapshot is being created from a grp.

group_snapshot_destroy(context, group_snapshot_id)

Destroy the group snapshot or raise if it does not exist.

group_snapshot_get(context, group_snapshot_id)

Get a group snapshot or raise if it does not exist.

group_snapshot_get_all(context, filters=None)

Get all group snapshots.

group_snapshot_get_all_by_group(context, group_id, filters=None)

Get all group snapshots belonging to a group.

group_snapshot_get_all_by_project(context, project_id, filters=None)

Get all group snapshots belonging to a project.

group_snapshot_update(context, group_snapshot_id, values)

Set the given properties on a group snapshot and update it.

Raises NotFound if group snapshot does not exist.

group_type_access_add(context, type_id, project_id)

Add group type access for project.

group_type_access_get_all(context, type_id)

Get all group type access of a group type.

group_type_access_remove(context, type_id, project_id)

Remove group type access for project.

group_type_create(context, values, projects=None)

Create a new group type.

group_type_destroy(context, id)

Delete a group type.

group_type_get(context, id, inactive=False, expected_fields=None)

Get group type by id.

Parameters:
  • context – context to query under
  • id – Group type id to get.
  • inactive – Consider inactive group types when searching
  • expected_fields – Return those additional fields. Supported fields are: projects.
Returns:

group type

group_type_get_all(context, inactive=False, filters=None, marker=None, limit=None, sort_keys=None, sort_dirs=None, offset=None, list_result=False)

Get all group types.

Parameters:
  • context – context to query under
  • inactive – Include inactive group types to the result set
  • filters – Filters for the query in the form of key/value.
  • marker – the last item of the previous page, used to determine the next page of results to return
  • limit – maximum number of items to return
  • sort_keys – list of attributes by which results should be sorted, paired with corresponding item in sort_dirs
  • sort_dirs – list of directions in which results should be sorted, paired with corresponding item in sort_keys
  • list_result
    For compatibility, if list_result = True, return a list
    instead of dict.
    is_public:Filter group types based on visibility:
    • True: List public group types only
    • False: List private group types only
    • None: List both public and private group types
Returns:

list/dict of matching group types

group_type_get_by_name(context, name)

Get group type by name.

group_type_specs_delete(context, group_type_id, key)

Delete the given group specs item.

group_type_specs_get(context, group_type_id)

Get all group specs for a group type.

group_type_specs_update_or_create(context, group_type_id, group_specs)

Create or update group type specs.

This adds or modifies the key/value pairs specified in the group specs dict argument.

group_type_update(context, group_type_id, values)
group_types_get_by_name_or_id(context, group_type_list)

Get group types by name or id.

group_update(context, group_id, values)

Set the given properties on a group and update it.

Raises NotFound if group does not exist.

group_volume_type_mapping_create(context, group_id, volume_type_id)

Create a group volume_type mapping entry.

image_volume_cache_create(context, host, cluster_name, image_id, image_updated_at, volume_id, size)

Create a new image volume cache entry.

image_volume_cache_delete(context, volume_id)

Delete an image volume cache entry specified by volume id.

image_volume_cache_get_all(context, **filters)

Query for all image volume cache entry for a host.

image_volume_cache_get_and_update_last_used(context, image_id, **filters)

Query for an image volume cache entry.

image_volume_cache_get_by_volume_id(context, volume_id)

Query to see if a volume id is an image-volume contained in the cache

image_volume_cache_include_in_cluster(context, cluster, partial_rename=True, **filters)

Include in cluster image volume cache entries matching the filters.

When partial_rename is set we will not set the cluster_name with cluster parameter value directly, we’ll replace provided cluster_name or host filter value with cluster instead.

This is useful when we want to replace just the cluster name but leave the backend and pool information as it is. If we are using cluster_name to filter, we’ll use that same DB field to replace the cluster value and leave the rest as it is. Likewise if we use the host to filter.

Returns the number of volumes that have been changed.

is_backend_frozen(context, host, cluster_name)

Check if a storage backend is frozen based on host and cluster_name.

is_orm_value(obj)

Check if object is an ORM field.

message_create(context, values)

Creates a new message with the specified values.

message_destroy(context, message_id)

Deletes message with the specified ID.

message_get(context, message_id)

Return a message with the specified ID.

message_get_all(context, filters=None, marker=None, limit=None, offset=None, sort_keys=None, sort_dirs=None)
migrate_add_message_prefix(context, max_count, force=False)

Change Message event ids to start with the VOLUME_ prefix.

Parameters:
  • max_count – The maximum number of messages to consider in this run.
  • force – Ignored in this migration
Returns:

number of messages needing migration, number of messages migrated (both will always be less than max_count).

migrate_consistencygroups_to_groups(context, max_count, force=False)

Migrage CGs to generic volume groups

purge_deleted_rows(context, age_in_days)

Purge deleted rows older than given age from cinder tables

Raises InvalidParameterValue if age_in_days is incorrect. :returns: number of deleted rows

qos_specs_associate(context, qos_specs_id, type_id)

Associate qos_specs from volume type.

qos_specs_associations_get(context, qos_specs_id)

Get all associated volume types for a given qos_specs.

qos_specs_create(context, values)

Create a qos_specs.

qos_specs_delete(context, qos_specs_id)

Delete the qos_specs.

qos_specs_disassociate(context, qos_specs_id, type_id)

Disassociate qos_specs from volume type.

qos_specs_disassociate_all(context, qos_specs_id)

Disassociate qos_specs from all entities.

qos_specs_get(context, qos_specs_id)

Get all specification for a given qos_specs.

qos_specs_get_all(context, filters=None, marker=None, limit=None, offset=None, sort_keys=None, sort_dirs=None)

Get all qos_specs.

qos_specs_get_by_name(context, name)

Get all specification for a given qos_specs.

qos_specs_item_delete(context, qos_specs_id, key)

Delete specified key in the qos_specs.

qos_specs_update(context, qos_specs_id, specs)

Update qos specs.

This adds or modifies the key/value pairs specified in the specs dict argument for a given qos_specs.

quota_allocated_get_all_by_project(context, project_id)

Retrieve all allocated quotas associated with a given project.

quota_allocated_update(context, project_id, resource, allocated)

Update allocated quota to subprojects or raise if it does not exist.

Raises:cinder.exception.ProjectQuotaNotFound
quota_class_create(context, class_name, resource, limit)

Create a quota class for the given name and resource.

quota_class_destroy(context, class_name, resource)

Destroy the quota class or raise if it does not exist.

quota_class_destroy_all_by_name(context, class_name)

Destroy all quotas associated with a given quota class.

quota_class_get(context, class_name, resource)

Retrieve a quota class or raise if it does not exist.

quota_class_get_all_by_name(context, class_name)

Retrieve all quotas associated with a given quota class.

quota_class_get_defaults(context)

Retrieve all default quotas.

quota_class_update(context, class_name, resource, limit)

Update a quota class or raise if it does not exist.

quota_class_update_resource(context, resource, new_resource)

Update resource name in quota_class.

quota_create(context, project_id, resource, limit, allocated=0)

Create a quota for the given project and resource.

quota_destroy(context, project_id, resource)

Destroy the quota or raise if it does not exist.

quota_destroy_by_project(context, project_id)

Destroy all quotas associated with a given project.

quota_get(context, project_id, resource)

Retrieve a quota or raise if it does not exist.

quota_get_all_by_project(context, project_id)

Retrieve all quotas associated with a given project.

quota_reserve(context, resources, quotas, deltas, expire, until_refresh, max_age, project_id=None, is_allocated_reserve=False)

Check quotas and create appropriate reservations.

quota_update(context, project_id, resource, limit)

Update a quota or raise if it does not exist.

quota_update_resource(context, old_res, new_res)

Update resource of quotas.

quota_usage_get(context, project_id, resource)

Retrieve a quota usage or raise if it does not exist.

quota_usage_get_all_by_project(context, project_id)

Retrieve all usage associated with a given resource.

quota_usage_update_resource(context, old_res, new_res)

Update resource field in quota_usages.

reservation_commit(context, reservations, project_id=None)

Commit quota reservations.

reservation_expire(context)

Roll back any expired reservations.

reservation_rollback(context, reservations, project_id=None)

Roll back quota reservations.

resource_exists(context, model, resource_id)
service_create(context, values)

Create a service from the values dictionary.

service_destroy(context, service_id)

Destroy the service or raise if it does not exist.

service_get(context, service_id=None, backend_match_level=None, **filters)

Get a service that matches the criteria.

A possible filter is is_up=True and it will filter nodes that are down.

Parameters:
  • service_id – Id of the service.
  • filters – Filters for the query in the form of key/value.
  • backend_match_level – ‘pool’, ‘backend’, or ‘host’ for host and cluster filters (as defined in _filter_host method)
Raises:

ServiceNotFound – If service doesn’t exist.

service_get_all(context, backend_match_level=None, **filters)

Get all services that match the criteria.

A possible filter is is_up=True and it will filter nodes that are down, as well as host_or_cluster, that lets you look for services using both of these properties.

Parameters:
  • filters – Filters for the query in the form of key/value arguments.
  • backend_match_level – ‘pool’, ‘backend’, or ‘host’ for host and cluster filters (as defined in _filter_host method)
service_update(context, service_id, values)

Set the given properties on an service and update it.

Raises NotFound if service does not exist.

snapshot_create(context, values)

Create a snapshot from the values dictionary.

snapshot_data_get_for_project(context, project_id, volume_type_id=None)

Get count and gigabytes used for snapshots for specified project.

snapshot_destroy(context, snapshot_id)

Destroy the snapshot or raise if it does not exist.

snapshot_get(context, snapshot_id)

Get a snapshot or raise if it does not exist.

snapshot_get_all(context, filters=None, marker=None, limit=None, sort_keys=None, sort_dirs=None, offset=None)

Get all snapshots.

snapshot_get_all_active_by_window(context, begin, end=None, project_id=None)

Get all the snapshots inside the window.

Specifying a project_id will filter for a certain project.

snapshot_get_all_by_host(context, host, filters=None)

Get all snapshots belonging to a host.

Parameters:
  • host – Include include snapshots only for specified host.
  • filters – Filters for the query in the form of key/value.
snapshot_get_all_by_project(context, project_id, filters=None, marker=None, limit=None, sort_keys=None, sort_dirs=None, offset=None)

Get all snapshots belonging to a project.

snapshot_get_all_for_cgsnapshot(context, project_id)

Get all snapshots belonging to a cgsnapshot.

snapshot_get_all_for_group_snapshot(context, group_snapshot_id)

Get all snapshots belonging to a group snapshot.

snapshot_get_all_for_volume(context, volume_id)

Get all snapshots for a volume.

snapshot_metadata_delete(context, snapshot_id, key)

Delete the given metadata item.

snapshot_metadata_get(context, snapshot_id)

Get all metadata for a snapshot.

snapshot_metadata_update(context, snapshot_id, metadata, delete)

Update metadata if it exists, otherwise create it.

snapshot_update(context, snapshot_id, values)

Set the given properties on an snapshot and update it.

Raises NotFound if snapshot does not exist.

transfer_accept(context, transfer_id, user_id, project_id)

Accept a volume transfer.

transfer_create(context, values)

Create an entry in the transfers table.

transfer_destroy(context, transfer_id)

Destroy a record in the volume transfer table.

transfer_get(context, transfer_id)

Get a volume transfer record or raise if it does not exist.

transfer_get_all(context)

Get all volume transfer records.

transfer_get_all_by_project(context, project_id)

Get all volume transfer records for specified project.

volume_admin_metadata_delete(context, volume_id, key)

Delete the given metadata item.

volume_admin_metadata_get(context, volume_id)

Get all administration metadata for a volume.

volume_admin_metadata_update(context, volume_id, metadata, delete, add=True, update=True)

Update metadata if it exists, otherwise create it.

volume_attach(context, values)

Attach a volume.

volume_attached(context, volume_id, instance_id, host_name, mountpoint, attach_mode='rw')

Ensure that a volume is set as attached.

volume_attachment_get(context, attachment_id)
volume_attachment_get_all(context, filters=None, marker=None, limit=None, offset=None, sort_keys=None, sort_dirs=None)
volume_attachment_get_all_by_host(context, host, filters=None)
volume_attachment_get_all_by_instance_uuid(context, instance_uuid, filters=None)
volume_attachment_get_all_by_project(context, project_id, filters=None, marker=None, limit=None, offset=None, sort_keys=None, sort_dirs=None)
volume_attachment_get_all_by_volume_id(context, volume_id, session=None)
volume_attachment_update(context, attachment_id, values)
volume_create(context, values)

Create a volume from the values dictionary.

volume_data_get_for_host(context, host, count_only=False)

Get (volume_count, gigabytes) for project.

volume_data_get_for_project(context, project_id)

Get (volume_count, gigabytes) for project.

volume_destroy(context, volume_id)

Destroy the volume or raise if it does not exist.

volume_detached(context, volume_id, attachment_id)

Ensure that a volume is set as detached.

volume_encryption_metadata_get(context, volume_id, session=None)
volume_get(context, volume_id)

Get a volume or raise if it does not exist.

volume_get_all(context, marker=None, limit=None, sort_keys=None, sort_dirs=None, filters=None, offset=None)

Get all volumes.

volume_get_all_active_by_window(context, begin, end=None, project_id=None)

Get all the volumes inside the window.

Specifying a project_id will filter for a certain project.

volume_get_all_by_generic_group(context, group_id, filters=None)

Get all volumes belonging to a generic volume group.

volume_get_all_by_group(context, group_id, filters=None)

Get all volumes belonging to a consistency group.

volume_get_all_by_host(context, host, filters=None)

Get all volumes belonging to a host.

volume_get_all_by_project(context, project_id, marker, limit, sort_keys=None, sort_dirs=None, filters=None, offset=None)

Get all volumes belonging to a project.

volume_glance_metadata_bulk_create(context, volume_id, metadata)

Add Glance metadata for specified volume (multiple pairs).

volume_glance_metadata_copy_from_volume_to_volume(context, src_volume_id, volume_id)

Update the Glance metadata for a volume.

Update the Glance metadata for a volume by copying all of the key:value pairs from the originating volume.

This is so that a volume created from the volume (clone) will retain the original metadata.

volume_glance_metadata_copy_to_snapshot(context, snapshot_id, volume_id)

Update the Glance metadata for a snapshot.

This will copy all of the key:value pairs from the originating volume, to ensure that a volume created from the snapshot will retain the original metadata.

volume_glance_metadata_copy_to_volume(context, volume_id, snapshot_id)

Update the Glance metadata from a volume (created from a snapshot).

This will copy all of the key:value pairs from the originating snapshot, to ensure that the Glance metadata from the original volume is retained.

volume_glance_metadata_create(context, volume_id, key, value)

Update the Glance metadata for the specified volume.

volume_glance_metadata_delete_by_snapshot(context, snapshot_id)

Delete the glance metadata for a snapshot.

volume_glance_metadata_delete_by_volume(context, volume_id)

Delete the glance metadata for a volume.

volume_glance_metadata_get(context, volume_id)

Return the glance metadata for a volume.

volume_glance_metadata_get_all(context)

Return the glance metadata for all volumes.

volume_glance_metadata_list_get(context, volume_id_list)

Return the glance metadata for a volume list.

volume_has_attachments_filter()
volume_has_snapshots_filter()
volume_has_snapshots_in_a_cgsnapshot_filter()
volume_has_undeletable_snapshots_filter()
volume_include_in_cluster(context, cluster, partial_rename=True, **filters)

Include all volumes matching the filters into a cluster.

When partial_rename is set we will not set the cluster_name with cluster parameter value directly, we’ll replace provided cluster_name or host filter value with cluster instead.

This is useful when we want to replace just the cluster name but leave the backend and pool information as it is. If we are using cluster_name to filter, we’ll use that same DB field to replace the cluster value and leave the rest as it is. Likewise if we use the host to filter.

Returns the number of volumes that have been changed.

volume_metadata_delete(context, volume_id, key, meta_type=<METADATA_TYPES.user: 1>)

Delete the given metadata item.

volume_metadata_get(context, volume_id)

Get all metadata for a volume.

volume_metadata_update(context, volume_id, metadata, delete, meta_type=<METADATA_TYPES.user: 1>)

Update metadata if it exists, otherwise create it.

volume_qos_allows_retype(new_vol_type)
volume_snapshot_glance_metadata_get(context, snapshot_id)

Return the Glance metadata for the specified snapshot.

volume_type_access_add(context, type_id, project_id)

Add volume type access for project.

volume_type_access_get_all(context, type_id)

Get all volume type access of a volume type.

volume_type_access_remove(context, type_id, project_id)

Remove volume type access for project.

volume_type_create(context, values, projects=None)

Create a new volume type.

volume_type_destroy(context, id)

Delete a volume type.

volume_type_encryption_create(context, volume_type_id, encryption_specs)
volume_type_encryption_delete(context, volume_type_id)
volume_type_encryption_get(context, volume_type_id, session=None)
volume_type_encryption_update(context, volume_type_id, encryption_specs)
volume_type_encryption_volume_get(context, volume_type_id, session=None)
volume_type_extra_specs_delete(context, volume_type_id, key)

Delete the given extra specs item.

volume_type_extra_specs_get(context, volume_type_id)

Get all extra specs for a volume type.

volume_type_extra_specs_update_or_create(context, volume_type_id, extra_specs)

Create or update volume type extra specs.

This adds or modifies the key/value pairs specified in the extra specs dict argument.

volume_type_get(context, id, inactive=False, expected_fields=None)

Get volume type by id.

Parameters:
  • context – context to query under
  • id – Volume type id to get.
  • inactive – Consider inactive volume types when searching
  • expected_fields – Return those additional fields. Supported fields are: projects.
Returns:

volume type

volume_type_get_all(context, inactive=False, filters=None, marker=None, limit=None, sort_keys=None, sort_dirs=None, offset=None, list_result=False)

Get all volume types.

Parameters:
  • context – context to query under
  • inactive – Include inactive volume types to the result set
  • filters – Filters for the query in the form of key/value.
  • marker – the last item of the previous page, used to determine the next page of results to return
  • limit – maximum number of items to return
  • sort_keys – list of attributes by which results should be sorted, paired with corresponding item in sort_dirs
  • sort_dirs – list of directions in which results should be sorted, paired with corresponding item in sort_keys
  • list_result
    For compatibility, if list_result = True, return a list
    instead of dict.
    is_public:Filter volume types based on visibility:
    • True: List public volume types only
    • False: List private volume types only
    • None: List both public and private volume types
Returns:

list/dict of matching volume types

volume_type_get_all_by_group(context, group_id)

Get all volumes in a group.

volume_type_get_by_name(context, name)

Get volume type by name.

volume_type_qos_associate(context, type_id, qos_specs_id)

Associate a volume type with specific qos specs.

volume_type_qos_associations_get(context, qos_specs_id, inactive=False)

Get volume types that are associated with specific qos specs.

volume_type_qos_disassociate(context, qos_specs_id, type_id)

Disassociate a volume type from specific qos specs.

volume_type_qos_disassociate_all(context, qos_specs_id)

Disassociate all volume types from specific qos specs.

volume_type_qos_specs_get(context, type_id)

Get all qos specs for given volume type.

volume_type_update(context, volume_type_id, values)
volume_types_get_by_name_or_id(context, volume_type_list)

Get volume types by name or id.

volume_update(context, volume_id, values)

Set the given properties on a volume and update it.

Raises NotFound if volume does not exist.

volume_update_status_based_on_attachment(context, volume_id)

Update volume status according to attached instance id

volumes_update(context, values_list)

Set the given properties on a list of volumes and update them.

Raises NotFound if a volume does not exist.

worker_claim_for_cleanup(context, claimer_id, orm_worker)

Soft delete a worker, change the service_id and update the worker.

worker_create(context, **values)

Create a worker entry from optional arguments.

worker_destroy(context, **filters)

Delete a worker (no soft delete).

worker_get(context, **filters)

Get a worker or raise exception if it does not exist.

worker_get_all(context, until=None, db_filters=None, **filters)

Get all workers that match given criteria.

worker_update(context, id, filters=None, orm_worker=None, **values)

Update a worker with given values.

workers_init()

Check if DB supports subsecond resolution and set global flag.

MySQL 5.5 doesn’t support subsecond resolution in datetime fields, so we have to take it into account when working with the worker’s table.

Once we drop support for MySQL 5.5 we can remove this method.

The Sqlalchemy Driver

The cinder.db.sqlalchemy.api Module

Implementation of SQLAlchemy backend.

The cinder.db.sqlalchemy.models Module

SQLAlchemy models for cinder data.

class AttachmentSpecs(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents attachment specs as k/v pairs for a volume_attachment.

attachment_id
created_at
deleted
deleted_at
id
key
updated_at
value
volume_attachment
class Backup(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents a backup of a volume to Swift.

availability_zone
container
created_at
data_timestamp
deleted
deleted_at
display_description
display_name
fail_reason
host
id
name
num_dependent_backups
object_count
parent_id
project_id
restore_volume_id
service
service_metadata
size
snapshot_id
status
temp_snapshot_id
temp_volume_id
updated_at
user_id
validate_fail_reason(key, fail_reason)
volume_id
class Cgsnapshot(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents a cgsnapshot.

consistencygroup
consistencygroup_id
created_at
deleted
deleted_at
description
id
name
project_id
status
updated_at
user_id
class CinderBase

Bases: oslo_db.sqlalchemy.models.TimestampMixin, oslo_db.sqlalchemy.models.ModelBase

Base class for Cinder Models.

delete(session)

Delete this object.

static delete_values()
deleted = Column(None, Boolean(), table=None, default=ColumnDefault(False))
deleted_at = Column(None, DateTime(), table=None)
metadata = None
class Cluster(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents a cluster of hosts.

active_backend_id
binary
created_at
static delete_values()
deleted
deleted_at
disabled
disabled_reason
frozen
id
last_heartbeat
name
num_down_hosts
num_hosts
race_preventer
replication_status
updated_at
class ConsistencyGroup(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents a consistencygroup.

availability_zone
cgsnapshot_id
cluster_name
created_at
deleted
deleted_at
description
host
id
name
project_id
source_cgid
status
updated_at
user_id
volume_type_id
class DriverInitiatorData(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, oslo_db.sqlalchemy.models.TimestampMixin, oslo_db.sqlalchemy.models.ModelBase

Represents private key-value pair specific an initiator for drivers

created_at
id
initiator
key
namespace
updated_at
value
class Encryption(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents encryption requirement for a volume type.

Encryption here is a set of performance characteristics describing cipher, provider, and key_size for a certain volume type.

cipher
control_location
created_at
deleted
deleted_at
encryption_id
key_size
provider
updated_at
volume_type
volume_type_id
class Group(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents a generic volume group.

availability_zone
cluster_name
created_at
deleted
deleted_at
description
group_snapshot_id
group_type_id
host
id
name
project_id
source_group_id
status
updated_at
user_id
class GroupSnapshot(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents a group snapshot.

created_at
deleted
deleted_at
description
group
group_id
group_type_id
id
name
project_id
status
updated_at
user_id
class GroupTypeProjects(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represent projects associated group_types.

created_at
deleted
deleted_at
group_type
group_type_id
id
project_id
updated_at
class GroupTypeSpecs(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents additional specs as key/value pairs for a group_type.

created_at
deleted
deleted_at
group_type
group_type_id
id
key
updated_at
value
class GroupTypes(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represent possible group_types of groups offered.

created_at
deleted
deleted_at
description
groups
id
is_public
name
updated_at
class GroupVolumeTypeMapping(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represent mapping between groups and volume_types.

created_at
deleted
deleted_at
group
group_id
id
updated_at
volume_type_id
class ImageVolumeCacheEntry(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, oslo_db.sqlalchemy.models.ModelBase

Represents an image volume cache entry

cluster_name
host
id
image_id
image_updated_at
last_used
size
volume_id
class Message(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents a message

created_at
deleted
deleted_at
event_id
expires_at
id
message_level
project_id
request_id
resource_type
resource_uuid
updated_at
class QualityOfServiceSpecs(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents QoS specs as key/value pairs.

QoS specs is standalone entity that can be associated/disassociated with volume types (one to many relation). Adjacency list relationship pattern is used in this model in order to represent following hierarchical data with in flat table, e.g, following structure:

qos-specs-1  'Rate-Limit'
     |
     +------>  consumer = 'front-end'
     +------>  total_bytes_sec = 1048576
     +------>  total_iops_sec = 500

qos-specs-2  'QoS_Level1'
     |
     +------>  consumer = 'back-end'
     +------>  max-iops =  1000
     +------>  min-iops = 200

is represented by:

  id       specs_id       key                  value
------     --------   -------------            -----
UUID-1     NULL       QoSSpec_Name           Rate-Limit
UUID-2     UUID-1       consumer             front-end
UUID-3     UUID-1     total_bytes_sec        1048576
UUID-4     UUID-1     total_iops_sec           500
UUID-5     NULL       QoSSpec_Name           QoS_Level1
UUID-6     UUID-5       consumer             back-end
UUID-7     UUID-5       max-iops               1000
UUID-8     UUID-5       min-iops               200
created_at
deleted
deleted_at
id
key
specs
specs_id
updated_at
value
vol_types
class Quota(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents a single quota override for a project.

If there is no row for a given project id and resource, then the default for the quota class is used. If there is no row for a given quota class and resource, then the default for the deployment is used. If the row is present but the hard limit is Null, then the resource is unlimited.

allocated
created_at
deleted
deleted_at
hard_limit
id
project_id
resource
updated_at
class QuotaClass(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents a single quota override for a quota class.

If there is no row for a given quota class and resource, then the default for the deployment is used. If the row is present but the hard limit is Null, then the resource is unlimited.

class_name
created_at
deleted
deleted_at
hard_limit
id
resource
updated_at
class QuotaUsage(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents the current usage for a given resource.

created_at
deleted
deleted_at
id
in_use
project_id
reserved
resource
total
until_refresh
updated_at
class Reservation(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents a resource reservation for quotas.

allocated_id
created_at
deleted
deleted_at
delta
expire
id
project_id
quota
resource
updated_at
usage
usage_id
uuid
class Service(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents a running service on a host.

active_backend_id
availability_zone
binary
cluster
cluster_name
created_at
deleted
deleted_at
disabled
disabled_reason
frozen
host
id
modified_at
object_current_version
replication_status
report_count
rpc_current_version
topic
updated_at
class Snapshot(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents a snapshot of volume.

cgsnapshot
cgsnapshot_id
created_at
deleted
deleted_at
display_description
display_name
encryption_key_id
group_snapshot
group_snapshot_id
id
name
progress
project_id
provider_auth
provider_id
provider_location
status
updated_at
user_id
volume
volume_id
volume_name
volume_size
volume_type_id
class SnapshotMetadata(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents a metadata key/value pair for a snapshot.

created_at
deleted
deleted_at
id
key
snapshot
snapshot_id
updated_at
value
class Transfer(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents a volume transfer request.

created_at
crypt_hash
deleted
deleted_at
display_name
expires_at
id
salt
updated_at
volume
volume_id
class Volume(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents a block storage device that can be attached to a vm.

attach_status
availability_zone
bootable
cluster_name
consistencygroup
consistencygroup_id
created_at
deleted
deleted_at
display_description
display_name
ec2_id
encryption_key_id
group
group_id
host
id
launched_at
migration_status
multiattach
name
name_id
previous_status
project_id
provider_auth
provider_geometry
provider_id
provider_location
replication_driver_data
replication_extended_status
replication_status
scheduled_at
size
snapshot_id
source_volid
status
terminated_at
updated_at
user_id
volume_type_id
class VolumeAdminMetadata(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents an administrator metadata key/value pair for a volume.

created_at
deleted
deleted_at
id
key
updated_at
value
volume
volume_id
class VolumeAttachment(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents a volume attachment for a vm.

attach_mode
attach_status
attach_time
attached_host
created_at
deleted
deleted_at
detach_time
id
instance_uuid
mountpoint
updated_at
volume
volume_id
class VolumeGlanceMetadata(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Glance metadata for a bootable volume.

created_at
deleted
deleted_at
id
key
snapshot_id
updated_at
value
volume
volume_id
class VolumeMetadata(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents a metadata key/value pair for a volume.

created_at
deleted
deleted_at
id
key
updated_at
value
volume
volume_id
class VolumeTypeExtraSpecs(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents additional specs as key/value pairs for a volume_type.

created_at
deleted
deleted_at
id
key
updated_at
value
volume_type
volume_type_id
class VolumeTypeProjects(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represent projects associated volume_types.

created_at
deleted
deleted_at
id
project_id
updated_at
volume_type
volume_type_id
class VolumeTypes(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represent possible volume_types of volumes offered.

created_at
deleted
deleted_at
description
id
is_public
name
qos_specs_id
updated_at
volumes
class Worker(**kwargs)

Bases: sqlalchemy.ext.declarative.api.Base, cinder.db.sqlalchemy.models.CinderBase

Represents all resources that are being worked on by a node.

cleaning = False
created_at
deleted
deleted_at
id
race_preventer
resource_id
resource_type
service
service_id
status
updated_at

Tests

Tests are lacking for the db api layer and for the sqlalchemy driver. Failures in the drivers would be detected in other test cases, though.