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.

Condition.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.

Not.get_filter(model, field=None)
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_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.

cgsnapshot_create(context, values)

Create a cgsnapshot from the values dictionary.

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.

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)

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_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 DriverPrivateData that has the specified key

driver_initiator_data_update(context, initiator, namespace, updates)

Create DriverPrivateData from the values dictionary.

get_booleans_for_table(table_name)
get_by_id(context, model, id, *args, **kwargs)
get_model_for_versioned_object(versioned_object)
image_volume_cache_create(context, host, 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_for_host(context, host)

Query for all image volume cache entry for a host.

image_volume_cache_get_and_update_last_used(context, image_id, host)

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

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)
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_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_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.

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, filters=None)

Get all services.

service_get_all_by_binary(context, binary, disabled=None)

Get all services for a given binary.

service_get_all_by_topic(context, topic, disabled=None)

Get all services for a given topic.

service_get_by_args(context, host, binary)

Get the state of a 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, filters=None, marker=None, limit=None, sort_keys=None, sort_dirs=None, offset=None)

Get all snapshots.

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

Get all snapshots for a volume.

snapshot_get_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_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, session=None)
volume_attachment_get_by_host(context, volume_id, host)
volume_attachment_get_by_instance_uuid(context, volume_id, instance_uuid)
volume_attachment_get_used_by_volume_id(context, volume_id)
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_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_keys=None, sort_dirs=None, filters=None, offset=None)

Get all volumes.

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

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.

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

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

Represents a cgsnapshot.

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

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

Base class for Cinder Models.

CinderBase.delete(session)

Delete this object.

CinderBase.deleted = Column(None, Boolean(), table=None, default=ColumnDefault(False))
CinderBase.deleted_at = Column(None, DateTime(), table=None)
CinderBase.metadata = None
class ConsistencyGroup(**kwargs)

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

Represents a consistencygroup.

ConsistencyGroup.availability_zone None
ConsistencyGroup.cgsnapshot_id None
ConsistencyGroup.created_at None
ConsistencyGroup.deleted None
ConsistencyGroup.deleted_at None
ConsistencyGroup.description None
ConsistencyGroup.host None
ConsistencyGroup.id None
ConsistencyGroup.name None
ConsistencyGroup.project_id None
ConsistencyGroup.source_cgid None
ConsistencyGroup.status None
ConsistencyGroup.updated_at None
ConsistencyGroup.user_id None
ConsistencyGroup.volume_type_id None
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

DriverInitiatorData.created_at None
DriverInitiatorData.id None
DriverInitiatorData.initiator None
DriverInitiatorData.key None
DriverInitiatorData.namespace None
DriverInitiatorData.updated_at None
DriverInitiatorData.value 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.

Encryption.cipher None
Encryption.control_location None
Encryption.created_at None
Encryption.deleted None
Encryption.deleted_at None
Encryption.encryption_id None
Encryption.key_size None
Encryption.provider None
Encryption.updated_at None
Encryption.volume_type None
Encryption.volume_type_id None
class ImageVolumeCacheEntry(**kwargs)

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

Represents an image volume cache entry

ImageVolumeCacheEntry.host None
ImageVolumeCacheEntry.id None
ImageVolumeCacheEntry.image_id None
ImageVolumeCacheEntry.image_updated_at None
ImageVolumeCacheEntry.last_used None
ImageVolumeCacheEntry.size None
ImageVolumeCacheEntry.volume_id None
class Message(**kwargs)

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

Represents a message

Message.created_at None
Message.deleted None
Message.deleted_at None
Message.event_id None
Message.expires_at None
Message.id None
Message.message_level None
Message.project_id None
Message.request_id None
Message.resource_type None
Message.resource_uuid None
Message.updated_at None
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
QualityOfServiceSpecs.created_at None
QualityOfServiceSpecs.deleted None
QualityOfServiceSpecs.deleted_at None
QualityOfServiceSpecs.id None
QualityOfServiceSpecs.key None
QualityOfServiceSpecs.specs None
QualityOfServiceSpecs.specs_id None
QualityOfServiceSpecs.updated_at None
QualityOfServiceSpecs.value None
QualityOfServiceSpecs.vol_types None
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.

Quota.allocated None
Quota.created_at None
Quota.deleted None
Quota.deleted_at None
Quota.hard_limit None
Quota.id None
Quota.project_id None
Quota.resource None
Quota.updated_at None
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.

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

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

Represents the current usage for a given resource.

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

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

Represents a resource reservation for quotas.

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

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

Represents a running service on a host.

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

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

Represents a snapshot of volume.

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

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

Represents a metadata key/value pair for a snapshot.

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

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

Represents a volume transfer request.

Transfer.created_at None
Transfer.crypt_hash None
Transfer.deleted None
Transfer.deleted_at None
Transfer.display_name None
Transfer.expires_at None
Transfer.id None
Transfer.salt None
Transfer.updated_at None
Transfer.volume None
Transfer.volume_id None
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.

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

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

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

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

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

Represents a volume attachment for a vm.

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

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

Glance metadata for a bootable volume.

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

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

Represents a metadata key/value pair for a volume.

VolumeMetadata.created_at None
VolumeMetadata.deleted None
VolumeMetadata.deleted_at None
VolumeMetadata.id None
VolumeMetadata.key None
VolumeMetadata.updated_at None
VolumeMetadata.value None
VolumeMetadata.volume None
VolumeMetadata.volume_id None
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.

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

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

Represent projects associated volume_types.

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

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

Represent possible volume_types of volumes offered.

VolumeTypes.created_at None
VolumeTypes.deleted None
VolumeTypes.deleted_at None
VolumeTypes.description None
VolumeTypes.id None
VolumeTypes.is_public None
VolumeTypes.name None
VolumeTypes.qos_specs_id None
VolumeTypes.updated_at None
VolumeTypes.volumes None
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.

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.