The Database Layer

The cinder.db.api Module

Defines interface for DB access.

The underlying driver is loaded as a LazyPluggable.

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

backend:string to lookup in the list of LazyPluggable backends. sqlalchemy is the only supported backend right now.
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)
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)

Get a backup or raise if it does not exist.

backup_get_all(context)

Get all backups.

backup_get_all_by_host(context, host)

Get all backups belonging to a host.

backup_get_all_by_project(context, project_id)

Get all backups belonging to a project.

backup_update(context, backup_id, values)

Set the given properties on a backup and update it.

Raises NotFound if backup does not exist.

finish_volume_migration(context, src_vol_id, dest_vol_id)

Perform database updates upon completion of volume migration.

iscsi_target_count_by_host(context, host)

Return count of export devices.

iscsi_target_create_safe(context, values)

Create an iscsi_target from the values dictionary.

The device is not returned. If the create violates the unique constraints because the iscsi_target and host already exist, no exception is raised.

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, inactive=False, filters=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_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_default(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_create(context, project_id, resource, limit)

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_all_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)

Check quotas and create appropriate reservations.

quota_update(context, project_id, resource, limit)

Update a quota or raise if it does not exist.

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.

reservation_commit(context, reservations, project_id=None)

Commit quota reservations.

reservation_create(context, uuid, usage, project_id, resource, delta, expire)

Create a reservation for the given project and resource.

reservation_destroy(context, uuid)

Destroy the reservation or raise if it does not exist.

reservation_expire(context)

Roll back any expired reservations.

reservation_get(context, uuid)

Retrieve a reservation or raise if it does not exist.

reservation_get_all_by_project(context, project_id)

Retrieve all reservations associated with a given project.

reservation_rollback(context, reservations, project_id=None)

Roll back quota reservations.

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)

Get a service or raise if it does not exist.

service_get_all(context, disabled=None)

Get all services.

service_get_all_by_host(context, host)

Get all services for a given host.

service_get_all_by_topic(context, topic)

Get all services for a given topic.

service_get_all_volume_sorted(context)

Get all volume services sorted by volume count.

Returns:a list of (Service, volume_count) tuples.
service_get_by_args(context, host, binary)

Get the state of an service by node name and binary.

service_get_by_host_and_topic(context, host, topic)

Get a service by host it’s on and topic it listens to.

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_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(context)

Get all snapshots.

snapshot_get_all_by_project(context, project_id)

Get all snapshots belonging to a project.

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)

Update metadata if it exists, otherwise create it.

volume_allocate_iscsi_target(context, volume_id, host)

Atomically allocate a free iscsi_target from the pool.

volume_attached(context, volume_id, instance_id, host_name, mountpoint)

Ensure that a volume is set as attached.

volume_create(context, values)

Create a volume from the values dictionary.

volume_data_get_for_host(context, host)

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)

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_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(context, marker, limit, sort_key, sort_dir, filters=None)

Get all volumes.

volume_get_all_by_host(context, host)

Get all volumes belonging to a host.

volume_get_all_by_instance_uuid(context, instance_uuid)

Get all volumes belonging to a instance.

volume_get_all_by_project(context, project_id, marker, limit, sort_key, sort_dir, filters=None)

Get all volumes belonging to a project.

volume_get_iscsi_target_num(context, volume_id)

Get the target num (tid) allocated to the volume.

volume_glance_metadata_copy_from_volume_to_volume(context, src_volume_id, volume_id)

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_metadata_delete(context, volume_id, key)

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)

Update metadata if it exists, otherwise create it.

volume_snapshot_glance_metadata_get(context, snapshot_id)

Return the Glance metadata for the specified snapshot.

volume_type_create(context, values)

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)

Get volume type by id.

volume_type_get_all(context, inactive=False)

Get all volume types.

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_update(context, volume_id, values)

Set the given properties on an volume and update it.

Raises NotFound if volume does not exist.

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 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
deleted
deleted_at
display_description
display_name
fail_reason
host
id
name
object_count
project_id
service
service_metadata
size
status
updated_at
user_id
volume_id
class CinderBase

Bases: cinder.openstack.common.db.sqlalchemy.models.TimestampMixin, cinder.openstack.common.db.sqlalchemy.models.ModelBase

Base class for Cinder Models.

delete(session=None)

Delete this object.

deleted = Column(None, Boolean(), table=None, default=ColumnDefault(False))
deleted_at = Column(None, DateTime(), table=None)
metadata = None
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
key_size
provider
updated_at
volume_type
volume_type_id
class IscsiTarget(**kwargs)

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

Represents an iscsi target for a given host.

created_at
deleted
deleted_at
host
id
target_num
updated_at
volume
volume_id
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.

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.

created_at
deleted
deleted_at
delta
expire
id
project_id
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.

availability_zone
binary
created_at
deleted
deleted_at
disabled
disabled_reason
host
id
report_count
topic
updated_at
class Snapshot(**kwargs)

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

Represents a snapshot of volume.

created_at
deleted
deleted_at
display_description
display_name
encryption_key_id
id
name
progress
project_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
attach_time
attached_host
availability_zone
bootable
created_at
deleted
deleted_at
display_description
display_name
ec2_id
encryption_key_id
host
id
instance_uuid
launched_at
migration_status
mountpoint
name
name_id
project_id
provider_auth
provider_geometry
provider_location
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 a administrator metadata key/value pair for a volume.

created_at
deleted
deleted_at
id
key
updated_at
value
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 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
id
name
qos_specs_id
updated_at
volumes
register_models()

Register Models and create metadata.

Called from cinder.db.sqlalchemy.__init__ as part of loading the driver, it will never need to be called explicitly elsewhere unless the connection is lost and needs to be reestablished.

The cinder.db.sqlalchemy.session Module

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.