232 lines
11 KiB
Python
232 lines
11 KiB
Python
# Copyright 2016 Dell Inc.
|
|
# 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.
|
|
#
|
|
|
|
"""
|
|
Consistency group volume driver interface.
|
|
"""
|
|
|
|
from cinder.interface import base
|
|
|
|
|
|
class VolumeConsistencyGroupDriver(base.CinderInterface):
|
|
"""Interface for drivers that support consistency groups."""
|
|
|
|
def create_consistencygroup(self, context, group):
|
|
"""Creates a consistencygroup.
|
|
|
|
:param context: the context of the caller.
|
|
:param group: the dictionary of the consistency group to be created.
|
|
:returns: model_update
|
|
|
|
model_update will be in this format: {'status': xxx, ......}.
|
|
|
|
If the status in model_update is 'error', the manager will throw
|
|
an exception and it will be caught in the try-except block in the
|
|
manager. If the driver throws an exception, the manager will also
|
|
catch it in the try-except block. The group status in the db will
|
|
be changed to 'error'.
|
|
|
|
For a successful operation, the driver can either build the
|
|
model_update and return it or return None. The group status will
|
|
be set to 'available'.
|
|
"""
|
|
|
|
def create_consistencygroup_from_src(self, context, group, volumes,
|
|
cgsnapshot=None, snapshots=None,
|
|
source_cg=None, source_vols=None):
|
|
"""Creates a consistencygroup from source.
|
|
|
|
:param context: the context of the caller.
|
|
:param group: the dictionary of the consistency group to be created.
|
|
:param volumes: a list of volume dictionaries in the group.
|
|
:param cgsnapshot: the dictionary of the cgsnapshot as source.
|
|
:param snapshots: a list of snapshot dictionaries in the cgsnapshot.
|
|
:param source_cg: the dictionary of a consistency group as source.
|
|
:param source_vols: a list of volume dictionaries in the source_cg.
|
|
:returns: model_update, volumes_model_update
|
|
|
|
The source can be cgsnapshot or a source cg.
|
|
|
|
param volumes is retrieved directly from the db. It is a list of
|
|
cinder.db.sqlalchemy.models.Volume to be precise. It cannot be
|
|
assigned to volumes_model_update. volumes_model_update is a list of
|
|
dictionaries. It has to be built by the driver. An entry will be
|
|
in this format: {'id': xxx, 'status': xxx, ......}. model_update
|
|
will be in this format: {'status': xxx, ......}.
|
|
|
|
To be consistent with other volume operations, the manager will
|
|
assume the operation is successful if no exception is thrown by
|
|
the driver. For a successful operation, the driver can either build
|
|
the model_update and volumes_model_update and return them or
|
|
return None, None.
|
|
"""
|
|
|
|
def delete_consistencygroup(self, context, group, volumes):
|
|
"""Deletes a consistency group.
|
|
|
|
:param context: the context of the caller.
|
|
:param group: the dictionary of the consistency group to be deleted.
|
|
:param volumes: a list of volume dictionaries in the group.
|
|
:returns: model_update, volumes_model_update
|
|
|
|
param volumes is retrieved directly from the db. It is a list of
|
|
cinder.db.sqlalchemy.models.Volume to be precise. It cannot be
|
|
assigned to volumes_model_update. volumes_model_update is a list of
|
|
dictionaries. It has to be built by the driver. An entry will be
|
|
in this format: {'id': xxx, 'status': xxx, ......}. model_update
|
|
will be in this format: {'status': xxx, ......}.
|
|
|
|
The driver should populate volumes_model_update and model_update
|
|
and return them.
|
|
|
|
The manager will check volumes_model_update and update db accordingly
|
|
for each volume. If the driver successfully deleted some volumes
|
|
but failed to delete others, it should set statuses of the volumes
|
|
accordingly so that the manager can update db correctly.
|
|
|
|
If the status in any entry of volumes_model_update is 'error_deleting'
|
|
or 'error', the status in model_update will be set to the same if it
|
|
is not already 'error_deleting' or 'error'.
|
|
|
|
If the status in model_update is 'error_deleting' or 'error', the
|
|
manager will raise an exception and the status of the group will be
|
|
set to 'error' in the db. If volumes_model_update is not returned by
|
|
the driver, the manager will set the status of every volume in the
|
|
group to 'error' in the except block.
|
|
|
|
If the driver raises an exception during the operation, it will be
|
|
caught by the try-except block in the manager. The statuses of the
|
|
group and all volumes in it will be set to 'error'.
|
|
|
|
For a successful operation, the driver can either build the
|
|
model_update and volumes_model_update and return them or
|
|
return None, None. The statuses of the group and all volumes
|
|
will be set to 'deleted' after the manager deletes them from db.
|
|
"""
|
|
|
|
def update_consistencygroup(self, context, group,
|
|
add_volumes=None, remove_volumes=None):
|
|
"""Updates a consistency group.
|
|
|
|
:param context: the context of the caller.
|
|
:param group: the dictionary of the consistency group to be updated.
|
|
:param add_volumes: a list of volume dictionaries to be added.
|
|
:param remove_volumes: a list of volume dictionaries to be removed.
|
|
:returns: model_update, add_volumes_update, remove_volumes_update
|
|
|
|
model_update is a dictionary that the driver wants the manager
|
|
to update upon a successful return. If None is returned, the manager
|
|
will set the status to 'available'.
|
|
|
|
add_volumes_update and remove_volumes_update are lists of dictionaries
|
|
that the driver wants the manager to update upon a successful return.
|
|
Note that each entry requires a {'id': xxx} so that the correct
|
|
volume entry can be updated. If None is returned, the volume will
|
|
remain its original status. Also note that you cannot directly
|
|
assign add_volumes to add_volumes_update as add_volumes is a list of
|
|
cinder.db.sqlalchemy.models.Volume objects and cannot be used for
|
|
db update directly. Same with remove_volumes.
|
|
|
|
If the driver throws an exception, the status of the group as well as
|
|
those of the volumes to be added/removed will be set to 'error'.
|
|
"""
|
|
|
|
def create_cgsnapshot(self, context, cgsnapshot, snapshots):
|
|
"""Creates a cgsnapshot.
|
|
|
|
:param context: the context of the caller.
|
|
:param cgsnapshot: the dictionary of the cgsnapshot to be created.
|
|
:param snapshots: a list of snapshot dictionaries in the cgsnapshot.
|
|
:returns: model_update, snapshots_model_update
|
|
|
|
param snapshots is retrieved directly from the db. It is a list of
|
|
cinder.db.sqlalchemy.models.Snapshot to be precise. It cannot be
|
|
assigned to snapshots_model_update. snapshots_model_update is a list
|
|
of dictionaries. It has to be built by the driver. An entry will be
|
|
in this format: {'id': xxx, 'status': xxx, ......}. model_update
|
|
will be in this format: {'status': xxx, ......}.
|
|
|
|
The driver should populate snapshots_model_update and model_update
|
|
and return them.
|
|
|
|
The manager will check snapshots_model_update and update db accordingly
|
|
for each snapshot. If the driver successfully deleted some snapshots
|
|
but failed to delete others, it should set statuses of the snapshots
|
|
accordingly so that the manager can update db correctly.
|
|
|
|
If the status in any entry of snapshots_model_update is 'error', the
|
|
status in model_update will be set to the same if it is not already
|
|
'error'.
|
|
|
|
If the status in model_update is 'error', the manager will raise an
|
|
exception and the status of cgsnapshot will be set to 'error' in the
|
|
db. If snapshots_model_update is not returned by the driver, the
|
|
manager will set the status of every snapshot to 'error' in the except
|
|
block.
|
|
|
|
If the driver raises an exception during the operation, it will be
|
|
caught by the try-except block in the manager and the statuses of
|
|
cgsnapshot and all snapshots will be set to 'error'.
|
|
|
|
For a successful operation, the driver can either build the
|
|
model_update and snapshots_model_update and return them or
|
|
return None, None. The statuses of cgsnapshot and all snapshots
|
|
will be set to 'available' at the end of the manager function.
|
|
"""
|
|
|
|
def delete_cgsnapshot(self, context, cgsnapshot, snapshots):
|
|
"""Deletes a cgsnapshot.
|
|
|
|
:param context: the context of the caller.
|
|
:param cgsnapshot: the dictionary of the cgsnapshot to be deleted.
|
|
:param snapshots: a list of snapshot dictionaries in the cgsnapshot.
|
|
:returns: model_update, snapshots_model_update
|
|
|
|
param snapshots is retrieved directly from the db. It is a list of
|
|
cinder.db.sqlalchemy.models.Snapshot to be precise. It cannot be
|
|
assigned to snapshots_model_update. snapshots_model_update is a list
|
|
of dictionaries. It has to be built by the driver. An entry will be
|
|
in this format: {'id': xxx, 'status': xxx, ......}. model_update
|
|
will be in this format: {'status': xxx, ......}.
|
|
|
|
The driver should populate snapshots_model_update and model_update
|
|
and return them.
|
|
|
|
The manager will check snapshots_model_update and update db accordingly
|
|
for each snapshot. If the driver successfully deleted some snapshots
|
|
but failed to delete others, it should set statuses of the snapshots
|
|
accordingly so that the manager can update db correctly.
|
|
|
|
If the status in any entry of snapshots_model_update is
|
|
'error_deleting' or 'error', the status in model_update will be set to
|
|
the same if it is not already 'error_deleting' or 'error'.
|
|
|
|
If the status in model_update is 'error_deleting' or 'error', the
|
|
manager will raise an exception and the status of cgsnapshot will be
|
|
set to 'error' in the db. If snapshots_model_update is not returned by
|
|
the driver, the manager will set the status of every snapshot to
|
|
'error' in the except block.
|
|
|
|
If the driver raises an exception during the operation, it will be
|
|
caught by the try-except block in the manager and the statuses of
|
|
cgsnapshot and all snapshots will be set to 'error'.
|
|
|
|
For a successful operation, the driver can either build the
|
|
model_update and snapshots_model_update and return them or
|
|
return None, None. The statuses of cgsnapshot and all snapshots
|
|
will be set to 'deleted' after the manager deletes them from db.
|
|
"""
|