python-manilaclient/manilaclient/v2/resource_locks.py
Goutham Pacha Ravi 1734b45fa5 Support for resource locks
Add OSC and SDK interfaces to create,
view, update and delete resource locks.

Depends-On: I146bc09e4e8a39797e22458ff6860346e11e592e
Partially-Implements: bp allow-locking-shares-against-deletion
Change-Id: Ib8586a4f80aa8c172d876c6745ae73b7bdaf4705
2023-08-23 16:25:56 -07:00

131 lines
4.6 KiB
Python

# 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.
from manilaclient import api_versions
from manilaclient import base
from manilaclient.common import constants
class ResourceLock(base.Resource):
"""Lock a share resource action from being executed"""
def __repr__(self):
return "<ResourceLock: %s>" % self.id
def delete(self):
"""Delete this lock."""
return self.manager.delete(self)
def update(self, **kwargs):
"""Update this lock."""
return self.manager.update(self, **kwargs)
class ResourceLockManager(base.ManagerWithFind):
"""Manage :class:`ResourceLock` resources."""
resource_class = ResourceLock
@api_versions.wraps(constants.RESOURCE_LOCK_VERSION)
def create(self, resource_id, resource_type,
resource_action='delete', lock_reason=None):
"""Creates a resource lock.
:param resource_id: The ID of the resource to lock
:param resource_type: The type of the resource (e.g., "share",
"access")
:param resource_action: The functionality to lock (e.g., "delete",
"view/delete")
:param lock_reason: Lock description
:rtype: :class:`ResourceLock`
"""
body = {
'resource_lock': {
'resource_id': resource_id,
'resource_type': resource_type,
'resource_action': resource_action,
'lock_reason': lock_reason,
}
}
return self._create('/resource-locks', body, 'resource_lock')
@api_versions.wraps(constants.RESOURCE_LOCK_VERSION)
def get(self, lock_id):
"""Show details of a resource lock.
:param lock_id: The ID of the resource lock to display.
:rtype: :class:`ResourceLock`
"""
return self._get("/resource-locks/%s" % lock_id, "resource_lock")
@api_versions.wraps(constants.RESOURCE_LOCK_VERSION)
def list(self, search_opts=None, sort_key=None, sort_dir=None):
"""Get a list of all resource locks.
:param search_opts: Filtering options as a dictionary.
:param sort_key: Key to be sorted (i.e. 'created_at').
:param sort_dir: Sort direction, should be 'desc' or 'asc'.
:rtype: list of :class:`ResourceLock`
"""
search_opts = search_opts or {}
sort_key = sort_key or 'created_at'
if sort_key in constants.RESOURCE_LOCK_SORT_KEY_VALUES:
search_opts['sort_key'] = sort_key
else:
raise ValueError(
'sort_key must be one of the following: %s.'
% ', '.join(constants.RESOURCE_LOCK_SORT_KEY_VALUES))
sort_dir = sort_dir or 'desc'
if sort_dir in constants.SORT_DIR_VALUES:
search_opts['sort_dir'] = sort_dir
else:
raise ValueError('sort_dir must be one of the following: %s.'
% ', '.join(constants.SORT_DIR_VALUES))
query_string = self._build_query_string(search_opts)
path = "/resource-locks%s" % (query_string,)
return self._list(path, 'resource_locks')
@api_versions.wraps(constants.RESOURCE_LOCK_VERSION)
def update(self, lock, **kwargs):
"""Updates a resource lock.
:param lock: The :class:`ResourceLock` object, or a lock id to update.
:param kwargs: "resource_action" and "lock_reason" are allowed kwargs
:rtype: :class:`ResourceLock`
"""
if not kwargs:
return
body = {'resource_lock': {}}
if 'lock_reason' in kwargs:
body['resource_lock']['lock_reason'] = kwargs['lock_reason']
if 'resource_action' in kwargs:
body['resource_lock']['resource_action'] = (
kwargs['resource_action']
)
lock_id = base.getid(lock)
return self._update("/resource-locks/%s" % lock_id, body)
@api_versions.wraps(constants.RESOURCE_LOCK_VERSION)
def delete(self, lock):
"""Delete a resource lock.
:param lock: The :class:`ResourceLock` object, or a lock id to delete.
"""
return self._delete("/resource-locks/%s" % base.getid(lock))