419 lines
13 KiB
Python
419 lines
13 KiB
Python
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
|
|
# Copyright (c) 2011 X.commerce, a business unit of eBay Inc.
|
|
# Copyright 2010 United States Government as represented by the
|
|
# Administrator of the National Aeronautics and Space Administration.
|
|
# All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
"""Defines interface for DB access.
|
|
|
|
The underlying driver is loaded as a :class:`LazyPluggable`.
|
|
|
|
Functions in this module are imported into the manila.db namespace. Call these
|
|
functions from manila.db namespace, not the manila.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**
|
|
|
|
:db_backend: string to lookup in the list of LazyPluggable backends.
|
|
`sqlalchemy` is the only supported backend right now.
|
|
|
|
:sql_connection: string specifying the sqlalchemy connection to use, like:
|
|
`sqlite:///var/lib/manila/manila.sqlite`.
|
|
|
|
:enable_new_services: when adding a new service to the database, is it in the
|
|
pool of available hardware (Default: True)
|
|
|
|
"""
|
|
|
|
from oslo.config import cfg
|
|
|
|
from manila import exception
|
|
from manila import flags
|
|
from manila import utils
|
|
|
|
db_opts = [
|
|
cfg.StrOpt('db_backend',
|
|
default='sqlalchemy',
|
|
help='The backend to use for db'),
|
|
cfg.BoolOpt('enable_new_services',
|
|
default=True,
|
|
help='Services to be added to the available pool on create'),
|
|
cfg.StrOpt('share_name_template',
|
|
default='share-%s',
|
|
help='Template string to be used to generate share names'),
|
|
cfg.StrOpt('share_snapshot_name_template',
|
|
default='share-snapshot-%s',
|
|
help='Template string to be used to generate share snapshot '
|
|
'names'),
|
|
cfg.StrOpt('snapshot_name_template',
|
|
default='snapshot-%s',
|
|
help='Template string to be used to generate snapshot names'), ]
|
|
|
|
FLAGS = flags.FLAGS
|
|
FLAGS.register_opts(db_opts)
|
|
|
|
IMPL = utils.LazyPluggable('db_backend',
|
|
sqlalchemy='manila.db.sqlalchemy.api')
|
|
|
|
|
|
###################
|
|
|
|
|
|
def service_destroy(context, service_id):
|
|
"""Destroy the service or raise if it does not exist."""
|
|
return IMPL.service_destroy(context, service_id)
|
|
|
|
|
|
def service_get(context, service_id):
|
|
"""Get a service or raise if it does not exist."""
|
|
return IMPL.service_get(context, service_id)
|
|
|
|
|
|
def service_get_by_host_and_topic(context, host, topic):
|
|
"""Get a service by host it's on and topic it listens to."""
|
|
return IMPL.service_get_by_host_and_topic(context, host, topic)
|
|
|
|
|
|
def service_get_all(context, disabled=None):
|
|
"""Get all services."""
|
|
return IMPL.service_get_all(context, disabled)
|
|
|
|
|
|
def service_get_all_by_topic(context, topic):
|
|
"""Get all services for a given topic."""
|
|
return IMPL.service_get_all_by_topic(context, topic)
|
|
|
|
|
|
def service_get_all_by_host(context, host):
|
|
"""Get all services for a given host."""
|
|
return IMPL.service_get_all_by_host(context, host)
|
|
|
|
|
|
def service_get_all_share_sorted(context):
|
|
"""Get all share services sorted by share count.
|
|
|
|
:returns: a list of (Service, share_count) tuples.
|
|
|
|
"""
|
|
return IMPL.service_get_all_share_sorted(context)
|
|
|
|
|
|
def service_get_by_args(context, host, binary):
|
|
"""Get the state of an service by node name and binary."""
|
|
return IMPL.service_get_by_args(context, host, binary)
|
|
|
|
|
|
def service_create(context, values):
|
|
"""Create a service from the values dictionary."""
|
|
return IMPL.service_create(context, values)
|
|
|
|
|
|
def service_update(context, service_id, values):
|
|
"""Set the given properties on an service and update it.
|
|
|
|
Raises NotFound if service does not exist.
|
|
|
|
"""
|
|
return IMPL.service_update(context, service_id, values)
|
|
|
|
|
|
###################
|
|
def migration_update(context, id, values):
|
|
"""Update a migration instance."""
|
|
return IMPL.migration_update(context, id, values)
|
|
|
|
|
|
def migration_create(context, values):
|
|
"""Create a migration record."""
|
|
return IMPL.migration_create(context, values)
|
|
|
|
|
|
def migration_get(context, migration_id):
|
|
"""Finds a migration by the id."""
|
|
return IMPL.migration_get(context, migration_id)
|
|
|
|
|
|
def migration_get_by_instance_and_status(context, instance_uuid, status):
|
|
"""Finds a migration by the instance uuid its migrating."""
|
|
return IMPL.migration_get_by_instance_and_status(context,
|
|
instance_uuid,
|
|
status)
|
|
|
|
|
|
def migration_get_all_unconfirmed(context, confirm_window):
|
|
"""Finds all unconfirmed migrations within the confirmation window."""
|
|
return IMPL.migration_get_all_unconfirmed(context, confirm_window)
|
|
|
|
|
|
####################
|
|
|
|
|
|
def quota_create(context, project_id, resource, limit):
|
|
"""Create a quota for the given project and resource."""
|
|
return IMPL.quota_create(context, project_id, resource, limit)
|
|
|
|
|
|
def quota_get(context, project_id, resource):
|
|
"""Retrieve a quota or raise if it does not exist."""
|
|
return IMPL.quota_get(context, project_id, resource)
|
|
|
|
|
|
def quota_get_all_by_project(context, project_id):
|
|
"""Retrieve all quotas associated with a given project."""
|
|
return IMPL.quota_get_all_by_project(context, project_id)
|
|
|
|
|
|
def quota_update(context, project_id, resource, limit):
|
|
"""Update a quota or raise if it does not exist."""
|
|
return IMPL.quota_update(context, project_id, resource, limit)
|
|
|
|
|
|
def quota_destroy(context, project_id, resource):
|
|
"""Destroy the quota or raise if it does not exist."""
|
|
return IMPL.quota_destroy(context, project_id, resource)
|
|
|
|
|
|
###################
|
|
|
|
|
|
def quota_class_create(context, class_name, resource, limit):
|
|
"""Create a quota class for the given name and resource."""
|
|
return IMPL.quota_class_create(context, class_name, resource, limit)
|
|
|
|
|
|
def quota_class_get(context, class_name, resource):
|
|
"""Retrieve a quota class or raise if it does not exist."""
|
|
return IMPL.quota_class_get(context, class_name, resource)
|
|
|
|
|
|
def quota_class_get_all_by_name(context, class_name):
|
|
"""Retrieve all quotas associated with a given quota class."""
|
|
return IMPL.quota_class_get_all_by_name(context, class_name)
|
|
|
|
|
|
def quota_class_update(context, class_name, resource, limit):
|
|
"""Update a quota class or raise if it does not exist."""
|
|
return IMPL.quota_class_update(context, class_name, resource, limit)
|
|
|
|
|
|
def quota_class_destroy(context, class_name, resource):
|
|
"""Destroy the quota class or raise if it does not exist."""
|
|
return IMPL.quota_class_destroy(context, class_name, resource)
|
|
|
|
|
|
def quota_class_destroy_all_by_name(context, class_name):
|
|
"""Destroy all quotas associated with a given quota class."""
|
|
return IMPL.quota_class_destroy_all_by_name(context, class_name)
|
|
|
|
|
|
###################
|
|
|
|
|
|
def quota_usage_create(context, project_id, resource, in_use, reserved,
|
|
until_refresh):
|
|
"""Create a quota usage for the given project and resource."""
|
|
return IMPL.quota_usage_create(context, project_id, resource,
|
|
in_use, reserved, until_refresh)
|
|
|
|
|
|
def quota_usage_get(context, project_id, resource):
|
|
"""Retrieve a quota usage or raise if it does not exist."""
|
|
return IMPL.quota_usage_get(context, project_id, resource)
|
|
|
|
|
|
def quota_usage_get_all_by_project(context, project_id):
|
|
"""Retrieve all usage associated with a given resource."""
|
|
return IMPL.quota_usage_get_all_by_project(context, project_id)
|
|
|
|
|
|
###################
|
|
|
|
|
|
def reservation_create(context, uuid, usage, project_id, resource, delta,
|
|
expire):
|
|
"""Create a reservation for the given project and resource."""
|
|
return IMPL.reservation_create(context, uuid, usage, project_id,
|
|
resource, delta, expire)
|
|
|
|
|
|
def reservation_get(context, uuid):
|
|
"""Retrieve a reservation or raise if it does not exist."""
|
|
return IMPL.reservation_get(context, uuid)
|
|
|
|
|
|
def reservation_get_all_by_project(context, project_id):
|
|
"""Retrieve all reservations associated with a given project."""
|
|
return IMPL.reservation_get_all_by_project(context, project_id)
|
|
|
|
|
|
def reservation_destroy(context, uuid):
|
|
"""Destroy the reservation or raise if it does not exist."""
|
|
return IMPL.reservation_destroy(context, uuid)
|
|
|
|
|
|
###################
|
|
|
|
|
|
def quota_reserve(context, resources, quotas, deltas, expire,
|
|
until_refresh, max_age, project_id=None):
|
|
"""Check quotas and create appropriate reservations."""
|
|
return IMPL.quota_reserve(context, resources, quotas, deltas, expire,
|
|
until_refresh, max_age, project_id=project_id)
|
|
|
|
|
|
def reservation_commit(context, reservations, project_id=None):
|
|
"""Commit quota reservations."""
|
|
return IMPL.reservation_commit(context, reservations,
|
|
project_id=project_id)
|
|
|
|
|
|
def reservation_rollback(context, reservations, project_id=None):
|
|
"""Roll back quota reservations."""
|
|
return IMPL.reservation_rollback(context, reservations,
|
|
project_id=project_id)
|
|
|
|
|
|
def quota_destroy_all_by_project(context, project_id):
|
|
"""Destroy all quotas associated with a given project."""
|
|
return IMPL.quota_destroy_all_by_project(context, project_id)
|
|
|
|
|
|
def reservation_expire(context):
|
|
"""Roll back any expired reservations."""
|
|
return IMPL.reservation_expire(context)
|
|
|
|
|
|
###################
|
|
|
|
|
|
def share_create(context, values):
|
|
"""Create new share."""
|
|
return IMPL.share_create(context, values)
|
|
|
|
|
|
def share_update(context, share_id, values):
|
|
"""Update share fields."""
|
|
return IMPL.share_update(context, share_id, values)
|
|
|
|
|
|
def share_get(context, share_id):
|
|
"""Get share by id."""
|
|
return IMPL.share_get(context, share_id)
|
|
|
|
|
|
def share_get_all(context):
|
|
"""Get all shares."""
|
|
return IMPL.share_get_all(context)
|
|
|
|
|
|
def share_get_all_by_host(context, host):
|
|
"""Returns all shares with given host."""
|
|
return IMPL.share_get_all_by_host(context, host)
|
|
|
|
|
|
def share_get_all_by_project(context, project_id):
|
|
"""Returns all shares with given project ID."""
|
|
return IMPL.share_get_all_by_project(context, project_id)
|
|
|
|
|
|
def share_delete(context, share_id):
|
|
"""Delete share."""
|
|
return IMPL.share_delete(context, share_id)
|
|
|
|
|
|
###################
|
|
|
|
|
|
def share_access_create(context, values):
|
|
"""Allow access to share."""
|
|
return IMPL.share_access_create(context, values)
|
|
|
|
|
|
def share_access_get(context, access_id):
|
|
"""Allow access to share."""
|
|
return IMPL.share_access_get(context, access_id)
|
|
|
|
|
|
def share_access_get_all_for_share(context, share_id):
|
|
"""Allow access to share."""
|
|
return IMPL.share_access_get_all_for_share(context, share_id)
|
|
|
|
|
|
def share_access_delete(context, access_id):
|
|
"""Deny access to share."""
|
|
return IMPL.share_access_delete(context, access_id)
|
|
|
|
|
|
def share_access_update(context, access_id, values):
|
|
"""Update access record."""
|
|
return IMPL.share_access_update(context, access_id, values)
|
|
|
|
|
|
####################
|
|
|
|
|
|
def share_snapshot_create(context, values):
|
|
"""Create a snapshot from the values dictionary."""
|
|
return IMPL.share_snapshot_create(context, values)
|
|
|
|
|
|
def share_snapshot_destroy(context, snapshot_id):
|
|
"""Destroy the snapshot or raise if it does not exist."""
|
|
return IMPL.share_snapshot_destroy(context, snapshot_id)
|
|
|
|
|
|
def share_snapshot_get(context, snapshot_id):
|
|
"""Get a snapshot or raise if it does not exist."""
|
|
return IMPL.share_snapshot_get(context, snapshot_id)
|
|
|
|
|
|
def share_snapshot_get_all(context):
|
|
"""Get all snapshots."""
|
|
return IMPL.share_snapshot_get_all(context)
|
|
|
|
|
|
def share_snapshot_get_all_by_project(context, project_id):
|
|
"""Get all snapshots belonging to a project."""
|
|
return IMPL.share_snapshot_get_all_by_project(context, project_id)
|
|
|
|
|
|
def share_snapshot_get_all_for_share(context, share_id):
|
|
"""Get all snapshots for a share."""
|
|
return IMPL.share_snapshot_get_all_for_share(context, share_id)
|
|
|
|
|
|
def share_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.share_snapshot_update(context, snapshot_id, values)
|
|
|
|
|
|
def share_snapshot_data_get_for_project(context, project_id, session=None):
|
|
"""Get count and gigabytes used for snapshots for specified project."""
|
|
return IMPL.share_snapshot_data_get_for_project(context,
|
|
project_id,
|
|
session=None)
|
|
|
|
|
|
####################
|