cinder/cinder/volume/group_types.py

210 lines
7.2 KiB
Python

# Copyright (c) 2016 EMC Corporation
#
# 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.
"""Built-in group type properties."""
from oslo_config import cfg
from oslo_db import exception as db_exc
from oslo_log import log as logging
import webob
from cinder import context
from cinder import db
from cinder import exception
from cinder.i18n import _
CONF = cfg.CONF
LOG = logging.getLogger(__name__)
DEFAULT_CGSNAPSHOT_TYPE = "default_cgsnapshot_type"
def create(context,
name,
group_specs=None,
is_public=True,
projects=None,
description=None):
"""Creates group types."""
group_specs = group_specs or {}
projects = projects or []
elevated = context if context.is_admin else context.elevated()
try:
type_ref = db.group_type_create(elevated,
dict(name=name,
group_specs=group_specs,
is_public=is_public,
description=description),
projects=projects)
except db_exc.DBError:
LOG.exception('DB error:')
raise exception.GroupTypeCreateFailed(name=name,
group_specs=group_specs)
return type_ref
def update(context, id, name, description, is_public=None):
"""Update group type by id."""
if id is None:
msg = _("id cannot be None")
raise exception.InvalidGroupType(reason=msg)
elevated = context if context.is_admin else context.elevated()
try:
db.group_type_update(elevated, id,
dict(name=name, description=description,
is_public=is_public))
except db_exc.DBError:
LOG.exception('DB error:')
raise exception.GroupTypeUpdateFailed(id=id)
def destroy(context, id):
"""Marks group types as deleted."""
if id is None:
msg = _("id cannot be None")
raise exception.InvalidGroupType(reason=msg)
else:
elevated = context if context.is_admin else context.elevated()
try:
db.group_type_destroy(elevated, id)
except exception.GroupTypeInUse as e:
msg = _('Target group type is still in use. %s') % e
raise webob.exc.HTTPBadRequest(explanation=msg)
def get_all_group_types(context, inactive=0, filters=None, marker=None,
limit=None, sort_keys=None, sort_dirs=None,
offset=None, list_result=False):
"""Get all non-deleted group_types.
Pass true as argument if you want deleted group types returned also.
"""
grp_types = db.group_type_get_all(context, inactive, filters=filters,
marker=marker, limit=limit,
sort_keys=sort_keys,
sort_dirs=sort_dirs, offset=offset,
list_result=list_result)
return grp_types
def get_group_type(ctxt, id, expected_fields=None):
"""Retrieves single group type by id."""
if id is None:
msg = _("id cannot be None")
raise exception.InvalidGroupType(reason=msg)
if ctxt is None:
ctxt = context.get_admin_context()
return db.group_type_get(ctxt, id, expected_fields=expected_fields)
def get_group_type_by_name(context, name):
"""Retrieves single group type by name."""
if name is None:
msg = _("name cannot be None")
raise exception.InvalidGroupType(reason=msg)
return db.group_type_get_by_name(context, name)
def get_default_group_type():
"""Get the default group type."""
name = CONF.default_group_type
grp_type = {}
if name is not None:
ctxt = context.get_admin_context()
try:
grp_type = get_group_type_by_name(ctxt, name)
except exception.GroupTypeNotFoundByName:
# Couldn't find group type with the name in default_group_type
# flag, record this issue and move on
LOG.exception('Default group type is not found. '
'Please check default_group_type config.')
return grp_type
def get_default_cgsnapshot_type():
"""Get the default group type for migrating cgsnapshots.
Get the default group type for migrating consistencygroups to
groups and cgsnapshots to group_snapshots.
"""
grp_type = {}
ctxt = context.get_admin_context()
try:
grp_type = get_group_type_by_name(ctxt, DEFAULT_CGSNAPSHOT_TYPE)
except exception.GroupTypeNotFoundByName:
# Couldn't find DEFAULT_CGSNAPSHOT_TYPE group type.
# Record this issue and move on.
LOG.exception('Default cgsnapshot type %s is not found.',
DEFAULT_CGSNAPSHOT_TYPE)
return grp_type
def is_default_cgsnapshot_type(group_type_id):
cgsnap_type = get_default_cgsnapshot_type()
return cgsnap_type and group_type_id == cgsnap_type['id']
def get_group_type_specs(group_type_id, key=False):
group_type = get_group_type(context.get_admin_context(),
group_type_id)
group_specs = group_type['group_specs']
if key:
if group_specs.get(key):
return group_specs.get(key)
else:
return False
else:
return group_specs
def is_public_group_type(context, group_type_id):
"""Return is_public boolean value of group type"""
group_type = db.group_type_get(context, group_type_id)
return group_type['is_public']
def add_group_type_access(context, group_type_id, project_id):
"""Add access to group type for project_id."""
if group_type_id is None:
msg = _("group_type_id cannot be None")
raise exception.InvalidGroupType(reason=msg)
elevated = context if context.is_admin else context.elevated()
if is_public_group_type(elevated, group_type_id):
msg = _("Type access modification is not applicable to public group "
"type.")
raise exception.InvalidGroupType(reason=msg)
return db.group_type_access_add(elevated, group_type_id, project_id)
def remove_group_type_access(context, group_type_id, project_id):
"""Remove access to group type for project_id."""
if group_type_id is None:
msg = _("group_type_id cannot be None")
raise exception.InvalidGroupType(reason=msg)
elevated = context if context.is_admin else context.elevated()
if is_public_group_type(elevated, group_type_id):
msg = _("Type access modification is not applicable to public group "
"type.")
raise exception.InvalidGroupType(reason=msg)
return db.group_type_access_remove(elevated, group_type_id, project_id)