diff --git a/manila/db/api.py b/manila/db/api.py index da1b360043..ac59b27ab0 100644 --- a/manila/db/api.py +++ b/manila/db/api.py @@ -118,15 +118,6 @@ def service_get_all_by_host(context, host): return IMPL.service_get_all_by_host(context, host) -def service_get_all_volume_sorted(context): - """Get all volume services sorted by volume count. - - :returns: a list of (Service, volume_count) tuples. - - """ - return IMPL.service_get_all_volume_sorted(context) - - def service_get_all_share_sorted(context): """Get all share services sorted by share count. @@ -186,321 +177,6 @@ def migration_get_all_unconfirmed(context, confirm_window): ################### -def iscsi_target_count_by_host(context, host): - """Return count of export devices.""" - return IMPL.iscsi_target_count_by_host(context, host) - - -def 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. - - """ - return IMPL.iscsi_target_create_safe(context, values) - - -############### - -def volume_allocate_iscsi_target(context, volume_id, host): - """Atomically allocate a free iscsi_target from the pool.""" - return IMPL.volume_allocate_iscsi_target(context, volume_id, host) - - -def volume_attached(context, volume_id, instance_id, mountpoint): - """Ensure that a volume is set as attached.""" - return IMPL.volume_attached(context, volume_id, instance_id, mountpoint) - - -def volume_create(context, values): - """Create a volume from the values dictionary.""" - return IMPL.volume_create(context, values) - - -def volume_data_get_for_host(context, host, session=None): - """Get (volume_count, gigabytes) for project.""" - return IMPL.volume_data_get_for_host(context, - host, - session) - - -def volume_data_get_for_project(context, project_id, session=None): - """Get (volume_count, gigabytes) for project.""" - return IMPL.volume_data_get_for_project(context, - project_id, - session) - - -def volume_destroy(context, volume_id): - """Destroy the volume or raise if it does not exist.""" - return IMPL.volume_destroy(context, volume_id) - - -def volume_detached(context, volume_id): - """Ensure that a volume is set as detached.""" - return IMPL.volume_detached(context, volume_id) - - -def volume_get(context, volume_id): - """Get a volume or raise if it does not exist.""" - return IMPL.volume_get(context, volume_id) - - -def volume_get_all(context, marker, limit, sort_key, sort_dir): - """Get all volumes.""" - return IMPL.volume_get_all(context, marker, limit, sort_key, sort_dir) - - -def volume_get_all_by_host(context, host): - """Get all volumes belonging to a host.""" - return IMPL.volume_get_all_by_host(context, host) - - -def volume_get_all_by_instance_uuid(context, instance_uuid): - """Get all volumes belonging to a instance.""" - return IMPL.volume_get_all_by_instance_uuid(context, instance_uuid) - - -def volume_get_all_by_project(context, project_id, marker, limit, sort_key, - sort_dir): - """Get all volumes belonging to a project.""" - return IMPL.volume_get_all_by_project(context, project_id, marker, limit, - sort_key, sort_dir) - - -def volume_get_iscsi_target_num(context, volume_id): - """Get the target num (tid) allocated to the volume.""" - return IMPL.volume_get_iscsi_target_num(context, volume_id) - - -def volume_update(context, volume_id, values): - """Set the given properties on an volume and update it. - - Raises NotFound if volume does not exist. - - """ - return IMPL.volume_update(context, volume_id, values) - - -#################### - - -def snapshot_create(context, values): - """Create a snapshot from the values dictionary.""" - return IMPL.snapshot_create(context, values) - - -def snapshot_destroy(context, snapshot_id): - """Destroy the snapshot or raise if it does not exist.""" - return IMPL.snapshot_destroy(context, snapshot_id) - - -def snapshot_get(context, snapshot_id): - """Get a snapshot or raise if it does not exist.""" - return IMPL.snapshot_get(context, snapshot_id) - - -def snapshot_get_all(context): - """Get all snapshots.""" - return IMPL.snapshot_get_all(context) - - -def snapshot_get_all_by_project(context, project_id): - """Get all snapshots belonging to a project.""" - return IMPL.snapshot_get_all_by_project(context, project_id) - - -def snapshot_get_all_for_volume(context, volume_id): - """Get all snapshots for a volume.""" - return IMPL.snapshot_get_all_for_volume(context, volume_id) - - -def snapshot_update(context, snapshot_id, values): - """Set the given properties on an snapshot and update it. - - Raises NotFound if snapshot does not exist. - - """ - return IMPL.snapshot_update(context, snapshot_id, values) - - -def snapshot_data_get_for_project(context, project_id, session=None): - """Get count and gigabytes used for snapshots for specified project.""" - return IMPL.snapshot_data_get_for_project(context, - project_id, - session) - - -def 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.""" - return IMPL.snapshot_get_active_by_window(context, begin, end, project_id) - - -#################### - - -def snapshot_metadata_get(context, snapshot_id): - """Get all metadata for a snapshot.""" - return IMPL.snapshot_metadata_get(context, snapshot_id) - - -def snapshot_metadata_delete(context, snapshot_id, key): - """Delete the given metadata item.""" - IMPL.snapshot_metadata_delete(context, snapshot_id, key) - - -def snapshot_metadata_update(context, snapshot_id, metadata, delete): - """Update metadata if it exists, otherwise create it.""" - IMPL.snapshot_metadata_update(context, snapshot_id, metadata, delete) - - -#################### - - -def volume_metadata_get(context, volume_id): - """Get all metadata for a volume.""" - return IMPL.volume_metadata_get(context, volume_id) - - -def volume_metadata_delete(context, volume_id, key): - """Delete the given metadata item.""" - IMPL.volume_metadata_delete(context, volume_id, key) - - -def volume_metadata_update(context, volume_id, metadata, delete): - """Update metadata if it exists, otherwise create it.""" - IMPL.volume_metadata_update(context, volume_id, metadata, delete) - - -################## - - -def volume_type_create(context, values): - """Create a new volume type.""" - return IMPL.volume_type_create(context, values) - - -def volume_type_get_all(context, inactive=False): - """Get all volume types.""" - return IMPL.volume_type_get_all(context, inactive) - - -def volume_type_get(context, id): - """Get volume type by id.""" - return IMPL.volume_type_get(context, id) - - -def volume_type_get_by_name(context, name): - """Get volume type by name.""" - return IMPL.volume_type_get_by_name(context, name) - - -def volume_type_destroy(context, id): - """Delete a volume type.""" - return IMPL.volume_type_destroy(context, id) - - -def 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.""" - return IMPL.volume_get_active_by_window(context, begin, end, project_id) - - -#################### - - -def volume_type_extra_specs_get(context, volume_type_id): - """Get all extra specs for a volume type.""" - return IMPL.volume_type_extra_specs_get(context, volume_type_id) - - -def volume_type_extra_specs_delete(context, volume_type_id, key): - """Delete the given extra specs item.""" - IMPL.volume_type_extra_specs_delete(context, volume_type_id, key) - - -def 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""" - IMPL.volume_type_extra_specs_update_or_create(context, - volume_type_id, - extra_specs) - - -################### - - -def volume_glance_metadata_create(context, volume_id, key, value): - """Update the Glance metadata for the specified volume.""" - return IMPL.volume_glance_metadata_create(context, - volume_id, - key, - value) - - -def volume_glance_metadata_get(context, volume_id): - """Return the glance metadata for a volume.""" - return IMPL.volume_glance_metadata_get(context, volume_id) - - -def volume_snapshot_glance_metadata_get(context, snapshot_id): - """Return the Glance metadata for the specified snapshot.""" - return IMPL.volume_snapshot_glance_metadata_get(context, snapshot_id) - - -def volume_glance_metadata_copy_to_snapshot(context, snapshot_id, volume_id): - """ - Update the Glance metadata for a snapshot by copying all of the key:value - pairs from the originating volume. This is so that a volume created from - the snapshot will retain the original metadata. - """ - return IMPL.volume_glance_metadata_copy_to_snapshot(context, snapshot_id, - volume_id) - - -def volume_glance_metadata_copy_to_volume(context, volume_id, snapshot_id): - """ - Update the Glance metadata from a volume (created from a snapshot) by - copying all of the key:value pairs from the originating snapshot. This is - so that the Glance metadata from the original volume is retained. - """ - return IMPL.volume_glance_metadata_copy_to_volume(context, volume_id, - snapshot_id) - - -def volume_glance_metadata_delete_by_volume(context, volume_id): - """Delete the glance metadata for a volume.""" - return IMPL.volume_glance_metadata_delete_by_volume(context, volume_id) - - -def volume_glance_metadata_delete_by_snapshot(context, snapshot_id): - """Delete the glance metadata for a snapshot.""" - return IMPL.volume_glance_metadata_delete_by_snapshot(context, snapshot_id) - - -def 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. - """ - return IMPL.volume_glance_metadata_copy_from_volume_to_volume( - context, - src_volume_id, - volume_id) - -################### - - def sm_backend_conf_create(context, values): """Create a new SM Backend Config entry.""" return IMPL.sm_backend_conf_create(context, values) diff --git a/manila/db/sqlalchemy/api.py b/manila/db/sqlalchemy/api.py index cd7835bc54..414cb352e2 100644 --- a/manila/db/sqlalchemy/api.py +++ b/manila/db/sqlalchemy/api.py @@ -37,7 +37,6 @@ from manila import exception from manila import flags from manila.openstack.common import log as logging from manila.openstack.common import timeutils -from manila.openstack.common import uuidutils FLAGS = flags.FLAGS @@ -124,34 +123,6 @@ def require_context(f): return wrapper -def require_volume_exists(f): - """Decorator to require the specified volume to exist. - - Requires the wrapped function to use context and volume_id as - their first two arguments. - """ - - def wrapper(context, volume_id, *args, **kwargs): - db.volume_get(context, volume_id) - return f(context, volume_id, *args, **kwargs) - wrapper.__name__ = f.__name__ - return wrapper - - -def require_snapshot_exists(f): - """Decorator to require the specified snapshot to exist. - - Requires the wrapped function to use context and snapshot_id as - their first two arguments. - """ - - def wrapper(context, snapshot_id, *args, **kwargs): - db.api.snapshot_get(context, snapshot_id) - return f(context, snapshot_id, *args, **kwargs) - wrapper.__name__ = f.__name__ - return wrapper - - def model_query(context, *args, **kwargs): """Query helper that accounts for context's `read_deleted` field. @@ -303,23 +274,6 @@ def _service_get_all_topic_subquery(context, session, topic, subq, label): all() -@require_admin_context -def service_get_all_volume_sorted(context): - session = get_session() - with session.begin(): - topic = FLAGS.volume_topic - label = 'volume_gigabytes' - subq = model_query(context, models.Volume.host, - func.sum(models.Volume.size).label(label), - session=session, read_deleted="no").\ - group_by(models.Volume.host).\ - subquery() - return _service_get_all_topic_subquery(context, - session, - topic, - subq, - label) - @require_admin_context def service_get_all_share_sorted(context): @@ -407,29 +361,6 @@ def _dict_with_extra_specs(inst_type_query): ################### -@require_admin_context -def iscsi_target_count_by_host(context, host): - return model_query(context, models.IscsiTarget).\ - filter_by(host=host).\ - count() - - -@require_admin_context -def iscsi_target_create_safe(context, values): - iscsi_target_ref = models.IscsiTarget() - - for (key, value) in values.iteritems(): - iscsi_target_ref[key] = value - try: - iscsi_target_ref.save() - return iscsi_target_ref - except IntegrityError: - return None - - -################### - - @require_context def quota_get(context, project_id, resource, session=None): result = model_query(context, models.Quota, session=session, @@ -910,888 +841,6 @@ def reservation_expire(context): ################### -@require_admin_context -def volume_allocate_iscsi_target(context, volume_id, host): - session = get_session() - with session.begin(): - iscsi_target_ref = model_query(context, models.IscsiTarget, - session=session, read_deleted="no").\ - filter_by(volume=None).\ - filter_by(host=host).\ - with_lockmode('update').\ - first() - - # NOTE(vish): if with_lockmode isn't supported, as in sqlite, - # then this has concurrency issues - if not iscsi_target_ref: - raise db.NoMoreTargets() - - iscsi_target_ref.volume_id = volume_id - session.add(iscsi_target_ref) - - return iscsi_target_ref.target_num - - -@require_admin_context -def volume_attached(context, volume_id, instance_uuid, mountpoint): - if not uuidutils.is_uuid_like(instance_uuid): - raise exception.InvalidUUID(uuid=instance_uuid) - - session = get_session() - with session.begin(): - volume_ref = volume_get(context, volume_id, session=session) - volume_ref['status'] = 'in-use' - volume_ref['mountpoint'] = mountpoint - volume_ref['attach_status'] = 'attached' - volume_ref['instance_uuid'] = instance_uuid - volume_ref.save(session=session) - - -@require_context -def volume_create(context, values): - values['volume_metadata'] = _metadata_refs(values.get('metadata'), - models.VolumeMetadata) - volume_ref = models.Volume() - if not values.get('id'): - values['id'] = str(uuid.uuid4()) - volume_ref.update(values) - - session = get_session() - with session.begin(): - volume_ref.save(session=session) - - return volume_get(context, values['id'], session=session) - - -@require_admin_context -def volume_data_get_for_host(context, host, session=None): - result = model_query(context, - func.count(models.Volume.id), - func.sum(models.Volume.size), - read_deleted="no", - session=session).\ - filter_by(host=host).\ - first() - - # NOTE(vish): convert None to 0 - return (result[0] or 0, result[1] or 0) - - -@require_admin_context -def volume_data_get_for_project(context, project_id, session=None): - result = model_query(context, - func.count(models.Volume.id), - func.sum(models.Volume.size), - read_deleted="no", - session=session).\ - filter_by(project_id=project_id).\ - first() - - # NOTE(vish): convert None to 0 - return (result[0] or 0, result[1] or 0) - - -@require_admin_context -def volume_destroy(context, volume_id): - session = get_session() - with session.begin(): - session.query(models.Volume).\ - filter_by(id=volume_id).\ - update({'status': 'deleted', - 'deleted': True, - 'deleted_at': timeutils.utcnow(), - 'updated_at': literal_column('updated_at')}) - session.query(models.IscsiTarget).\ - filter_by(volume_id=volume_id).\ - update({'volume_id': None}) - session.query(models.VolumeMetadata).\ - filter_by(volume_id=volume_id).\ - update({'deleted': True, - 'deleted_at': timeutils.utcnow(), - 'updated_at': literal_column('updated_at')}) - - -@require_admin_context -def volume_detached(context, volume_id): - session = get_session() - with session.begin(): - volume_ref = volume_get(context, volume_id, session=session) - volume_ref['status'] = 'available' - volume_ref['mountpoint'] = None - volume_ref['attach_status'] = 'detached' - volume_ref['instance_uuid'] = None - volume_ref.save(session=session) - - -@require_context -def _volume_get_query(context, session=None, project_only=False): - return model_query(context, models.Volume, session=session, - project_only=project_only).\ - options(joinedload('volume_metadata')).\ - options(joinedload('volume_type')) - - -@require_context -def volume_get(context, volume_id, session=None): - result = _volume_get_query(context, session=session, project_only=True).\ - filter_by(id=volume_id).\ - first() - - if not result: - raise exception.VolumeNotFound(volume_id=volume_id) - - return result - - -@require_admin_context -def volume_get_all(context, marker, limit, sort_key, sort_dir): - query = _volume_get_query(context) - - marker_volume = None - if marker is not None: - marker_volume = volume_get(context, marker) - - query = sqlalchemyutils.paginate_query(query, models.Volume, limit, - [sort_key, 'created_at', 'id'], - marker=marker_volume, - sort_dir=sort_dir) - - return query.all() - - -@require_admin_context -def volume_get_all_by_host(context, host): - return _volume_get_query(context).filter_by(host=host).all() - - -@require_admin_context -def volume_get_all_by_instance_uuid(context, instance_uuid): - result = model_query(context, models.Volume, read_deleted="no").\ - options(joinedload('volume_metadata')).\ - options(joinedload('volume_type')).\ - filter_by(instance_uuid=instance_uuid).\ - all() - - if not result: - return [] - - return result - - -@require_context -def volume_get_all_by_project(context, project_id, marker, limit, sort_key, - sort_dir): - authorize_project_context(context, project_id) - query = _volume_get_query(context).filter_by(project_id=project_id) - - marker_volume = None - if marker is not None: - marker_volume = volume_get(context, marker) - - query = sqlalchemyutils.paginate_query(query, models.Volume, limit, - [sort_key, 'created_at', 'id'], - marker=marker_volume, - sort_dir=sort_dir) - - return query.all() - - -@require_admin_context -def volume_get_iscsi_target_num(context, volume_id): - result = model_query(context, models.IscsiTarget, read_deleted="yes").\ - filter_by(volume_id=volume_id).\ - first() - - if not result: - raise exception.ISCSITargetNotFoundForVolume(volume_id=volume_id) - - return result.target_num - - -@require_context -def volume_update(context, volume_id, values): - session = get_session() - metadata = values.get('metadata') - if metadata is not None: - volume_metadata_update(context, - volume_id, - values.pop('metadata'), - delete=True) - with session.begin(): - volume_ref = volume_get(context, volume_id, session=session) - volume_ref.update(values) - volume_ref.save(session=session) - return volume_ref - - -#################### - -def _volume_metadata_get_query(context, volume_id, session=None): - return model_query(context, models.VolumeMetadata, - session=session, read_deleted="no").\ - filter_by(volume_id=volume_id) - - -@require_context -@require_volume_exists -def volume_metadata_get(context, volume_id): - rows = _volume_metadata_get_query(context, volume_id).all() - result = {} - for row in rows: - result[row['key']] = row['value'] - - return result - - -@require_context -@require_volume_exists -def volume_metadata_delete(context, volume_id, key): - _volume_metadata_get_query(context, volume_id).\ - filter_by(key=key).\ - update({'deleted': True, - 'deleted_at': timeutils.utcnow(), - 'updated_at': literal_column('updated_at')}) - - -@require_context -@require_volume_exists -def volume_metadata_get_item(context, volume_id, key, session=None): - result = _volume_metadata_get_query(context, volume_id, session=session).\ - filter_by(key=key).\ - first() - - if not result: - raise exception.VolumeMetadataNotFound(metadata_key=key, - volume_id=volume_id) - return result - - -@require_context -@require_volume_exists -def volume_metadata_update(context, volume_id, metadata, delete): - session = get_session() - - # Set existing metadata to deleted if delete argument is True - if delete: - original_metadata = volume_metadata_get(context, volume_id) - for meta_key, meta_value in original_metadata.iteritems(): - if meta_key not in metadata: - meta_ref = volume_metadata_get_item(context, volume_id, - meta_key, session) - meta_ref.update({'deleted': True}) - meta_ref.save(session=session) - - meta_ref = None - - # Now update all existing items with new values, or create new meta objects - for meta_key, meta_value in metadata.items(): - - # update the value whether it exists or not - item = {"value": meta_value} - - try: - meta_ref = volume_metadata_get_item(context, volume_id, - meta_key, session) - except exception.VolumeMetadataNotFound as e: - meta_ref = models.VolumeMetadata() - item.update({"key": meta_key, "volume_id": volume_id}) - - meta_ref.update(item) - meta_ref.save(session=session) - - return metadata - - -################### - - -@require_context -def snapshot_create(context, values): - values['snapshot_metadata'] = _metadata_refs(values.get('metadata'), - models.SnapshotMetadata) - snapshot_ref = models.Snapshot() - if not values.get('id'): - values['id'] = str(uuid.uuid4()) - snapshot_ref.update(values) - - session = get_session() - with session.begin(): - snapshot_ref.save(session=session) - - return snapshot_get(context, values['id'], session=session) - - -@require_admin_context -def snapshot_destroy(context, snapshot_id): - session = get_session() - with session.begin(): - session.query(models.Snapshot).\ - filter_by(id=snapshot_id).\ - update({'status': 'deleted', - 'deleted': True, - 'deleted_at': timeutils.utcnow(), - 'updated_at': literal_column('updated_at')}) - - -@require_context -def snapshot_get(context, snapshot_id, session=None): - result = model_query(context, models.Snapshot, session=session, - project_only=True).\ - filter_by(id=snapshot_id).\ - first() - - if not result: - raise exception.SnapshotNotFound(snapshot_id=snapshot_id) - - return result - - -@require_admin_context -def snapshot_get_all(context): - return model_query(context, models.Snapshot).all() - - -@require_context -def snapshot_get_all_for_volume(context, volume_id): - return model_query(context, models.Snapshot, read_deleted='no', - project_only=True).\ - filter_by(volume_id=volume_id).all() - - -@require_context -def snapshot_get_all_by_project(context, project_id): - authorize_project_context(context, project_id) - return model_query(context, models.Snapshot).\ - filter_by(project_id=project_id).\ - all() - - -@require_context -def snapshot_data_get_for_project(context, project_id, session=None): - authorize_project_context(context, project_id) - result = model_query(context, - func.count(models.Snapshot.id), - func.sum(models.Snapshot.volume_size), - read_deleted="no", - session=session).\ - filter_by(project_id=project_id).\ - first() - - # NOTE(vish): convert None to 0 - return (result[0] or 0, result[1] or 0) - - -@require_context -def snapshot_get_active_by_window(context, begin, end=None, project_id=None): - """Return snapshots that were active during window.""" - session = get_session() - query = session.query(models.Snapshot) - - query = query.filter(or_(models.Snapshot.deleted_at == None, - models.Snapshot.deleted_at > begin)) - if end: - query = query.filter(models.Snapshot.created_at < end) - if project_id: - query = query.filter_by(project_id=project_id) - - return query.all() - - -@require_context -def snapshot_update(context, snapshot_id, values): - session = get_session() - with session.begin(): - snapshot_ref = snapshot_get(context, snapshot_id, session=session) - snapshot_ref.update(values) - snapshot_ref.save(session=session) - -#################### - - -def _snapshot_metadata_get_query(context, snapshot_id, session=None): - return model_query(context, models.SnapshotMetadata, - session=session, read_deleted="no").\ - filter_by(snapshot_id=snapshot_id) - - -@require_context -@require_snapshot_exists -def snapshot_metadata_get(context, snapshot_id): - rows = _snapshot_metadata_get_query(context, snapshot_id).all() - result = {} - for row in rows: - result[row['key']] = row['value'] - - return result - - -@require_context -@require_snapshot_exists -def snapshot_metadata_delete(context, snapshot_id, key): - _snapshot_metadata_get_query(context, snapshot_id).\ - filter_by(key=key).\ - update({'deleted': True, - 'deleted_at': timeutils.utcnow(), - 'updated_at': literal_column('updated_at')}) - - -@require_context -@require_snapshot_exists -def snapshot_metadata_get_item(context, snapshot_id, key, session=None): - result = _snapshot_metadata_get_query(context, - snapshot_id, - session=session).\ - filter_by(key=key).\ - first() - - if not result: - raise exception.SnapshotMetadataNotFound(metadata_key=key, - snapshot_id=snapshot_id) - return result - - -@require_context -@require_snapshot_exists -def snapshot_metadata_update(context, snapshot_id, metadata, delete): - session = get_session() - - # Set existing metadata to deleted if delete argument is True - if delete: - original_metadata = snapshot_metadata_get(context, snapshot_id) - for meta_key, meta_value in original_metadata.iteritems(): - if meta_key not in metadata: - meta_ref = snapshot_metadata_get_item(context, snapshot_id, - meta_key, session) - meta_ref.update({'deleted': True}) - meta_ref.save(session=session) - - meta_ref = None - - # Now update all existing items with new values, or create new meta objects - for meta_key, meta_value in metadata.items(): - - # update the value whether it exists or not - item = {"value": meta_value} - - try: - meta_ref = snapshot_metadata_get_item(context, snapshot_id, - meta_key, session) - except exception.SnapshotMetadataNotFound as e: - meta_ref = models.SnapshotMetadata() - item.update({"key": meta_key, "snapshot_id": snapshot_id}) - - meta_ref.update(item) - meta_ref.save(session=session) - - return metadata - -################### - - -@require_admin_context -def migration_create(context, values): - migration = models.Migration() - migration.update(values) - migration.save() - return migration - - -@require_admin_context -def migration_update(context, id, values): - session = get_session() - with session.begin(): - migration = migration_get(context, id, session=session) - migration.update(values) - migration.save(session=session) - return migration - - -@require_admin_context -def migration_get(context, id, session=None): - result = model_query(context, models.Migration, session=session, - read_deleted="yes").\ - filter_by(id=id).\ - first() - - if not result: - raise exception.MigrationNotFound(migration_id=id) - - return result - - -@require_admin_context -def migration_get_by_instance_and_status(context, instance_uuid, status): - result = model_query(context, models.Migration, read_deleted="yes").\ - filter_by(instance_uuid=instance_uuid).\ - filter_by(status=status).\ - first() - - if not result: - raise exception.MigrationNotFoundByStatus(instance_id=instance_uuid, - status=status) - - return result - - -@require_admin_context -def migration_get_all_unconfirmed(context, confirm_window, session=None): - confirm_window = timeutils.utcnow() - datetime.timedelta( - seconds=confirm_window) - - return model_query(context, models.Migration, session=session, - read_deleted="yes").\ - filter(models.Migration.updated_at <= confirm_window).\ - filter_by(status="finished").\ - all() - - -################## - - -@require_admin_context -def volume_type_create(context, values): - """Create a new instance type. In order to pass in extra specs, - the values dict should contain a 'extra_specs' key/value pair: - - {'extra_specs' : {'k1': 'v1', 'k2': 'v2', ...}} - - """ - if not values.get('id'): - values['id'] = str(uuid.uuid4()) - - session = get_session() - with session.begin(): - try: - volume_type_get_by_name(context, values['name'], session) - raise exception.VolumeTypeExists(id=values['name']) - except exception.VolumeTypeNotFoundByName: - pass - try: - volume_type_get(context, values['id'], session) - raise exception.VolumeTypeExists(id=values['id']) - except exception.VolumeTypeNotFound: - pass - try: - values['extra_specs'] = _metadata_refs(values.get('extra_specs'), - models.VolumeTypeExtraSpecs) - volume_type_ref = models.VolumeTypes() - volume_type_ref.update(values) - volume_type_ref.save() - except Exception, e: - raise exception.DBError(e) - return volume_type_ref - - -@require_context -def volume_type_get_all(context, inactive=False, filters=None): - """ - Returns a dict describing all volume_types with name as key. - """ - filters = filters or {} - - read_deleted = "yes" if inactive else "no" - rows = model_query(context, models.VolumeTypes, - read_deleted=read_deleted).\ - options(joinedload('extra_specs')).\ - order_by("name").\ - all() - - # TODO(sirp): this patern of converting rows to a result with extra_specs - # is repeated quite a bit, might be worth creating a method for it - result = {} - for row in rows: - result[row['name']] = _dict_with_extra_specs(row) - - return result - - -@require_context -def volume_type_get(context, id, session=None): - """Returns a dict describing specific volume_type""" - result = model_query(context, models.VolumeTypes, session=session).\ - options(joinedload('extra_specs')).\ - filter_by(id=id).\ - first() - - if not result: - raise exception.VolumeTypeNotFound(volume_type_id=id) - - return _dict_with_extra_specs(result) - - -@require_context -def volume_type_get_by_name(context, name, session=None): - """Returns a dict describing specific volume_type""" - result = model_query(context, models.VolumeTypes, session=session).\ - options(joinedload('extra_specs')).\ - filter_by(name=name).\ - first() - - if not result: - raise exception.VolumeTypeNotFoundByName(volume_type_name=name) - else: - return _dict_with_extra_specs(result) - - -@require_admin_context -def volume_type_destroy(context, id): - volume_type_get(context, id) - - session = get_session() - with session.begin(): - session.query(models.VolumeTypes).\ - filter_by(id=id).\ - update({'deleted': True, - 'deleted_at': timeutils.utcnow(), - 'updated_at': literal_column('updated_at')}) - session.query(models.VolumeTypeExtraSpecs).\ - filter_by(volume_type_id=id).\ - update({'deleted': True, - 'deleted_at': timeutils.utcnow(), - 'updated_at': literal_column('updated_at')}) - - -@require_context -def volume_get_active_by_window(context, - begin, - end=None, - project_id=None): - """Return volumes that were active during window.""" - session = get_session() - query = session.query(models.Volume) - - query = query.filter(or_(models.Volume.deleted_at == None, - models.Volume.deleted_at > begin)) - if end: - query = query.filter(models.Volume.created_at < end) - if project_id: - query = query.filter_by(project_id=project_id) - - return query.all() - - -#################### - - -def _volume_type_extra_specs_query(context, volume_type_id, session=None): - return model_query(context, models.VolumeTypeExtraSpecs, session=session, - read_deleted="no").\ - filter_by(volume_type_id=volume_type_id) - - -@require_context -def volume_type_extra_specs_get(context, volume_type_id): - rows = _volume_type_extra_specs_query(context, volume_type_id).\ - all() - - result = {} - for row in rows: - result[row['key']] = row['value'] - - return result - - -@require_context -def volume_type_extra_specs_delete(context, volume_type_id, key): - _volume_type_extra_specs_query(context, volume_type_id).\ - filter_by(key=key).\ - update({'deleted': True, - 'deleted_at': timeutils.utcnow(), - 'updated_at': literal_column('updated_at')}) - - -@require_context -def volume_type_extra_specs_get_item(context, volume_type_id, key, - session=None): - result = _volume_type_extra_specs_query( - context, volume_type_id, session=session).\ - filter_by(key=key).\ - first() - - if not result: - raise exception.VolumeTypeExtraSpecsNotFound( - extra_specs_key=key, - volume_type_id=volume_type_id) - - return result - - -@require_context -def volume_type_extra_specs_update_or_create(context, volume_type_id, - specs): - session = get_session() - spec_ref = None - for key, value in specs.iteritems(): - try: - spec_ref = volume_type_extra_specs_get_item( - context, volume_type_id, key, session) - except exception.VolumeTypeExtraSpecsNotFound, e: - spec_ref = models.VolumeTypeExtraSpecs() - spec_ref.update({"key": key, "value": value, - "volume_type_id": volume_type_id, - "deleted": False}) - spec_ref.save(session=session) - return specs - - -#################### - - -@require_context -@require_volume_exists -def volume_glance_metadata_get(context, volume_id, session=None): - """Return the Glance metadata for the specified volume.""" - if not session: - session = get_session() - - return session.query(models.VolumeGlanceMetadata).\ - filter_by(volume_id=volume_id).\ - filter_by(deleted=False).all() - - -@require_context -@require_snapshot_exists -def volume_snapshot_glance_metadata_get(context, snapshot_id, session=None): - """Return the Glance metadata for the specified snapshot.""" - if not session: - session = get_session() - - return session.query(models.VolumeGlanceMetadata).\ - filter_by(snapshot_id=snapshot_id).\ - filter_by(deleted=False).all() - - -@require_context -@require_volume_exists -def volume_glance_metadata_create(context, volume_id, key, value, - session=None): - """ - Update the Glance metadata for a volume by adding a new key:value pair. - This API does not support changing the value of a key once it has been - created. - """ - if session is None: - session = get_session() - - with session.begin(): - rows = session.query(models.VolumeGlanceMetadata).\ - filter_by(volume_id=volume_id).\ - filter_by(key=key).\ - filter_by(deleted=False).all() - - if len(rows) > 0: - raise exception.GlanceMetadataExists(key=key, - volume_id=volume_id) - - vol_glance_metadata = models.VolumeGlanceMetadata() - vol_glance_metadata.volume_id = volume_id - vol_glance_metadata.key = key - vol_glance_metadata.value = value - - vol_glance_metadata.save(session=session) - - return - - -@require_context -@require_snapshot_exists -def volume_glance_metadata_copy_to_snapshot(context, snapshot_id, volume_id, - session=None): - """ - Update the Glance metadata for a snapshot by copying all of the key:value - pairs from the originating volume. This is so that a volume created from - the snapshot will retain the original metadata. - """ - if session is None: - session = get_session() - - metadata = volume_glance_metadata_get(context, volume_id, session=session) - with session.begin(): - for meta in metadata: - vol_glance_metadata = models.VolumeGlanceMetadata() - vol_glance_metadata.snapshot_id = snapshot_id - vol_glance_metadata.key = meta['key'] - vol_glance_metadata.value = meta['value'] - - vol_glance_metadata.save(session=session) - - -@require_context -@require_volume_exists -def volume_glance_metadata_copy_from_volume_to_volume(context, - src_volume_id, - volume_id, - session=None): - """ - 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. - """ - if session is None: - session = get_session() - - metadata = volume_glance_metadata_get(context, - src_volume_id, - session=session) - with session.begin(): - for meta in metadata: - vol_glance_metadata = models.VolumeGlanceMetadata() - vol_glance_metadata.volume_id = volume_id - vol_glance_metadata.key = meta['key'] - vol_glance_metadata.value = meta['value'] - - vol_glance_metadata.save(session=session) - - -@require_context -@require_volume_exists -def volume_glance_metadata_copy_to_volume(context, volume_id, snapshot_id, - session=None): - """ - Update the Glance metadata from a volume (created from a snapshot) by - copying all of the key:value pairs from the originating snapshot. This is - so that the Glance metadata from the original volume is retained. - """ - if session is None: - session = get_session() - - metadata = volume_snapshot_glance_metadata_get(context, snapshot_id, - session=session) - with session.begin(): - for meta in metadata: - vol_glance_metadata = models.VolumeGlanceMetadata() - vol_glance_metadata.volume_id = volume_id - vol_glance_metadata.key = meta['key'] - vol_glance_metadata.value = meta['value'] - - vol_glance_metadata.save(session=session) - - -@require_context -def volume_glance_metadata_delete_by_volume(context, volume_id): - session = get_session() - session.query(models.VolumeGlanceMetadata).\ - filter_by(volume_id=volume_id).\ - filter_by(deleted=False).\ - update({'deleted': True, - 'deleted_at': timeutils.utcnow(), - 'updated_at': literal_column('updated_at')}) - - -@require_context -def volume_glance_metadata_delete_by_snapshot(context, snapshot_id): - session = get_session() - session.query(models.VolumeGlanceMetadata).\ - filter_by(snapshot_id=snapshot_id).\ - filter_by(deleted=False).\ - update({'deleted': True, - 'deleted_at': timeutils.utcnow(), - 'updated_at': literal_column('updated_at')}) - - -#################### - - @require_admin_context def sm_backend_conf_create(context, values): backend_conf = models.SMBackendConf()