Refactor code from oslo_incubator
At some point, common code for this project originated in the oslo_incubator project; and we performed a final sync of this code in 2014 [1]. However, this sync'ed code was unused; so lets delete this code and consolidate common code for ease of use. [1] https://review.opendev.org/c/openstack/python-manilaclient/+/98088 Change-Id: Ifd9c7516aab8e3c2d017a1ce421d2e65e76d5640 Signed-off-by: Goutham Pacha Ravi <gouthampravi@gmail.com>
This commit is contained in:
parent
f9aee522ef
commit
c7b1c6a1d3
@ -20,6 +20,7 @@ Base utilities to build API operation managers and objects on top of.
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import contextlib
|
import contextlib
|
||||||
|
import copy
|
||||||
import hashlib
|
import hashlib
|
||||||
import os
|
import os
|
||||||
|
|
||||||
@ -28,12 +29,21 @@ from manilaclient import exceptions
|
|||||||
from manilaclient import utils
|
from manilaclient import utils
|
||||||
|
|
||||||
|
|
||||||
# Python 2.4 compat
|
def getid(obj):
|
||||||
try:
|
"""Return id if argument is a Resource.
|
||||||
all
|
|
||||||
except NameError:
|
Abstracts the common pattern of allowing both an object or an object's ID
|
||||||
def all(iterable):
|
(UUID) as a parameter when dealing with relationships.
|
||||||
return True not in (not x for x in iterable)
|
"""
|
||||||
|
try:
|
||||||
|
if obj.uuid:
|
||||||
|
return obj.uuid
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
return obj.id
|
||||||
|
except AttributeError:
|
||||||
|
return obj
|
||||||
|
|
||||||
|
|
||||||
class Manager(utils.HookableMixin):
|
class Manager(utils.HookableMixin):
|
||||||
@ -53,6 +63,17 @@ class Manager(utils.HookableMixin):
|
|||||||
return self.api.api_version
|
return self.api.api_version
|
||||||
|
|
||||||
def _list(self, url, response_key, obj_class=None, body=None):
|
def _list(self, url, response_key, obj_class=None, body=None):
|
||||||
|
"""List the collection.
|
||||||
|
|
||||||
|
:param url: a partial URL, e.g., '/shares'
|
||||||
|
:param response_key: the key to be looked up in response dictionary,
|
||||||
|
e.g., 'shares'. If response_key is None - all response body
|
||||||
|
will be used.
|
||||||
|
:param obj_class: class for constructing the returned objects
|
||||||
|
(self.resource_class will be used by default)
|
||||||
|
:param body: data that will be encoded as JSON and passed in POST
|
||||||
|
request (GET will be sent by default)
|
||||||
|
"""
|
||||||
resp = None
|
resp = None
|
||||||
if body:
|
if body:
|
||||||
resp, body = self.api.client.post(url, body=body)
|
resp, body = self.api.client.post(url, body=body)
|
||||||
@ -228,3 +249,98 @@ class ManagerWithFind(Manager):
|
|||||||
|
|
||||||
def list(self, search_opts=None):
|
def list(self, search_opts=None):
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
|
|
||||||
|
class Resource(object):
|
||||||
|
"""Base class for OpenStack resources (tenant, user, etc.).
|
||||||
|
|
||||||
|
This is pretty much just a bag for attributes.
|
||||||
|
"""
|
||||||
|
|
||||||
|
HUMAN_ID = False
|
||||||
|
NAME_ATTR = 'name'
|
||||||
|
|
||||||
|
def __init__(self, manager, info, loaded=False):
|
||||||
|
"""Populate and bind to a manager.
|
||||||
|
|
||||||
|
:param manager: BaseManager object
|
||||||
|
:param info: dictionary representing resource attributes
|
||||||
|
:param loaded: prevent lazy-loading if set to True
|
||||||
|
"""
|
||||||
|
self.manager = manager
|
||||||
|
self._info = info
|
||||||
|
self._add_details(info)
|
||||||
|
self._loaded = loaded
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
reprkeys = sorted(k
|
||||||
|
for k in self.__dict__.keys()
|
||||||
|
if k[0] != '_' and k != 'manager')
|
||||||
|
info = ", ".join("%s=%s" % (k, getattr(self, k)) for k in reprkeys)
|
||||||
|
return "<%s %s>" % (self.__class__.__name__, info)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def human_id(self):
|
||||||
|
"""Human-readable ID which can be used for bash completion."""
|
||||||
|
if self.HUMAN_ID:
|
||||||
|
name = getattr(self, self.NAME_ATTR, None)
|
||||||
|
if name is not None:
|
||||||
|
return strutils.to_slug(name)
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _add_details(self, info):
|
||||||
|
for (k, v) in info.items():
|
||||||
|
try:
|
||||||
|
setattr(self, k, v)
|
||||||
|
self._info[k] = v
|
||||||
|
except AttributeError:
|
||||||
|
# In this case we already defined the attribute on the class
|
||||||
|
pass
|
||||||
|
|
||||||
|
def __getattr__(self, k):
|
||||||
|
if k not in self.__dict__:
|
||||||
|
# NOTE(bcwaldon): disallow lazy-loading if already loaded once
|
||||||
|
if not self.is_loaded():
|
||||||
|
self.get()
|
||||||
|
return self.__getattr__(k)
|
||||||
|
|
||||||
|
raise AttributeError(k)
|
||||||
|
else:
|
||||||
|
return self.__dict__[k]
|
||||||
|
|
||||||
|
def get(self):
|
||||||
|
"""Support for lazy loading details.
|
||||||
|
|
||||||
|
Some clients, such as novaclient have the option to lazy load the
|
||||||
|
details, details which can be loaded with this function.
|
||||||
|
"""
|
||||||
|
# set_loaded() first ... so if we have to bail, we know we tried.
|
||||||
|
self.set_loaded(True)
|
||||||
|
if not hasattr(self.manager, 'get'):
|
||||||
|
return
|
||||||
|
|
||||||
|
new = self.manager.get(self.id)
|
||||||
|
if new:
|
||||||
|
self._add_details(new._info)
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
if not isinstance(other, Resource):
|
||||||
|
return NotImplemented
|
||||||
|
# two resources of different types are not equal
|
||||||
|
if not isinstance(other, self.__class__):
|
||||||
|
return False
|
||||||
|
if hasattr(self, 'id') and hasattr(other, 'id'):
|
||||||
|
return self.id == other.id
|
||||||
|
return self._info == other._info
|
||||||
|
|
||||||
|
def __ne__(self, other):
|
||||||
|
return not self == other
|
||||||
|
|
||||||
|
def is_loaded(self):
|
||||||
|
return self._loaded
|
||||||
|
|
||||||
|
def set_loaded(self, val):
|
||||||
|
self._loaded = val
|
||||||
|
|
||||||
|
def to_dict(self):
|
||||||
|
return copy.deepcopy(self._info)
|
||||||
|
@ -1,516 +0,0 @@
|
|||||||
# Copyright 2010 Jacob Kaplan-Moss
|
|
||||||
# Copyright 2011 OpenStack Foundation
|
|
||||||
# Copyright 2012 Grid Dynamics
|
|
||||||
# Copyright 2013 OpenStack Foundation
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
"""
|
|
||||||
Base utilities to build API operation managers and objects on top of.
|
|
||||||
"""
|
|
||||||
|
|
||||||
# E1102: %s is not callable
|
|
||||||
# pylint: disable=E1102
|
|
||||||
|
|
||||||
import abc
|
|
||||||
import copy
|
|
||||||
|
|
||||||
from oslo_utils import strutils
|
|
||||||
|
|
||||||
from manilaclient.common._i18n import _
|
|
||||||
from manilaclient.common.apiclient import exceptions
|
|
||||||
from manilaclient import utils
|
|
||||||
|
|
||||||
|
|
||||||
def getid(obj):
|
|
||||||
"""Return id if argument is a Resource.
|
|
||||||
|
|
||||||
Abstracts the common pattern of allowing both an object or an object's ID
|
|
||||||
(UUID) as a parameter when dealing with relationships.
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
if obj.uuid:
|
|
||||||
return obj.uuid
|
|
||||||
except AttributeError:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
return obj.id
|
|
||||||
except AttributeError:
|
|
||||||
return obj
|
|
||||||
|
|
||||||
|
|
||||||
# TODO(aababilov): call run_hooks() in HookableMixin's child classes
|
|
||||||
class HookableMixin(object):
|
|
||||||
"""Mixin so classes can register and run hooks."""
|
|
||||||
_hooks_map = {}
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def add_hook(cls, hook_type, hook_func):
|
|
||||||
"""Add a new hook of specified type.
|
|
||||||
|
|
||||||
:param cls: class that registers hooks
|
|
||||||
:param hook_type: hook type, e.g., '__pre_parse_args__'
|
|
||||||
:param hook_func: hook function
|
|
||||||
"""
|
|
||||||
if hook_type not in cls._hooks_map:
|
|
||||||
cls._hooks_map[hook_type] = []
|
|
||||||
|
|
||||||
cls._hooks_map[hook_type].append(hook_func)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def run_hooks(cls, hook_type, *args, **kwargs):
|
|
||||||
"""Run all hooks of specified type.
|
|
||||||
|
|
||||||
:param cls: class that registers hooks
|
|
||||||
:param hook_type: hook type, e.g., '__pre_parse_args__'
|
|
||||||
:param args: args to be passed to every hook function
|
|
||||||
:param kwargs: kwargs to be passed to every hook function
|
|
||||||
"""
|
|
||||||
hook_funcs = cls._hooks_map.get(hook_type) or []
|
|
||||||
for hook_func in hook_funcs:
|
|
||||||
hook_func(*args, **kwargs)
|
|
||||||
|
|
||||||
|
|
||||||
class BaseManager(HookableMixin):
|
|
||||||
"""Basic manager type providing common operations.
|
|
||||||
|
|
||||||
Managers interact with a particular type of API (servers, flavors, images,
|
|
||||||
etc.) and provide CRUD operations for them.
|
|
||||||
"""
|
|
||||||
resource_class = None
|
|
||||||
|
|
||||||
def __init__(self, client):
|
|
||||||
"""Initializes BaseManager with `client`.
|
|
||||||
|
|
||||||
:param client: instance of BaseClient descendant for HTTP requests
|
|
||||||
"""
|
|
||||||
super(BaseManager, self).__init__()
|
|
||||||
self.client = client
|
|
||||||
|
|
||||||
def _list(self, url, response_key=None, obj_class=None, json=None):
|
|
||||||
"""List the collection.
|
|
||||||
|
|
||||||
:param url: a partial URL, e.g., '/servers'
|
|
||||||
:param response_key: the key to be looked up in response dictionary,
|
|
||||||
e.g., 'servers'. If response_key is None - all response body
|
|
||||||
will be used.
|
|
||||||
:param obj_class: class for constructing the returned objects
|
|
||||||
(self.resource_class will be used by default)
|
|
||||||
:param json: data that will be encoded as JSON and passed in POST
|
|
||||||
request (GET will be sent by default)
|
|
||||||
"""
|
|
||||||
if json:
|
|
||||||
body = self.client.post(url, json=json).json()
|
|
||||||
else:
|
|
||||||
body = self.client.get(url).json()
|
|
||||||
|
|
||||||
if obj_class is None:
|
|
||||||
obj_class = self.resource_class
|
|
||||||
|
|
||||||
data = body[response_key] if response_key is not None else body
|
|
||||||
# NOTE(ja): keystone returns values as list as {'values': [ ... ]}
|
|
||||||
# unlike other services which just return the list...
|
|
||||||
try:
|
|
||||||
data = data['values']
|
|
||||||
except (KeyError, TypeError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
return [obj_class(self, res, loaded=True) for res in data if res]
|
|
||||||
|
|
||||||
def _get(self, url, response_key=None):
|
|
||||||
"""Get an object from collection.
|
|
||||||
|
|
||||||
:param url: a partial URL, e.g., '/servers'
|
|
||||||
:param response_key: the key to be looked up in response dictionary,
|
|
||||||
e.g., 'server'. If response_key is None - all response body
|
|
||||||
will be used.
|
|
||||||
"""
|
|
||||||
body = self.client.get(url).json()
|
|
||||||
data = body[response_key] if response_key is not None else body
|
|
||||||
return self.resource_class(self, data, loaded=True)
|
|
||||||
|
|
||||||
def _head(self, url):
|
|
||||||
"""Retrieve request headers for an object.
|
|
||||||
|
|
||||||
:param url: a partial URL, e.g., '/servers'
|
|
||||||
"""
|
|
||||||
resp = self.client.head(url)
|
|
||||||
return resp.status_code == 204
|
|
||||||
|
|
||||||
def _post(self, url, json, response_key=None, return_raw=False):
|
|
||||||
"""Create an object.
|
|
||||||
|
|
||||||
:param url: a partial URL, e.g., '/servers'
|
|
||||||
:param json: data that will be encoded as JSON and passed in POST
|
|
||||||
request (GET will be sent by default)
|
|
||||||
:param response_key: the key to be looked up in response dictionary,
|
|
||||||
e.g., 'server'. If response_key is None - all response body
|
|
||||||
will be used.
|
|
||||||
:param return_raw: flag to force returning raw JSON instead of
|
|
||||||
Python object of self.resource_class
|
|
||||||
"""
|
|
||||||
body = self.client.post(url, json=json).json()
|
|
||||||
data = body[response_key] if response_key is not None else body
|
|
||||||
if return_raw:
|
|
||||||
return data
|
|
||||||
return self.resource_class(self, data)
|
|
||||||
|
|
||||||
def _put(self, url, json=None, response_key=None):
|
|
||||||
"""Update an object with PUT method.
|
|
||||||
|
|
||||||
:param url: a partial URL, e.g., '/servers'
|
|
||||||
:param json: data that will be encoded as JSON and passed in POST
|
|
||||||
request (GET will be sent by default)
|
|
||||||
:param response_key: the key to be looked up in response dictionary,
|
|
||||||
e.g., 'servers'. If response_key is None - all response body
|
|
||||||
will be used.
|
|
||||||
"""
|
|
||||||
resp = self.client.put(url, json=json)
|
|
||||||
# PUT requests may not return a body
|
|
||||||
if resp.content:
|
|
||||||
body = resp.json()
|
|
||||||
if response_key is not None:
|
|
||||||
return self.resource_class(self, body[response_key])
|
|
||||||
else:
|
|
||||||
return self.resource_class(self, body)
|
|
||||||
|
|
||||||
def _patch(self, url, json=None, response_key=None):
|
|
||||||
"""Update an object with PATCH method.
|
|
||||||
|
|
||||||
:param url: a partial URL, e.g., '/servers'
|
|
||||||
:param json: data that will be encoded as JSON and passed in POST
|
|
||||||
request (GET will be sent by default)
|
|
||||||
:param response_key: the key to be looked up in response dictionary,
|
|
||||||
e.g., 'servers'. If response_key is None - all response body
|
|
||||||
will be used.
|
|
||||||
"""
|
|
||||||
body = self.client.patch(url, json=json).json()
|
|
||||||
if response_key is not None:
|
|
||||||
return self.resource_class(self, body[response_key])
|
|
||||||
else:
|
|
||||||
return self.resource_class(self, body)
|
|
||||||
|
|
||||||
def _delete(self, url):
|
|
||||||
"""Delete an object.
|
|
||||||
|
|
||||||
:param url: a partial URL, e.g., '/servers/my-server'
|
|
||||||
"""
|
|
||||||
return self.client.delete(url)
|
|
||||||
|
|
||||||
|
|
||||||
class ManagerWithFind(BaseManager, metaclass=abc.ABCMeta):
|
|
||||||
"""Manager with additional `find()`/`findall()` methods."""
|
|
||||||
|
|
||||||
@abc.abstractmethod
|
|
||||||
def list(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def find(self, **kwargs):
|
|
||||||
"""Find a single item with attributes matching ``**kwargs``.
|
|
||||||
|
|
||||||
This isn't very efficient: it loads the entire list then filters on
|
|
||||||
the Python side.
|
|
||||||
"""
|
|
||||||
matches = self.findall(**kwargs)
|
|
||||||
num_matches = len(matches)
|
|
||||||
if num_matches == 0:
|
|
||||||
msg = _("No %(name)s matching %(args)s.") % {
|
|
||||||
'name': self.resource_class.__name__,
|
|
||||||
'args': kwargs
|
|
||||||
}
|
|
||||||
raise exceptions.NotFound(msg)
|
|
||||||
elif num_matches > 1:
|
|
||||||
raise exceptions.NoUniqueMatch()
|
|
||||||
else:
|
|
||||||
return matches[0]
|
|
||||||
|
|
||||||
def findall(self, **kwargs):
|
|
||||||
"""Find all items with attributes matching ``**kwargs``.
|
|
||||||
|
|
||||||
This isn't very efficient: it loads the entire list then filters on
|
|
||||||
the Python side.
|
|
||||||
"""
|
|
||||||
found = []
|
|
||||||
searches = kwargs.items()
|
|
||||||
|
|
||||||
for obj in self.list():
|
|
||||||
try:
|
|
||||||
if all(getattr(obj, attr) == value
|
|
||||||
for (attr, value) in searches):
|
|
||||||
found.append(obj)
|
|
||||||
except AttributeError:
|
|
||||||
continue
|
|
||||||
|
|
||||||
return found
|
|
||||||
|
|
||||||
|
|
||||||
class CrudManager(BaseManager):
|
|
||||||
"""Base manager class for manipulating entities.
|
|
||||||
|
|
||||||
Children of this class are expected to define a `collection_key` and `key`.
|
|
||||||
|
|
||||||
- `collection_key`: Usually a plural noun by convention (e.g. `entities`);
|
|
||||||
used to refer collections in both URL's (e.g. `/v3/entities`) and JSON
|
|
||||||
objects containing a list of member resources (e.g. `{'entities': [{},
|
|
||||||
{}, {}]}`).
|
|
||||||
- `key`: Usually a singular noun by convention (e.g. `entity`); used to
|
|
||||||
refer to an individual member of the collection.
|
|
||||||
|
|
||||||
"""
|
|
||||||
collection_key = None
|
|
||||||
key = None
|
|
||||||
|
|
||||||
def build_url(self, base_url=None, **kwargs):
|
|
||||||
"""Builds a resource URL for the given kwargs.
|
|
||||||
|
|
||||||
Given an example collection where `collection_key = 'entities'` and
|
|
||||||
`key = 'entity'`, the following URL's could be generated.
|
|
||||||
|
|
||||||
By default, the URL will represent a collection of entities, e.g.::
|
|
||||||
|
|
||||||
/entities
|
|
||||||
|
|
||||||
If kwargs contains an `entity_id`, then the URL will represent a
|
|
||||||
specific member, e.g.::
|
|
||||||
|
|
||||||
/entities/{entity_id}
|
|
||||||
|
|
||||||
:param base_url: if provided, the generated URL will be appended to it
|
|
||||||
"""
|
|
||||||
url = base_url if base_url is not None else ''
|
|
||||||
|
|
||||||
url += '/%s' % self.collection_key
|
|
||||||
|
|
||||||
# do we have a specific entity?
|
|
||||||
entity_id = kwargs.get('%s_id' % self.key)
|
|
||||||
if entity_id is not None:
|
|
||||||
url += '/%s' % entity_id
|
|
||||||
|
|
||||||
return url
|
|
||||||
|
|
||||||
def _filter_kwargs(self, kwargs):
|
|
||||||
"""Drop null values and handle ids."""
|
|
||||||
for key, ref in kwargs.copy().items():
|
|
||||||
if ref is None:
|
|
||||||
kwargs.pop(key)
|
|
||||||
else:
|
|
||||||
if isinstance(ref, Resource):
|
|
||||||
kwargs.pop(key)
|
|
||||||
kwargs['%s_id' % key] = getid(ref)
|
|
||||||
return kwargs
|
|
||||||
|
|
||||||
def create(self, **kwargs):
|
|
||||||
kwargs = self._filter_kwargs(kwargs)
|
|
||||||
return self._post(
|
|
||||||
self.build_url(**kwargs),
|
|
||||||
{self.key: kwargs},
|
|
||||||
self.key)
|
|
||||||
|
|
||||||
def get(self, **kwargs):
|
|
||||||
kwargs = self._filter_kwargs(kwargs)
|
|
||||||
return self._get(
|
|
||||||
self.build_url(**kwargs),
|
|
||||||
self.key)
|
|
||||||
|
|
||||||
def head(self, **kwargs):
|
|
||||||
kwargs = self._filter_kwargs(kwargs)
|
|
||||||
return self._head(self.build_url(**kwargs))
|
|
||||||
|
|
||||||
def list(self, base_url=None, **kwargs):
|
|
||||||
"""List the collection.
|
|
||||||
|
|
||||||
:param base_url: if provided, the generated URL will be appended to it
|
|
||||||
"""
|
|
||||||
kwargs = self._filter_kwargs(kwargs)
|
|
||||||
|
|
||||||
return self._list(
|
|
||||||
'%(base_url)s%(query)s' % {
|
|
||||||
'base_url': self.build_url(base_url=base_url, **kwargs),
|
|
||||||
'query': '?%s' % utils.safe_urlencode(kwargs) if kwargs else ''
|
|
||||||
},
|
|
||||||
self.collection_key)
|
|
||||||
|
|
||||||
def put(self, base_url=None, **kwargs):
|
|
||||||
"""Update an element.
|
|
||||||
|
|
||||||
:param base_url: if provided, the generated URL will be appended to it
|
|
||||||
"""
|
|
||||||
kwargs = self._filter_kwargs(kwargs)
|
|
||||||
|
|
||||||
return self._put(self.build_url(base_url=base_url, **kwargs))
|
|
||||||
|
|
||||||
def update(self, **kwargs):
|
|
||||||
kwargs = self._filter_kwargs(kwargs)
|
|
||||||
params = kwargs.copy()
|
|
||||||
params.pop('%s_id' % self.key)
|
|
||||||
|
|
||||||
return self._patch(
|
|
||||||
self.build_url(**kwargs),
|
|
||||||
{self.key: params},
|
|
||||||
self.key)
|
|
||||||
|
|
||||||
def delete(self, **kwargs):
|
|
||||||
kwargs = self._filter_kwargs(kwargs)
|
|
||||||
|
|
||||||
return self._delete(
|
|
||||||
self.build_url(**kwargs))
|
|
||||||
|
|
||||||
def find(self, base_url=None, **kwargs):
|
|
||||||
"""Find a single item with attributes matching ``**kwargs``.
|
|
||||||
|
|
||||||
:param base_url: if provided, the generated URL will be appended to it
|
|
||||||
"""
|
|
||||||
kwargs = self._filter_kwargs(kwargs)
|
|
||||||
|
|
||||||
rl = self._list(
|
|
||||||
'%(base_url)s%(query)s' % {
|
|
||||||
'base_url': self.build_url(base_url=base_url, **kwargs),
|
|
||||||
'query': '?%s' % utils.safe_urlencode(kwargs) if kwargs else ''
|
|
||||||
},
|
|
||||||
self.collection_key)
|
|
||||||
num = len(rl)
|
|
||||||
|
|
||||||
if num == 0:
|
|
||||||
msg = _("No %(name)s matching %(args)s.") % {
|
|
||||||
'name': self.resource_class.__name__,
|
|
||||||
'args': kwargs
|
|
||||||
}
|
|
||||||
raise exceptions.NotFound(404, msg)
|
|
||||||
elif num > 1:
|
|
||||||
raise exceptions.NoUniqueMatch
|
|
||||||
else:
|
|
||||||
return rl[0]
|
|
||||||
|
|
||||||
|
|
||||||
class Extension(HookableMixin):
|
|
||||||
"""Extension descriptor."""
|
|
||||||
|
|
||||||
SUPPORTED_HOOKS = ('__pre_parse_args__', '__post_parse_args__')
|
|
||||||
manager_class = None
|
|
||||||
|
|
||||||
def __init__(self, name, module):
|
|
||||||
super(Extension, self).__init__()
|
|
||||||
self.name = name
|
|
||||||
self.module = module
|
|
||||||
self._parse_extension_module()
|
|
||||||
|
|
||||||
def _parse_extension_module(self):
|
|
||||||
self.manager_class = None
|
|
||||||
for attr_name, attr_value in self.module.__dict__.items():
|
|
||||||
if attr_name in self.SUPPORTED_HOOKS:
|
|
||||||
self.add_hook(attr_name, attr_value)
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
if issubclass(attr_value, BaseManager):
|
|
||||||
self.manager_class = attr_value
|
|
||||||
except TypeError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return "<Extension '%s'>" % self.name
|
|
||||||
|
|
||||||
|
|
||||||
class Resource(object):
|
|
||||||
"""Base class for OpenStack resources (tenant, user, etc.).
|
|
||||||
|
|
||||||
This is pretty much just a bag for attributes.
|
|
||||||
"""
|
|
||||||
|
|
||||||
HUMAN_ID = False
|
|
||||||
NAME_ATTR = 'name'
|
|
||||||
|
|
||||||
def __init__(self, manager, info, loaded=False):
|
|
||||||
"""Populate and bind to a manager.
|
|
||||||
|
|
||||||
:param manager: BaseManager object
|
|
||||||
:param info: dictionary representing resource attributes
|
|
||||||
:param loaded: prevent lazy-loading if set to True
|
|
||||||
"""
|
|
||||||
self.manager = manager
|
|
||||||
self._info = info
|
|
||||||
self._add_details(info)
|
|
||||||
self._loaded = loaded
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
reprkeys = sorted(k
|
|
||||||
for k in self.__dict__.keys()
|
|
||||||
if k[0] != '_' and k != 'manager')
|
|
||||||
info = ", ".join("%s=%s" % (k, getattr(self, k)) for k in reprkeys)
|
|
||||||
return "<%s %s>" % (self.__class__.__name__, info)
|
|
||||||
|
|
||||||
@property
|
|
||||||
def human_id(self):
|
|
||||||
"""Human-readable ID which can be used for bash completion."""
|
|
||||||
if self.HUMAN_ID:
|
|
||||||
name = getattr(self, self.NAME_ATTR, None)
|
|
||||||
if name is not None:
|
|
||||||
return strutils.to_slug(name)
|
|
||||||
return None
|
|
||||||
|
|
||||||
def _add_details(self, info):
|
|
||||||
for (k, v) in info.items():
|
|
||||||
try:
|
|
||||||
setattr(self, k, v)
|
|
||||||
self._info[k] = v
|
|
||||||
except AttributeError:
|
|
||||||
# In this case we already defined the attribute on the class
|
|
||||||
pass
|
|
||||||
|
|
||||||
def __getattr__(self, k):
|
|
||||||
if k not in self.__dict__:
|
|
||||||
# NOTE(bcwaldon): disallow lazy-loading if already loaded once
|
|
||||||
if not self.is_loaded():
|
|
||||||
self.get()
|
|
||||||
return self.__getattr__(k)
|
|
||||||
|
|
||||||
raise AttributeError(k)
|
|
||||||
else:
|
|
||||||
return self.__dict__[k]
|
|
||||||
|
|
||||||
def get(self):
|
|
||||||
"""Support for lazy loading details.
|
|
||||||
|
|
||||||
Some clients, such as novaclient have the option to lazy load the
|
|
||||||
details, details which can be loaded with this function.
|
|
||||||
"""
|
|
||||||
# set_loaded() first ... so if we have to bail, we know we tried.
|
|
||||||
self.set_loaded(True)
|
|
||||||
if not hasattr(self.manager, 'get'):
|
|
||||||
return
|
|
||||||
|
|
||||||
new = self.manager.get(self.id)
|
|
||||||
if new:
|
|
||||||
self._add_details(new._info)
|
|
||||||
|
|
||||||
def __eq__(self, other):
|
|
||||||
if not isinstance(other, Resource):
|
|
||||||
return NotImplemented
|
|
||||||
# two resources of different types are not equal
|
|
||||||
if not isinstance(other, self.__class__):
|
|
||||||
return False
|
|
||||||
if hasattr(self, 'id') and hasattr(other, 'id'):
|
|
||||||
return self.id == other.id
|
|
||||||
return self._info == other._info
|
|
||||||
|
|
||||||
def __ne__(self, other):
|
|
||||||
return not self == other
|
|
||||||
|
|
||||||
def is_loaded(self):
|
|
||||||
return self._loaded
|
|
||||||
|
|
||||||
def set_loaded(self, val):
|
|
||||||
self._loaded = val
|
|
||||||
|
|
||||||
def to_dict(self):
|
|
||||||
return copy.deepcopy(self._info)
|
|
@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
|
|
||||||
from manilaclient.common.apiclient import base as common_base
|
from manilaclient import base
|
||||||
from manilaclient import exceptions
|
from manilaclient import exceptions
|
||||||
from manilaclient.tests.unit import utils
|
from manilaclient.tests.unit import utils
|
||||||
from manilaclient.tests.unit.v2 import fakes
|
from manilaclient.tests.unit.v2 import fakes
|
||||||
@ -25,7 +25,7 @@ cs = fakes.FakeClient()
|
|||||||
class BaseTest(utils.TestCase):
|
class BaseTest(utils.TestCase):
|
||||||
|
|
||||||
def test_resource_repr(self):
|
def test_resource_repr(self):
|
||||||
r = common_base.Resource(None, dict(foo="bar", baz="spam"))
|
r = base.Resource(None, dict(foo="bar", baz="spam"))
|
||||||
self.assertEqual(repr(r), "<Resource baz=spam, foo=bar>")
|
self.assertEqual(repr(r), "<Resource baz=spam, foo=bar>")
|
||||||
|
|
||||||
def test_eq(self):
|
def test_eq(self):
|
||||||
@ -33,13 +33,13 @@ class BaseTest(utils.TestCase):
|
|||||||
# The truth of r1==r2 does not imply that r1!=r2 is false in PY2.
|
# The truth of r1==r2 does not imply that r1!=r2 is false in PY2.
|
||||||
# Test that inequality operator is defined and that comparing equal
|
# Test that inequality operator is defined and that comparing equal
|
||||||
# items returns False.
|
# items returns False.
|
||||||
r1 = common_base.Resource(None, {'id': 1, 'name': 'hi'})
|
r1 = base.Resource(None, {'id': 1, 'name': 'hi'})
|
||||||
r2 = common_base.Resource(None, {'id': 1, 'name': 'hello'})
|
r2 = base.Resource(None, {'id': 1, 'name': 'hello'})
|
||||||
self.assertTrue(r1 == r2)
|
self.assertTrue(r1 == r2)
|
||||||
self.assertFalse(r1 != r2)
|
self.assertFalse(r1 != r2)
|
||||||
|
|
||||||
# Two resources of different types: never equal
|
# Two resources of different types: never equal
|
||||||
r1 = common_base.Resource(None, {'id': 1})
|
r1 = base.Resource(None, {'id': 1})
|
||||||
r2 = shares.Share(None, {'id': 1})
|
r2 = shares.Share(None, {'id': 1})
|
||||||
self.assertNotEqual(r1, r2)
|
self.assertNotEqual(r1, r2)
|
||||||
self.assertTrue(r1 != r2)
|
self.assertTrue(r1 != r2)
|
||||||
@ -48,8 +48,8 @@ class BaseTest(utils.TestCase):
|
|||||||
# The truth of r1==r2 does not imply that r1!=r2 is false in PY2.
|
# The truth of r1==r2 does not imply that r1!=r2 is false in PY2.
|
||||||
# Test that inequality operator is defined and that comparing equal
|
# Test that inequality operator is defined and that comparing equal
|
||||||
# items returns False.
|
# items returns False.
|
||||||
r1 = common_base.Resource(None, {'name': 'joe', 'age': 12})
|
r1 = base.Resource(None, {'name': 'joe', 'age': 12})
|
||||||
r2 = common_base.Resource(None, {'name': 'joe', 'age': 12})
|
r2 = base.Resource(None, {'name': 'joe', 'age': 12})
|
||||||
self.assertTrue(r1 == r2)
|
self.assertTrue(r1 == r2)
|
||||||
self.assertFalse(r1 != r2)
|
self.assertFalse(r1 != r2)
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ from unittest import mock
|
|||||||
|
|
||||||
import ddt
|
import ddt
|
||||||
|
|
||||||
from manilaclient.common.apiclient import base as common_base
|
from manilaclient import base
|
||||||
from manilaclient.common import constants
|
from manilaclient.common import constants
|
||||||
from manilaclient.tests.unit import utils
|
from manilaclient.tests.unit import utils
|
||||||
from manilaclient.tests.unit.v2 import fakes
|
from manilaclient.tests.unit.v2 import fakes
|
||||||
@ -143,7 +143,7 @@ class ShareServerManagerTest(utils.TestCase):
|
|||||||
|
|
||||||
with mock.patch.object(self.manager.api.client, 'post',
|
with mock.patch.object(self.manager.api.client, 'post',
|
||||||
mock.Mock(return_value='fake')):
|
mock.Mock(return_value='fake')):
|
||||||
self.mock_object(common_base, 'getid',
|
self.mock_object(base, 'getid',
|
||||||
mock.Mock(return_value=share_server['id']))
|
mock.Mock(return_value=share_server['id']))
|
||||||
result = self.manager._action(action, share_server, info)
|
result = self.manager._action(action, share_server, info)
|
||||||
self.manager.api.client.post.assert_called_once_with(
|
self.manager.api.client.post.assert_called_once_with(
|
||||||
|
@ -15,14 +15,13 @@
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
|
|
||||||
RESOURCE_PATH_LEGACY = '/os-availability-zone'
|
RESOURCE_PATH_LEGACY = '/os-availability-zone'
|
||||||
RESOURCE_PATH = '/availability-zones'
|
RESOURCE_PATH = '/availability-zones'
|
||||||
RESOURCE_NAME = 'availability_zones'
|
RESOURCE_NAME = 'availability_zones'
|
||||||
|
|
||||||
|
|
||||||
class AvailabilityZone(common_base.Resource):
|
class AvailabilityZone(base.Resource):
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<AvailabilityZone: %s>" % self.id
|
return "<AvailabilityZone: %s>" % self.id
|
||||||
|
@ -14,11 +14,10 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
from manilaclient.common import cliutils
|
from manilaclient.common import cliutils
|
||||||
|
|
||||||
|
|
||||||
class ListExtResource(common_base.Resource):
|
class ListExtResource(base.Resource):
|
||||||
@property
|
@property
|
||||||
def summary(self):
|
def summary(self):
|
||||||
descr = self.description.strip()
|
descr = self.description.strip()
|
||||||
|
@ -15,10 +15,9 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
|
|
||||||
|
|
||||||
class Limits(common_base.Resource):
|
class Limits(base.Resource):
|
||||||
"""A collection of RateLimit and AbsoluteLimit objects."""
|
"""A collection of RateLimit and AbsoluteLimit objects."""
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
|
@ -13,7 +13,6 @@
|
|||||||
"""Asynchronous User Message interface."""
|
"""Asynchronous User Message interface."""
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
from manilaclient.common import constants
|
from manilaclient.common import constants
|
||||||
|
|
||||||
RESOURCES_PATH = '/messages'
|
RESOURCES_PATH = '/messages'
|
||||||
@ -22,7 +21,7 @@ RESOURCES_NAME = 'messages'
|
|||||||
RESOURCE_NAME = 'message'
|
RESOURCE_NAME = 'message'
|
||||||
|
|
||||||
|
|
||||||
class Message(common_base.Resource):
|
class Message(base.Resource):
|
||||||
NAME_ATTR = 'id'
|
NAME_ATTR = 'id'
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
@ -79,6 +78,6 @@ class MessageManager(base.ManagerWithFind):
|
|||||||
def delete(self, message):
|
def delete(self, message):
|
||||||
"""Delete a message."""
|
"""Delete a message."""
|
||||||
|
|
||||||
loc = RESOURCE_PATH % common_base.getid(message)
|
loc = RESOURCE_PATH % base.getid(message)
|
||||||
|
|
||||||
return self._delete(loc)
|
return self._delete(loc)
|
||||||
|
@ -15,14 +15,13 @@
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
|
|
||||||
RESOURCE_PATH_LEGACY = '/os-quota-class-sets'
|
RESOURCE_PATH_LEGACY = '/os-quota-class-sets'
|
||||||
RESOURCE_PATH = '/quota-class-sets'
|
RESOURCE_PATH = '/quota-class-sets'
|
||||||
REPLICA_QUOTAS_MICROVERSION = "2.53"
|
REPLICA_QUOTAS_MICROVERSION = "2.53"
|
||||||
|
|
||||||
|
|
||||||
class QuotaClassSet(common_base.Resource):
|
class QuotaClassSet(base.Resource):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def id(self):
|
def id(self):
|
||||||
|
@ -15,14 +15,13 @@
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
|
|
||||||
RESOURCE_PATH_LEGACY = '/os-quota-sets'
|
RESOURCE_PATH_LEGACY = '/os-quota-sets'
|
||||||
RESOURCE_PATH = '/quota-sets'
|
RESOURCE_PATH = '/quota-sets'
|
||||||
REPLICA_QUOTAS_MICROVERSION = "2.53"
|
REPLICA_QUOTAS_MICROVERSION = "2.53"
|
||||||
|
|
||||||
|
|
||||||
class QuotaSet(common_base.Resource):
|
class QuotaSet(base.Resource):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def id(self):
|
def id(self):
|
||||||
|
@ -13,13 +13,12 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
|
|
||||||
RESOURCES_PATH = '/scheduler-stats/pools'
|
RESOURCES_PATH = '/scheduler-stats/pools'
|
||||||
RESOURCES_NAME = 'pools'
|
RESOURCES_NAME = 'pools'
|
||||||
|
|
||||||
|
|
||||||
class Pool(common_base.Resource):
|
class Pool(base.Resource):
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<Pool: %s>" % self.name
|
return "<Pool: %s>" % self.name
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
from manilaclient import exceptions
|
from manilaclient import exceptions
|
||||||
|
|
||||||
RESOURCES_PATH = '/security-services'
|
RESOURCES_PATH = '/security-services'
|
||||||
@ -23,7 +22,7 @@ RESOURCE_NAME = 'security_service'
|
|||||||
RESOURCES_NAME = 'security_services'
|
RESOURCES_NAME = 'security_services'
|
||||||
|
|
||||||
|
|
||||||
class SecurityService(common_base.Resource):
|
class SecurityService(base.Resource):
|
||||||
"""Security service for Manila shares."""
|
"""Security service for Manila shares."""
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<SecurityService: %s>" % self.id
|
return "<SecurityService: %s>" % self.id
|
||||||
@ -88,7 +87,7 @@ class SecurityServiceManager(base.ManagerWithFind):
|
|||||||
:rtype: :class:`SecurityService`
|
:rtype: :class:`SecurityService`
|
||||||
"""
|
"""
|
||||||
return self._get(
|
return self._get(
|
||||||
RESOURCE_PATH % common_base.getid(security_service),
|
RESOURCE_PATH % base.getid(security_service),
|
||||||
RESOURCE_NAME,
|
RESOURCE_NAME,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -138,7 +137,7 @@ class SecurityServiceManager(base.ManagerWithFind):
|
|||||||
body = {RESOURCE_NAME: values}
|
body = {RESOURCE_NAME: values}
|
||||||
|
|
||||||
return self._update(
|
return self._update(
|
||||||
RESOURCE_PATH % common_base.getid(security_service),
|
RESOURCE_PATH % base.getid(security_service),
|
||||||
body,
|
body,
|
||||||
RESOURCE_NAME,
|
RESOURCE_NAME,
|
||||||
)
|
)
|
||||||
@ -148,7 +147,7 @@ class SecurityServiceManager(base.ManagerWithFind):
|
|||||||
|
|
||||||
:param security_service: security service to be deleted.
|
:param security_service: security service to be deleted.
|
||||||
"""
|
"""
|
||||||
self._delete(RESOURCE_PATH % common_base.getid(security_service))
|
self._delete(RESOURCE_PATH % base.getid(security_service))
|
||||||
|
|
||||||
def list(self, detailed=True, search_opts=None):
|
def list(self, detailed=True, search_opts=None):
|
||||||
"""Get a list of all security services.
|
"""Get a list of all security services.
|
||||||
|
@ -15,14 +15,13 @@
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
|
|
||||||
RESOURCE_PATH_LEGACY = '/os-services'
|
RESOURCE_PATH_LEGACY = '/os-services'
|
||||||
RESOURCE_PATH = '/services'
|
RESOURCE_PATH = '/services'
|
||||||
RESOURCE_NAME = 'services'
|
RESOURCE_NAME = 'services'
|
||||||
|
|
||||||
|
|
||||||
class Service(common_base.Resource):
|
class Service(base.Resource):
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<Service: %s>" % self.id
|
return "<Service: %s>" % self.id
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
|
|
||||||
RESOURCE_PATH = '/share-access-rules/%s'
|
RESOURCE_PATH = '/share-access-rules/%s'
|
||||||
RESOURCE_NAME = 'access'
|
RESOURCE_NAME = 'access'
|
||||||
@ -29,7 +28,7 @@ RESOURCE_METADATA_PATH = '/share-access-rules/%s/metadata/%s'
|
|||||||
RESOURCE_LIST_PATH = '/share-access-rules'
|
RESOURCE_LIST_PATH = '/share-access-rules'
|
||||||
|
|
||||||
|
|
||||||
class ShareAccessRule(common_base.Resource):
|
class ShareAccessRule(base.Resource):
|
||||||
"""A Share Access Rule."""
|
"""A Share Access Rule."""
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
@ -53,7 +52,7 @@ class ShareAccessRuleManager(base.ManagerWithFind):
|
|||||||
with UUID
|
with UUID
|
||||||
:rtype: :class:`ShareAccessRule`
|
:rtype: :class:`ShareAccessRule`
|
||||||
"""
|
"""
|
||||||
share_access_rule_id = common_base.getid(share_access_rule)
|
share_access_rule_id = base.getid(share_access_rule)
|
||||||
url = RESOURCE_PATH % share_access_rule_id
|
url = RESOURCE_PATH % share_access_rule_id
|
||||||
return self._get(url, RESOURCE_NAME)
|
return self._get(url, RESOURCE_NAME)
|
||||||
|
|
||||||
@ -66,7 +65,7 @@ class ShareAccessRuleManager(base.ManagerWithFind):
|
|||||||
:param metadata: A list of keys to be set.
|
:param metadata: A list of keys to be set.
|
||||||
"""
|
"""
|
||||||
body = {'metadata': metadata}
|
body = {'metadata': metadata}
|
||||||
access_id = common_base.getid(access)
|
access_id = base.getid(access)
|
||||||
url = RESOURCES_METADATA_PATH % access_id
|
url = RESOURCES_METADATA_PATH % access_id
|
||||||
return self._update(url, body, "metadata")
|
return self._update(url, body, "metadata")
|
||||||
|
|
||||||
@ -78,13 +77,13 @@ class ShareAccessRuleManager(base.ManagerWithFind):
|
|||||||
:return: None if successful, else API response on failure
|
:return: None if successful, else API response on failure
|
||||||
"""
|
"""
|
||||||
for k in keys:
|
for k in keys:
|
||||||
url = RESOURCE_METADATA_PATH % (common_base.getid(access), k)
|
url = RESOURCE_METADATA_PATH % (base.getid(access), k)
|
||||||
self._delete(url)
|
self._delete(url)
|
||||||
|
|
||||||
@api_versions.wraps("2.45")
|
@api_versions.wraps("2.45")
|
||||||
def access_list(self, share, search_opts=None):
|
def access_list(self, share, search_opts=None):
|
||||||
search_opts = search_opts or {}
|
search_opts = search_opts or {}
|
||||||
search_opts['share_id'] = common_base.getid(share)
|
search_opts['share_id'] = base.getid(share)
|
||||||
query_string = self._build_query_string(search_opts)
|
query_string = self._build_query_string(search_opts)
|
||||||
url = RESOURCE_LIST_PATH + query_string
|
url = RESOURCE_LIST_PATH + query_string
|
||||||
return self._list(url, 'access_list')
|
return self._list(url, 'access_list')
|
||||||
|
@ -15,10 +15,9 @@
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
|
|
||||||
|
|
||||||
class ShareExportLocation(common_base.Resource):
|
class ShareExportLocation(base.Resource):
|
||||||
"""Resource class for a share export location."""
|
"""Resource class for a share export location."""
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
@ -35,15 +34,15 @@ class ShareExportLocationManager(base.ManagerWithFind):
|
|||||||
@api_versions.wraps("2.9")
|
@api_versions.wraps("2.9")
|
||||||
def list(self, share, search_opts=None):
|
def list(self, share, search_opts=None):
|
||||||
"""List all share export locations."""
|
"""List all share export locations."""
|
||||||
share_id = common_base.getid(share)
|
share_id = base.getid(share)
|
||||||
return self._list("/shares/%s/export_locations" % share_id,
|
return self._list("/shares/%s/export_locations" % share_id,
|
||||||
"export_locations")
|
"export_locations")
|
||||||
|
|
||||||
@api_versions.wraps("2.9")
|
@api_versions.wraps("2.9")
|
||||||
def get(self, share, export_location):
|
def get(self, share, export_location):
|
||||||
"""Get a share export location."""
|
"""Get a share export location."""
|
||||||
share_id = common_base.getid(share)
|
share_id = base.getid(share)
|
||||||
export_location_id = common_base.getid(export_location)
|
export_location_id = base.getid(export_location)
|
||||||
return self._get(
|
return self._get(
|
||||||
"/shares/%(share_id)s/export_locations/%(export_location_id)s" % {
|
"/shares/%(share_id)s/export_locations/%(export_location_id)s" % {
|
||||||
"share_id": share_id,
|
"share_id": share_id,
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
from manilaclient.common import constants
|
from manilaclient.common import constants
|
||||||
|
|
||||||
RESOURCES_PATH = '/share-group-snapshots'
|
RESOURCES_PATH = '/share-group-snapshots'
|
||||||
@ -27,7 +26,7 @@ RESOURCE_NAME = 'share_group_snapshot'
|
|||||||
SG_GRADUATION_VERSION = "2.55"
|
SG_GRADUATION_VERSION = "2.55"
|
||||||
|
|
||||||
|
|
||||||
class ShareGroupSnapshot(common_base.Resource):
|
class ShareGroupSnapshot(base.Resource):
|
||||||
"""A snapshot of a share group."""
|
"""A snapshot of a share group."""
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
@ -59,7 +58,7 @@ class ShareGroupSnapshotManager(base.ManagerWithFind):
|
|||||||
:param description: text - description of the group snapshot
|
:param description: text - description of the group snapshot
|
||||||
:rtype: :class:`ShareGroupSnapshot`
|
:rtype: :class:`ShareGroupSnapshot`
|
||||||
"""
|
"""
|
||||||
share_group_id = common_base.getid(share_group)
|
share_group_id = base.getid(share_group)
|
||||||
body = {'share_group_id': share_group_id}
|
body = {'share_group_id': share_group_id}
|
||||||
if name:
|
if name:
|
||||||
body['name'] = name
|
body['name'] = name
|
||||||
@ -87,7 +86,7 @@ class ShareGroupSnapshotManager(base.ManagerWithFind):
|
|||||||
with its UUID
|
with its UUID
|
||||||
:rtype: :class:`ShareGroupSnapshot`
|
:rtype: :class:`ShareGroupSnapshot`
|
||||||
"""
|
"""
|
||||||
share_group_snapshot_id = common_base.getid(share_group_snapshot)
|
share_group_snapshot_id = base.getid(share_group_snapshot)
|
||||||
url = RESOURCE_PATH % share_group_snapshot_id
|
url = RESOURCE_PATH % share_group_snapshot_id
|
||||||
return self._get(url, RESOURCE_NAME)
|
return self._get(url, RESOURCE_NAME)
|
||||||
|
|
||||||
@ -167,7 +166,7 @@ class ShareGroupSnapshotManager(base.ManagerWithFind):
|
|||||||
with its UUID
|
with its UUID
|
||||||
:rtype: :class:`ShareGroupSnapshot`
|
:rtype: :class:`ShareGroupSnapshot`
|
||||||
"""
|
"""
|
||||||
share_group_snapshot_id = common_base.getid(share_group_snapshot)
|
share_group_snapshot_id = base.getid(share_group_snapshot)
|
||||||
url = RESOURCE_PATH % share_group_snapshot_id
|
url = RESOURCE_PATH % share_group_snapshot_id
|
||||||
if not kwargs:
|
if not kwargs:
|
||||||
return self._get(url, RESOURCE_NAME)
|
return self._get(url, RESOURCE_NAME)
|
||||||
@ -193,7 +192,7 @@ class ShareGroupSnapshotManager(base.ManagerWithFind):
|
|||||||
with its UUID
|
with its UUID
|
||||||
:param force: True to force the deletion
|
:param force: True to force the deletion
|
||||||
"""
|
"""
|
||||||
share_group_snapshot_id = common_base.getid(share_group_snapshot)
|
share_group_snapshot_id = base.getid(share_group_snapshot)
|
||||||
if force:
|
if force:
|
||||||
url = RESOURCE_PATH_ACTION % share_group_snapshot_id
|
url = RESOURCE_PATH_ACTION % share_group_snapshot_id
|
||||||
body = {'force_delete': None}
|
body = {'force_delete': None}
|
||||||
@ -218,7 +217,7 @@ class ShareGroupSnapshotManager(base.ManagerWithFind):
|
|||||||
with its UUID
|
with its UUID
|
||||||
:param state: The new state for the share group snapshot
|
:param state: The new state for the share group snapshot
|
||||||
"""
|
"""
|
||||||
share_group_snapshot_id = common_base.getid(share_group_snapshot)
|
share_group_snapshot_id = base.getid(share_group_snapshot)
|
||||||
url = RESOURCE_PATH_ACTION % share_group_snapshot_id
|
url = RESOURCE_PATH_ACTION % share_group_snapshot_id
|
||||||
body = {'reset_status': {'status': state}}
|
body = {'reset_status': {'status': state}}
|
||||||
self.api.client.post(url, body=body)
|
self.api.client.post(url, body=body)
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
|
|
||||||
RESOURCES_PATH = '/share-group-types'
|
RESOURCES_PATH = '/share-group-types'
|
||||||
RESOURCE_PATH = '/share-group-types/%s/access'
|
RESOURCE_PATH = '/share-group-types/%s/access'
|
||||||
@ -24,7 +23,7 @@ RESOURCE_NAME = 'share_group_type_access'
|
|||||||
SG_GRADUATION_VERSION = "2.55"
|
SG_GRADUATION_VERSION = "2.55"
|
||||||
|
|
||||||
|
|
||||||
class ShareGroupTypeAccess(common_base.Resource):
|
class ShareGroupTypeAccess(base.Resource):
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<Share Group Type Access: %s>" % self.share_group_type_id
|
return "<Share Group Type Access: %s>" % self.share_group_type_id
|
||||||
|
|
||||||
@ -37,7 +36,7 @@ class ShareGroupTypeAccessManager(base.ManagerWithFind):
|
|||||||
search_opts=None):
|
search_opts=None):
|
||||||
if share_group_type.is_public:
|
if share_group_type.is_public:
|
||||||
return None
|
return None
|
||||||
share_group_type_id = common_base.getid(share_group_type)
|
share_group_type_id = base.getid(share_group_type)
|
||||||
url = RESOURCE_PATH % share_group_type_id
|
url = RESOURCE_PATH % share_group_type_id
|
||||||
return self._list(url, RESOURCE_NAME)
|
return self._list(url, RESOURCE_NAME)
|
||||||
|
|
||||||
@ -82,6 +81,6 @@ class ShareGroupTypeAccessManager(base.ManagerWithFind):
|
|||||||
"""Perform a share group type action."""
|
"""Perform a share group type action."""
|
||||||
body = {action: info}
|
body = {action: info}
|
||||||
self.run_hooks('modify_body_for_action', body, **kwargs)
|
self.run_hooks('modify_body_for_action', body, **kwargs)
|
||||||
share_group_type_id = common_base.getid(share_group_type)
|
share_group_type_id = base.getid(share_group_type)
|
||||||
url = RESOURCE_PATH_ACTION % share_group_type_id
|
url = RESOURCE_PATH_ACTION % share_group_type_id
|
||||||
return self.api.client.post(url, body=body)
|
return self.api.client.post(url, body=body)
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
|
|
||||||
RESOURCES_PATH = '/share-group-types'
|
RESOURCES_PATH = '/share-group-types'
|
||||||
RESOURCE_PATH = '/share-group-types/%s'
|
RESOURCE_PATH = '/share-group-types/%s'
|
||||||
@ -30,7 +29,7 @@ GROUP_SPECS_RESOURCES_NAME = 'group_specs'
|
|||||||
SG_GRADUATION_VERSION = "2.55"
|
SG_GRADUATION_VERSION = "2.55"
|
||||||
|
|
||||||
|
|
||||||
class ShareGroupType(common_base.Resource):
|
class ShareGroupType(base.Resource):
|
||||||
"""A Share Group Type is the type of share group to be created."""
|
"""A Share Group Type is the type of share group to be created."""
|
||||||
|
|
||||||
def __init__(self, manager, info, loaded=False):
|
def __init__(self, manager, info, loaded=False):
|
||||||
@ -56,7 +55,7 @@ class ShareGroupType(common_base.Resource):
|
|||||||
if prefer_resource_data:
|
if prefer_resource_data:
|
||||||
return self._group_specs
|
return self._group_specs
|
||||||
else:
|
else:
|
||||||
share_group_type_id = common_base.getid(self)
|
share_group_type_id = base.getid(self)
|
||||||
url = GROUP_SPECS_RESOURCES_PATH % share_group_type_id
|
url = GROUP_SPECS_RESOURCES_PATH % share_group_type_id
|
||||||
_resp, body = self.manager.api.client.get(url)
|
_resp, body = self.manager.api.client.get(url)
|
||||||
self._group_specs = body.get(GROUP_SPECS_RESOURCES_NAME, {})
|
self._group_specs = body.get(GROUP_SPECS_RESOURCES_NAME, {})
|
||||||
@ -68,7 +67,7 @@ class ShareGroupType(common_base.Resource):
|
|||||||
:param extra_specs: A dict of key/value pairs to be set on this object
|
:param extra_specs: A dict of key/value pairs to be set on this object
|
||||||
:return: dict with group specs
|
:return: dict with group specs
|
||||||
"""
|
"""
|
||||||
share_group_type_id = common_base.getid(self)
|
share_group_type_id = base.getid(self)
|
||||||
url = GROUP_SPECS_RESOURCES_PATH % share_group_type_id
|
url = GROUP_SPECS_RESOURCES_PATH % share_group_type_id
|
||||||
body = {GROUP_SPECS_RESOURCES_NAME: group_specs}
|
body = {GROUP_SPECS_RESOURCES_NAME: group_specs}
|
||||||
return self.manager._create(
|
return self.manager._create(
|
||||||
@ -80,7 +79,7 @@ class ShareGroupType(common_base.Resource):
|
|||||||
:param keys: A list of keys on this object to be unset
|
:param keys: A list of keys on this object to be unset
|
||||||
:return: None if successful, else API response on failure
|
:return: None if successful, else API response on failure
|
||||||
"""
|
"""
|
||||||
share_group_type_id = common_base.getid(self)
|
share_group_type_id = base.getid(self)
|
||||||
for k in keys:
|
for k in keys:
|
||||||
url = GROUP_SPECS_RESOURCE_PATH % (share_group_type_id, k)
|
url = GROUP_SPECS_RESOURCE_PATH % (share_group_type_id, k)
|
||||||
resp = self.manager._delete(url)
|
resp = self.manager._delete(url)
|
||||||
@ -110,7 +109,7 @@ class ShareGroupTypeManager(base.ManagerWithFind):
|
|||||||
'name': name,
|
'name': name,
|
||||||
'is_public': is_public,
|
'is_public': is_public,
|
||||||
'group_specs': group_specs or {},
|
'group_specs': group_specs or {},
|
||||||
'share_types': [common_base.getid(share_type)
|
'share_types': [base.getid(share_type)
|
||||||
for share_type in share_types],
|
for share_type in share_types],
|
||||||
}
|
}
|
||||||
return self._create(
|
return self._create(
|
||||||
@ -134,7 +133,7 @@ class ShareGroupTypeManager(base.ManagerWithFind):
|
|||||||
with UUID, or 'default'
|
with UUID, or 'default'
|
||||||
:rtype: :class:`ShareGroupType`
|
:rtype: :class:`ShareGroupType`
|
||||||
"""
|
"""
|
||||||
share_group_type_id = common_base.getid(share_group_type)
|
share_group_type_id = base.getid(share_group_type)
|
||||||
url = RESOURCE_PATH % share_group_type_id
|
url = RESOURCE_PATH % share_group_type_id
|
||||||
return self._get(url, RESOURCE_NAME)
|
return self._get(url, RESOURCE_NAME)
|
||||||
|
|
||||||
@ -174,7 +173,7 @@ class ShareGroupTypeManager(base.ManagerWithFind):
|
|||||||
:param share_group_type: either instance of ShareGroupType, or text
|
:param share_group_type: either instance of ShareGroupType, or text
|
||||||
with UUID
|
with UUID
|
||||||
"""
|
"""
|
||||||
share_group_type_id = common_base.getid(share_group_type)
|
share_group_type_id = base.getid(share_group_type)
|
||||||
url = RESOURCE_PATH % share_group_type_id
|
url = RESOURCE_PATH % share_group_type_id
|
||||||
self._delete(url)
|
self._delete(url)
|
||||||
|
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
from manilaclient.common import constants
|
from manilaclient.common import constants
|
||||||
|
|
||||||
RESOURCES_PATH = '/share-groups'
|
RESOURCES_PATH = '/share-groups'
|
||||||
@ -28,7 +27,7 @@ RESOURCE_NAME = 'share_group'
|
|||||||
SG_GRADUATION_VERSION = "2.55"
|
SG_GRADUATION_VERSION = "2.55"
|
||||||
|
|
||||||
|
|
||||||
class ShareGroup(common_base.Resource):
|
class ShareGroup(base.Resource):
|
||||||
"""A share group is a logical grouping of shares on a single backend."""
|
"""A share group is a logical grouping of shares on a single backend."""
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
@ -88,15 +87,15 @@ class ShareGroupManager(base.ManagerWithFind):
|
|||||||
if availability_zone:
|
if availability_zone:
|
||||||
body['availability_zone'] = availability_zone
|
body['availability_zone'] = availability_zone
|
||||||
if share_group_type:
|
if share_group_type:
|
||||||
body['share_group_type_id'] = common_base.getid(share_group_type)
|
body['share_group_type_id'] = base.getid(share_group_type)
|
||||||
if share_network:
|
if share_network:
|
||||||
body['share_network_id'] = common_base.getid(share_network)
|
body['share_network_id'] = base.getid(share_network)
|
||||||
|
|
||||||
if source_share_group_snapshot:
|
if source_share_group_snapshot:
|
||||||
body['source_share_group_snapshot_id'] = common_base.getid(
|
body['source_share_group_snapshot_id'] = base.getid(
|
||||||
source_share_group_snapshot)
|
source_share_group_snapshot)
|
||||||
elif share_types:
|
elif share_types:
|
||||||
body['share_types'] = [common_base.getid(share_type)
|
body['share_types'] = [base.getid(share_type)
|
||||||
for share_type in share_types]
|
for share_type in share_types]
|
||||||
|
|
||||||
return self._create(
|
return self._create(
|
||||||
@ -129,7 +128,7 @@ class ShareGroupManager(base.ManagerWithFind):
|
|||||||
:param share_group: either ShareGroup object or text with its UUID
|
:param share_group: either ShareGroup object or text with its UUID
|
||||||
:rtype: :class:`ShareGroup`
|
:rtype: :class:`ShareGroup`
|
||||||
"""
|
"""
|
||||||
share_group_id = common_base.getid(share_group)
|
share_group_id = base.getid(share_group)
|
||||||
url = RESOURCE_PATH % share_group_id
|
url = RESOURCE_PATH % share_group_id
|
||||||
return self._get(url, RESOURCE_NAME)
|
return self._get(url, RESOURCE_NAME)
|
||||||
|
|
||||||
@ -217,7 +216,7 @@ class ShareGroupManager(base.ManagerWithFind):
|
|||||||
:param share_group: either ShareGroup object or text with its UUID
|
:param share_group: either ShareGroup object or text with its UUID
|
||||||
:rtype: :class:`ShareGroup`
|
:rtype: :class:`ShareGroup`
|
||||||
"""
|
"""
|
||||||
share_group_id = common_base.getid(share_group)
|
share_group_id = base.getid(share_group)
|
||||||
url = RESOURCE_PATH % share_group_id
|
url = RESOURCE_PATH % share_group_id
|
||||||
if not kwargs:
|
if not kwargs:
|
||||||
return self._get(url, RESOURCE_NAME)
|
return self._get(url, RESOURCE_NAME)
|
||||||
@ -239,7 +238,7 @@ class ShareGroupManager(base.ManagerWithFind):
|
|||||||
:param share_group: either ShareGroup object or text with its UUID
|
:param share_group: either ShareGroup object or text with its UUID
|
||||||
:param force: True to force the deletion
|
:param force: True to force the deletion
|
||||||
"""
|
"""
|
||||||
share_group_id = common_base.getid(share_group)
|
share_group_id = base.getid(share_group)
|
||||||
if force:
|
if force:
|
||||||
url = RESOURCE_PATH_ACTION % share_group_id
|
url = RESOURCE_PATH_ACTION % share_group_id
|
||||||
body = {'force_delete': None}
|
body = {'force_delete': None}
|
||||||
@ -264,7 +263,7 @@ class ShareGroupManager(base.ManagerWithFind):
|
|||||||
:param state: The new state for the share group
|
:param state: The new state for the share group
|
||||||
"""
|
"""
|
||||||
|
|
||||||
share_group_id = common_base.getid(share_group)
|
share_group_id = base.getid(share_group)
|
||||||
url = RESOURCE_PATH_ACTION % share_group_id
|
url = RESOURCE_PATH_ACTION % share_group_id
|
||||||
body = {'reset_status': {'status': state}}
|
body = {'reset_status': {'status': state}}
|
||||||
self.api.client.post(url, body=body)
|
self.api.client.post(url, body=body)
|
||||||
|
@ -15,10 +15,9 @@
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
|
|
||||||
|
|
||||||
class ShareInstanceExportLocation(common_base.Resource):
|
class ShareInstanceExportLocation(base.Resource):
|
||||||
"""Resource class for a share export location."""
|
"""Resource class for a share export location."""
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
@ -35,7 +34,7 @@ class ShareInstanceExportLocationManager(base.ManagerWithFind):
|
|||||||
@api_versions.wraps("2.9")
|
@api_versions.wraps("2.9")
|
||||||
def list(self, share_instance, search_opts=None):
|
def list(self, share_instance, search_opts=None):
|
||||||
"""List all share export locations."""
|
"""List all share export locations."""
|
||||||
share_instance_id = common_base.getid(share_instance)
|
share_instance_id = base.getid(share_instance)
|
||||||
return self._list(
|
return self._list(
|
||||||
"/share_instances/%s/export_locations" % share_instance_id,
|
"/share_instances/%s/export_locations" % share_instance_id,
|
||||||
"export_locations")
|
"export_locations")
|
||||||
@ -43,8 +42,8 @@ class ShareInstanceExportLocationManager(base.ManagerWithFind):
|
|||||||
@api_versions.wraps("2.9")
|
@api_versions.wraps("2.9")
|
||||||
def get(self, share_instance, export_location):
|
def get(self, share_instance, export_location):
|
||||||
"""Get a share export location."""
|
"""Get a share export location."""
|
||||||
share_instance_id = common_base.getid(share_instance)
|
share_instance_id = base.getid(share_instance)
|
||||||
export_location_id = common_base.getid(export_location)
|
export_location_id = base.getid(export_location)
|
||||||
return self._get(
|
return self._get(
|
||||||
("/share_instances/%(share_instance_id)s/export_locations/"
|
("/share_instances/%(share_instance_id)s/export_locations/"
|
||||||
"%(export_location_id)s") % {
|
"%(export_location_id)s") % {
|
||||||
|
@ -17,10 +17,9 @@ from oslo_utils import uuidutils
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
|
|
||||||
|
|
||||||
class ShareInstance(common_base.Resource):
|
class ShareInstance(base.Resource):
|
||||||
"""A share is an extra block level storage to the OpenStack instances."""
|
"""A share is an extra block level storage to the OpenStack instances."""
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<Share: %s>" % self.id
|
return "<Share: %s>" % self.id
|
||||||
@ -45,7 +44,7 @@ class ShareInstanceManager(base.ManagerWithFind):
|
|||||||
:param instance: either share object or text with its ID.
|
:param instance: either share object or text with its ID.
|
||||||
:rtype: :class:`ShareInstance`
|
:rtype: :class:`ShareInstance`
|
||||||
"""
|
"""
|
||||||
share_id = common_base.getid(instance)
|
share_id = base.getid(instance)
|
||||||
return self._get("/share_instances/%s" % share_id, "share_instance")
|
return self._get("/share_instances/%s" % share_id, "share_instance")
|
||||||
|
|
||||||
@api_versions.wraps("2.3", "2.34")
|
@api_versions.wraps("2.3", "2.34")
|
||||||
@ -79,7 +78,7 @@ class ShareInstanceManager(base.ManagerWithFind):
|
|||||||
"""
|
"""
|
||||||
body = {action: info}
|
body = {action: info}
|
||||||
self.run_hooks('modify_body_for_action', body, **kwargs)
|
self.run_hooks('modify_body_for_action', body, **kwargs)
|
||||||
url = '/share_instances/%s/action' % common_base.getid(instance)
|
url = '/share_instances/%s/action' % base.getid(instance)
|
||||||
return self.api.client.post(url, body=body)
|
return self.api.client.post(url, body=body)
|
||||||
|
|
||||||
def _do_force_delete(self, instance, action_name="force_delete"):
|
def _do_force_delete(self, instance, action_name="force_delete"):
|
||||||
@ -87,7 +86,7 @@ class ShareInstanceManager(base.ManagerWithFind):
|
|||||||
|
|
||||||
:param instance: either share instance object or text with its ID.
|
:param instance: either share instance object or text with its ID.
|
||||||
"""
|
"""
|
||||||
return self._action(action_name, common_base.getid(instance))
|
return self._action(action_name, base.getid(instance))
|
||||||
|
|
||||||
@api_versions.wraps("2.3", "2.6")
|
@api_versions.wraps("2.3", "2.6")
|
||||||
def force_delete(self, instance):
|
def force_delete(self, instance):
|
||||||
|
@ -14,14 +14,13 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
|
|
||||||
RESOURCES_PATH = '/share-networks/%(share_network_id)s/subnets'
|
RESOURCES_PATH = '/share-networks/%(share_network_id)s/subnets'
|
||||||
RESOURCE_PATH = RESOURCES_PATH + '/%(share_network_subnet_id)s'
|
RESOURCE_PATH = RESOURCES_PATH + '/%(share_network_subnet_id)s'
|
||||||
RESOURCE_NAME = 'share_network_subnet'
|
RESOURCE_NAME = 'share_network_subnet'
|
||||||
|
|
||||||
|
|
||||||
class ShareNetworkSubnet(common_base.Resource):
|
class ShareNetworkSubnet(base.Resource):
|
||||||
"""Network subnet info for Manila share networks."""
|
"""Network subnet info for Manila share networks."""
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<ShareNetworkSubnet: %s>" % self.id
|
return "<ShareNetworkSubnet: %s>" % self.id
|
||||||
@ -69,8 +68,8 @@ class ShareNetworkSubnetManager(base.ManagerWithFind):
|
|||||||
:param policy: share network subnet to get.
|
:param policy: share network subnet to get.
|
||||||
:rtype: :class:`NetworkSubnetInfo`
|
:rtype: :class:`NetworkSubnetInfo`
|
||||||
"""
|
"""
|
||||||
share_network_id = common_base.getid(share_network)
|
share_network_id = base.getid(share_network)
|
||||||
share_network_subnet_id = common_base.getid(share_network_subnet)
|
share_network_subnet_id = base.getid(share_network_subnet)
|
||||||
url = ('/share-networks/%(share_network_id)s/subnets'
|
url = ('/share-networks/%(share_network_id)s/subnets'
|
||||||
'/%(share_network_subnet)s') % {
|
'/%(share_network_subnet)s') % {
|
||||||
'share_network_id': share_network_id,
|
'share_network_id': share_network_id,
|
||||||
@ -86,7 +85,7 @@ class ShareNetworkSubnetManager(base.ManagerWithFind):
|
|||||||
"""
|
"""
|
||||||
url = ('/share-networks/%(share_network_id)s/subnets'
|
url = ('/share-networks/%(share_network_id)s/subnets'
|
||||||
'/%(share_network_subnet)s') % {
|
'/%(share_network_subnet)s') % {
|
||||||
'share_network_id': common_base.getid(share_network),
|
'share_network_id': base.getid(share_network),
|
||||||
'share_network_subnet': share_network_subnet
|
'share_network_subnet': share_network_subnet
|
||||||
}
|
}
|
||||||
self._delete(url)
|
self._delete(url)
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
from manilaclient import exceptions
|
from manilaclient import exceptions
|
||||||
|
|
||||||
RESOURCES_PATH = '/share-networks'
|
RESOURCES_PATH = '/share-networks'
|
||||||
@ -25,7 +24,7 @@ RESOURCES_NAME = 'share_networks'
|
|||||||
ACTION_PATH = RESOURCE_PATH + '/action'
|
ACTION_PATH = RESOURCE_PATH + '/action'
|
||||||
|
|
||||||
|
|
||||||
class ShareNetwork(common_base.Resource):
|
class ShareNetwork(base.Resource):
|
||||||
"""Network info for Manila shares."""
|
"""Network info for Manila shares."""
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<ShareNetwork: %s>" % self.id
|
return "<ShareNetwork: %s>" % self.id
|
||||||
@ -125,11 +124,11 @@ class ShareNetworkManager(base.ManagerWithFind):
|
|||||||
"""
|
"""
|
||||||
body = {
|
body = {
|
||||||
'remove_security_service': {
|
'remove_security_service': {
|
||||||
'security_service_id': common_base.getid(security_service),
|
'security_service_id': base.getid(security_service),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
return self._create(
|
return self._create(
|
||||||
RESOURCE_PATH % common_base.getid(share_network) + '/action',
|
RESOURCE_PATH % base.getid(share_network) + '/action',
|
||||||
body,
|
body,
|
||||||
RESOURCE_NAME,
|
RESOURCE_NAME,
|
||||||
)
|
)
|
||||||
@ -140,7 +139,7 @@ class ShareNetworkManager(base.ManagerWithFind):
|
|||||||
:param policy: share network to get.
|
:param policy: share network to get.
|
||||||
:rtype: :class:`NetworkInfo`
|
:rtype: :class:`NetworkInfo`
|
||||||
"""
|
"""
|
||||||
return self._get(RESOURCE_PATH % common_base.getid(share_network),
|
return self._get(RESOURCE_PATH % base.getid(share_network),
|
||||||
RESOURCE_NAME)
|
RESOURCE_NAME)
|
||||||
|
|
||||||
@api_versions.wraps("1.0", "2.25")
|
@api_versions.wraps("1.0", "2.25")
|
||||||
@ -173,7 +172,7 @@ class ShareNetworkManager(base.ManagerWithFind):
|
|||||||
raise exceptions.CommandError(msg)
|
raise exceptions.CommandError(msg)
|
||||||
|
|
||||||
body = {RESOURCE_NAME: values}
|
body = {RESOURCE_NAME: values}
|
||||||
return self._update(RESOURCE_PATH % common_base.getid(share_network),
|
return self._update(RESOURCE_PATH % base.getid(share_network),
|
||||||
body,
|
body,
|
||||||
RESOURCE_NAME)
|
RESOURCE_NAME)
|
||||||
|
|
||||||
@ -205,7 +204,7 @@ class ShareNetworkManager(base.ManagerWithFind):
|
|||||||
raise exceptions.CommandError(msg)
|
raise exceptions.CommandError(msg)
|
||||||
|
|
||||||
body = {RESOURCE_NAME: values}
|
body = {RESOURCE_NAME: values}
|
||||||
return self._update(RESOURCE_PATH % common_base.getid(share_network),
|
return self._update(RESOURCE_PATH % base.getid(share_network),
|
||||||
body,
|
body,
|
||||||
RESOURCE_NAME)
|
RESOURCE_NAME)
|
||||||
|
|
||||||
@ -214,7 +213,7 @@ class ShareNetworkManager(base.ManagerWithFind):
|
|||||||
|
|
||||||
:param share_network: share network to be deleted.
|
:param share_network: share network to be deleted.
|
||||||
"""
|
"""
|
||||||
self._delete(RESOURCE_PATH % common_base.getid(share_network))
|
self._delete(RESOURCE_PATH % base.getid(share_network))
|
||||||
|
|
||||||
def list(self, detailed=True, search_opts=None):
|
def list(self, detailed=True, search_opts=None):
|
||||||
"""Get a list of all share network.
|
"""Get a list of all share network.
|
||||||
@ -239,7 +238,7 @@ class ShareNetworkManager(base.ManagerWithFind):
|
|||||||
"""
|
"""
|
||||||
body = {action: info}
|
body = {action: info}
|
||||||
self.run_hooks('modify_body_for_action', body)
|
self.run_hooks('modify_body_for_action', body)
|
||||||
url = ACTION_PATH % common_base.getid(share_network)
|
url = ACTION_PATH % base.getid(share_network)
|
||||||
return self.api.client.post(url, body=body)
|
return self.api.client.post(url, body=body)
|
||||||
|
|
||||||
def add_security_service(self, share_network, security_service):
|
def add_security_service(self, share_network, security_service):
|
||||||
@ -250,7 +249,7 @@ class ShareNetworkManager(base.ManagerWithFind):
|
|||||||
:rtype: :class:`ShareNetwork`
|
:rtype: :class:`ShareNetwork`
|
||||||
"""
|
"""
|
||||||
info = {
|
info = {
|
||||||
'security_service_id': common_base.getid(security_service),
|
'security_service_id': base.getid(security_service),
|
||||||
}
|
}
|
||||||
return self._action('add_security_service', share_network, info)
|
return self._action('add_security_service', share_network, info)
|
||||||
|
|
||||||
@ -265,7 +264,7 @@ class ShareNetworkManager(base.ManagerWithFind):
|
|||||||
:rtype: :class:`ShareNetwork`
|
:rtype: :class:`ShareNetwork`
|
||||||
"""
|
"""
|
||||||
info = {
|
info = {
|
||||||
'security_service_id': common_base.getid(security_service),
|
'security_service_id': base.getid(security_service),
|
||||||
'reset_operation': reset_operation,
|
'reset_operation': reset_operation,
|
||||||
}
|
}
|
||||||
return self._action('add_security_service_check', share_network, info)
|
return self._action('add_security_service_check', share_network, info)
|
||||||
@ -284,8 +283,8 @@ class ShareNetworkManager(base.ManagerWithFind):
|
|||||||
:rtype: :class:`ShareNetwork`
|
:rtype: :class:`ShareNetwork`
|
||||||
"""
|
"""
|
||||||
info = {
|
info = {
|
||||||
'current_service_id': common_base.getid(current_security_service),
|
'current_service_id': base.getid(current_security_service),
|
||||||
'new_service_id': common_base.getid(new_security_service)}
|
'new_service_id': base.getid(new_security_service)}
|
||||||
|
|
||||||
return self._action('update_security_service', share_network, info)
|
return self._action('update_security_service', share_network, info)
|
||||||
|
|
||||||
@ -304,8 +303,8 @@ class ShareNetworkManager(base.ManagerWithFind):
|
|||||||
:rtype: :class:`ShareNetwork`
|
:rtype: :class:`ShareNetwork`
|
||||||
"""
|
"""
|
||||||
info = {
|
info = {
|
||||||
'current_service_id': common_base.getid(current_security_service),
|
'current_service_id': base.getid(current_security_service),
|
||||||
'new_service_id': common_base.getid(new_security_service),
|
'new_service_id': base.getid(new_security_service),
|
||||||
'reset_operation': reset_operation
|
'reset_operation': reset_operation
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,11 +14,10 @@
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
from manilaclient.common import constants
|
from manilaclient.common import constants
|
||||||
|
|
||||||
|
|
||||||
class ShareReplicaExportLocation(common_base.Resource):
|
class ShareReplicaExportLocation(base.Resource):
|
||||||
"""Resource class for a share replica export location."""
|
"""Resource class for a share replica export location."""
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
@ -36,7 +35,7 @@ class ShareReplicaExportLocationManager(base.ManagerWithFind):
|
|||||||
@api_versions.experimental_api
|
@api_versions.experimental_api
|
||||||
def list(self, share_replica, search_opts=None):
|
def list(self, share_replica, search_opts=None):
|
||||||
"""List all share replica export locations."""
|
"""List all share replica export locations."""
|
||||||
share_replica_id = common_base.getid(share_replica)
|
share_replica_id = base.getid(share_replica)
|
||||||
return self._list(
|
return self._list(
|
||||||
"/share-replicas/%s/export-locations" % share_replica_id,
|
"/share-replicas/%s/export-locations" % share_replica_id,
|
||||||
"export_locations")
|
"export_locations")
|
||||||
@ -44,7 +43,7 @@ class ShareReplicaExportLocationManager(base.ManagerWithFind):
|
|||||||
@api_versions.wraps(constants.REPLICA_GRADUATION_VERSION) # noqa
|
@api_versions.wraps(constants.REPLICA_GRADUATION_VERSION) # noqa
|
||||||
def list(self, share_replica, search_opts=None): # noqa F811
|
def list(self, share_replica, search_opts=None): # noqa F811
|
||||||
"""List all share replica export locations."""
|
"""List all share replica export locations."""
|
||||||
share_replica_id = common_base.getid(share_replica)
|
share_replica_id = base.getid(share_replica)
|
||||||
return self._list(
|
return self._list(
|
||||||
"/share-replicas/%s/export-locations" % share_replica_id,
|
"/share-replicas/%s/export-locations" % share_replica_id,
|
||||||
"export_locations")
|
"export_locations")
|
||||||
@ -62,8 +61,8 @@ class ShareReplicaExportLocationManager(base.ManagerWithFind):
|
|||||||
|
|
||||||
def _get_replica_export_location(self, share_replica, export_location):
|
def _get_replica_export_location(self, share_replica, export_location):
|
||||||
"""Get a share replica export location."""
|
"""Get a share replica export location."""
|
||||||
share_replica_id = common_base.getid(share_replica)
|
share_replica_id = base.getid(share_replica)
|
||||||
export_location_id = common_base.getid(export_location)
|
export_location_id = base.getid(export_location)
|
||||||
return self._get(
|
return self._get(
|
||||||
("/share-replicas/%(share_replica_id)s/export-locations/"
|
("/share-replicas/%(share_replica_id)s/export-locations/"
|
||||||
"%(export_location_id)s") % {
|
"%(export_location_id)s") % {
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
from manilaclient.common import constants
|
from manilaclient.common import constants
|
||||||
|
|
||||||
RESOURCES_PATH = '/share-replicas'
|
RESOURCES_PATH = '/share-replicas'
|
||||||
@ -25,7 +24,7 @@ RESOURCES_NAME = 'share_replicas'
|
|||||||
RESOURCE_NAME = 'share_replica'
|
RESOURCE_NAME = 'share_replica'
|
||||||
|
|
||||||
|
|
||||||
class ShareReplica(common_base.Resource):
|
class ShareReplica(base.Resource):
|
||||||
"""A replica is 'mirror' instance of a share at some point in time."""
|
"""A replica is 'mirror' instance of a share at some point in time."""
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<Share Replica: %s>" % self.id
|
return "<Share Replica: %s>" % self.id
|
||||||
@ -66,7 +65,7 @@ class ShareReplicaManager(base.ManagerWithFind):
|
|||||||
:param replica: either replica object or its UUID.
|
:param replica: either replica object or its UUID.
|
||||||
:rtype: :class:`ShareReplica`
|
:rtype: :class:`ShareReplica`
|
||||||
"""
|
"""
|
||||||
replica_id = common_base.getid(replica)
|
replica_id = base.getid(replica)
|
||||||
return self._get(RESOURCE_PATH % replica_id, RESOURCE_NAME)
|
return self._get(RESOURCE_PATH % replica_id, RESOURCE_NAME)
|
||||||
|
|
||||||
@api_versions.wraps("2.11", constants.REPLICA_PRE_GRADUATION_VERSION)
|
@api_versions.wraps("2.11", constants.REPLICA_PRE_GRADUATION_VERSION)
|
||||||
@ -87,7 +86,7 @@ class ShareReplicaManager(base.ManagerWithFind):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
if share:
|
if share:
|
||||||
share_id = '?share_id=' + common_base.getid(share)
|
share_id = '?share_id=' + base.getid(share)
|
||||||
url = RESOURCES_PATH + '/detail' + share_id
|
url = RESOURCES_PATH + '/detail' + share_id
|
||||||
return self._list(url, RESOURCES_NAME)
|
return self._list(url, RESOURCES_NAME)
|
||||||
else:
|
else:
|
||||||
@ -129,11 +128,11 @@ class ShareReplicaManager(base.ManagerWithFind):
|
|||||||
:param availability_zone: The 'availability_zone' object or its UUID.
|
:param availability_zone: The 'availability_zone' object or its UUID.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
share_id = common_base.getid(share)
|
share_id = base.getid(share)
|
||||||
body = {'share_id': share_id}
|
body = {'share_id': share_id}
|
||||||
|
|
||||||
if availability_zone:
|
if availability_zone:
|
||||||
body['availability_zone'] = common_base.getid(availability_zone)
|
body['availability_zone'] = base.getid(availability_zone)
|
||||||
|
|
||||||
return self._create(RESOURCES_PATH,
|
return self._create(RESOURCES_PATH,
|
||||||
{RESOURCE_NAME: body},
|
{RESOURCE_NAME: body},
|
||||||
@ -223,7 +222,7 @@ class ShareReplicaManager(base.ManagerWithFind):
|
|||||||
"""
|
"""
|
||||||
body = {action: info}
|
body = {action: info}
|
||||||
self.run_hooks('modify_body_for_action', body, **kwargs)
|
self.run_hooks('modify_body_for_action', body, **kwargs)
|
||||||
replica_id = common_base.getid(replica)
|
replica_id = base.getid(replica)
|
||||||
url = RESOURCE_PATH_ACTION % replica_id
|
url = RESOURCE_PATH_ACTION % replica_id
|
||||||
return self.api.client.post(url, body=body)
|
return self.api.client.post(url, body=body)
|
||||||
|
|
||||||
@ -232,7 +231,7 @@ class ShareReplicaManager(base.ManagerWithFind):
|
|||||||
|
|
||||||
:param replica: either share replica object or its UUID.
|
:param replica: either share replica object or its UUID.
|
||||||
"""
|
"""
|
||||||
replica_id = common_base.getid(replica)
|
replica_id = base.getid(replica)
|
||||||
url = RESOURCE_PATH % replica_id
|
url = RESOURCE_PATH % replica_id
|
||||||
|
|
||||||
if force:
|
if force:
|
||||||
@ -245,7 +244,7 @@ class ShareReplicaManager(base.ManagerWithFind):
|
|||||||
|
|
||||||
:param replica: either share replica object or its UUID.
|
:param replica: either share replica object or its UUID.
|
||||||
"""
|
"""
|
||||||
return self._action(action_name, common_base.getid(replica))
|
return self._action(action_name, base.getid(replica))
|
||||||
|
|
||||||
def _do_reset_state(self, replica, state, action_name):
|
def _do_reset_state(self, replica, state, action_name):
|
||||||
"""Update the provided share replica with the provided state.
|
"""Update the provided share replica with the provided state.
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
|
|
||||||
RESOURCES_NAME = 'share_servers'
|
RESOURCES_NAME = 'share_servers'
|
||||||
RESOURCES_PATH = '/share-servers'
|
RESOURCES_PATH = '/share-servers'
|
||||||
@ -24,7 +23,7 @@ RESOURCE_NAME = 'share_server'
|
|||||||
ACTION_PATH = RESOURCE_PATH + '/action'
|
ACTION_PATH = RESOURCE_PATH + '/action'
|
||||||
|
|
||||||
|
|
||||||
class ShareServer(common_base.Resource):
|
class ShareServer(base.Resource):
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<ShareServer: %s>" % self.id
|
return "<ShareServer: %s>" % self.id
|
||||||
@ -87,7 +86,7 @@ class ShareServerManager(base.ManagerWithFind):
|
|||||||
:param server: ID of the :class:`ShareServer` to get.
|
:param server: ID of the :class:`ShareServer` to get.
|
||||||
:rtype: :class:`ShareServer`
|
:rtype: :class:`ShareServer`
|
||||||
"""
|
"""
|
||||||
server_id = common_base.getid(server)
|
server_id = base.getid(server)
|
||||||
server = self._get("%s/%s" % (RESOURCES_PATH, server_id),
|
server = self._get("%s/%s" % (RESOURCES_PATH, server_id),
|
||||||
RESOURCE_NAME)
|
RESOURCE_NAME)
|
||||||
# Split big dict 'backend_details' to separated strings
|
# Split big dict 'backend_details' to separated strings
|
||||||
@ -107,7 +106,7 @@ class ShareServerManager(base.ManagerWithFind):
|
|||||||
:param server: ID of the :class:`ShareServer` to get details from.
|
:param server: ID of the :class:`ShareServer` to get details from.
|
||||||
:rtype: list of :class:`ShareServerBackendDetails
|
:rtype: list of :class:`ShareServerBackendDetails
|
||||||
"""
|
"""
|
||||||
server_id = common_base.getid(server)
|
server_id = base.getid(server)
|
||||||
return self._get("%s/%s/details" % (RESOURCES_PATH, server_id),
|
return self._get("%s/%s/details" % (RESOURCES_PATH, server_id),
|
||||||
"details")
|
"details")
|
||||||
|
|
||||||
@ -116,7 +115,7 @@ class ShareServerManager(base.ManagerWithFind):
|
|||||||
|
|
||||||
:param server: ID of the :class:`ShareServer` to delete.
|
:param server: ID of the :class:`ShareServer` to delete.
|
||||||
"""
|
"""
|
||||||
server_id = common_base.getid(server)
|
server_id = base.getid(server)
|
||||||
self._delete(RESOURCE_PATH % server_id)
|
self._delete(RESOURCE_PATH % server_id)
|
||||||
|
|
||||||
def list(self, search_opts=None):
|
def list(self, search_opts=None):
|
||||||
@ -181,7 +180,7 @@ class ShareServerManager(base.ManagerWithFind):
|
|||||||
"""
|
"""
|
||||||
body = {action: info}
|
body = {action: info}
|
||||||
self.run_hooks('modify_body_for_action', body)
|
self.run_hooks('modify_body_for_action', body)
|
||||||
url = ACTION_PATH % common_base.getid(share_server)
|
url = ACTION_PATH % base.getid(share_server)
|
||||||
return self.api.client.post(url, body=body)
|
return self.api.client.post(url, body=body)
|
||||||
|
|
||||||
@api_versions.wraps("2.57")
|
@api_versions.wraps("2.57")
|
||||||
|
@ -15,10 +15,9 @@
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
|
|
||||||
|
|
||||||
class ShareSnapshotExportLocation(common_base.Resource):
|
class ShareSnapshotExportLocation(base.Resource):
|
||||||
"""Represent an export location snapshot of a snapshot."""
|
"""Represent an export location snapshot of a snapshot."""
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
@ -35,14 +34,14 @@ class ShareSnapshotExportLocationManager(base.ManagerWithFind):
|
|||||||
@api_versions.wraps("2.32")
|
@api_versions.wraps("2.32")
|
||||||
def list(self, snapshot=None, search_opts=None):
|
def list(self, snapshot=None, search_opts=None):
|
||||||
return self._list("/snapshots/%s/export-locations" %
|
return self._list("/snapshots/%s/export-locations" %
|
||||||
common_base.getid(snapshot),
|
base.getid(snapshot),
|
||||||
'share_snapshot_export_locations')
|
'share_snapshot_export_locations')
|
||||||
|
|
||||||
@api_versions.wraps("2.32")
|
@api_versions.wraps("2.32")
|
||||||
def get(self, export_location, snapshot=None):
|
def get(self, export_location, snapshot=None):
|
||||||
params = {
|
params = {
|
||||||
"snapshot_id": common_base.getid(snapshot),
|
"snapshot_id": base.getid(snapshot),
|
||||||
"export_location_id": common_base.getid(export_location),
|
"export_location_id": base.getid(export_location),
|
||||||
}
|
}
|
||||||
|
|
||||||
return self._get("/snapshots/%(snapshot_id)s/export-locations/"
|
return self._get("/snapshots/%(snapshot_id)s/export-locations/"
|
||||||
|
@ -15,10 +15,9 @@
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
|
|
||||||
|
|
||||||
class ShareSnapshotInstanceExportLocation(common_base.Resource):
|
class ShareSnapshotInstanceExportLocation(base.Resource):
|
||||||
"""Represent an export location from a snapshot instance."""
|
"""Represent an export location from a snapshot instance."""
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
@ -35,14 +34,14 @@ class ShareSnapshotInstanceExportLocationManager(base.ManagerWithFind):
|
|||||||
@api_versions.wraps("2.32")
|
@api_versions.wraps("2.32")
|
||||||
def list(self, snapshot_instance=None, search_opts=None):
|
def list(self, snapshot_instance=None, search_opts=None):
|
||||||
return self._list("/snapshot-instances/%s/export-locations" %
|
return self._list("/snapshot-instances/%s/export-locations" %
|
||||||
common_base.getid(snapshot_instance),
|
base.getid(snapshot_instance),
|
||||||
'share_snapshot_export_locations')
|
'share_snapshot_export_locations')
|
||||||
|
|
||||||
@api_versions.wraps("2.32")
|
@api_versions.wraps("2.32")
|
||||||
def get(self, export_location, snapshot_instance=None):
|
def get(self, export_location, snapshot_instance=None):
|
||||||
params = {
|
params = {
|
||||||
"snapshot_instance_id": common_base.getid(snapshot_instance),
|
"snapshot_instance_id": base.getid(snapshot_instance),
|
||||||
"export_location_id": common_base.getid(export_location),
|
"export_location_id": base.getid(export_location),
|
||||||
}
|
}
|
||||||
|
|
||||||
return self._get("/snapshot-instances/%(snapshot_instance_id)s/"
|
return self._get("/snapshot-instances/%(snapshot_instance_id)s/"
|
||||||
|
@ -15,10 +15,9 @@
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
|
|
||||||
|
|
||||||
class ShareSnapshotInstance(common_base.Resource):
|
class ShareSnapshotInstance(base.Resource):
|
||||||
"""A snapshot instance is an instance of a snapshot."""
|
"""A snapshot instance is an instance of a snapshot."""
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
@ -40,7 +39,7 @@ class ShareSnapshotInstanceManager(base.ManagerWithFind):
|
|||||||
:param instance: either snapshot instance object or text with its ID.
|
:param instance: either snapshot instance object or text with its ID.
|
||||||
:rtype: :class:`ShareSnapshotInstance`
|
:rtype: :class:`ShareSnapshotInstance`
|
||||||
"""
|
"""
|
||||||
snapshot_instance_id = common_base.getid(instance)
|
snapshot_instance_id = base.getid(instance)
|
||||||
return self._get("/snapshot-instances/%s" % snapshot_instance_id,
|
return self._get("/snapshot-instances/%s" % snapshot_instance_id,
|
||||||
"snapshot_instance")
|
"snapshot_instance")
|
||||||
|
|
||||||
@ -53,7 +52,7 @@ class ShareSnapshotInstanceManager(base.ManagerWithFind):
|
|||||||
url = '/snapshot-instances'
|
url = '/snapshot-instances'
|
||||||
|
|
||||||
if snapshot:
|
if snapshot:
|
||||||
url += '?snapshot_id=%s' % common_base.getid(snapshot)
|
url += '?snapshot_id=%s' % base.getid(snapshot)
|
||||||
return self._list(url, 'snapshot_instances')
|
return self._list(url, 'snapshot_instances')
|
||||||
|
|
||||||
@api_versions.wraps("2.19")
|
@api_versions.wraps("2.19")
|
||||||
@ -70,5 +69,5 @@ class ShareSnapshotInstanceManager(base.ManagerWithFind):
|
|||||||
body = {action: info}
|
body = {action: info}
|
||||||
self.run_hooks('modify_body_for_action', body, **kwargs)
|
self.run_hooks('modify_body_for_action', body, **kwargs)
|
||||||
url = ('/snapshot-instances/%s/action' %
|
url = ('/snapshot-instances/%s/action' %
|
||||||
common_base.getid(instance))
|
base.getid(instance))
|
||||||
return self.api.client.post(url, body=body)
|
return self.api.client.post(url, body=body)
|
||||||
|
@ -16,11 +16,10 @@
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
from manilaclient.common import constants
|
from manilaclient.common import constants
|
||||||
|
|
||||||
|
|
||||||
class ShareSnapshot(common_base.Resource):
|
class ShareSnapshot(base.Resource):
|
||||||
"""Represent a snapshot of a share."""
|
"""Represent a snapshot of a share."""
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
@ -72,7 +71,7 @@ class ShareSnapshotManager(base.ManagerWithFind):
|
|||||||
:param description: Description of the snapshot
|
:param description: Description of the snapshot
|
||||||
:rtype: :class:`ShareSnapshot`
|
:rtype: :class:`ShareSnapshot`
|
||||||
"""
|
"""
|
||||||
body = {'snapshot': {'share_id': common_base.getid(share),
|
body = {'snapshot': {'share_id': base.getid(share),
|
||||||
'force': force,
|
'force': force,
|
||||||
'name': name,
|
'name': name,
|
||||||
'description': description}}
|
'description': description}}
|
||||||
@ -93,7 +92,7 @@ class ShareSnapshotManager(base.ManagerWithFind):
|
|||||||
"""
|
"""
|
||||||
driver_options = driver_options if driver_options else {}
|
driver_options = driver_options if driver_options else {}
|
||||||
body = {
|
body = {
|
||||||
'share_id': common_base.getid(share),
|
'share_id': base.getid(share),
|
||||||
'provider_location': provider_location,
|
'provider_location': provider_location,
|
||||||
'driver_options': driver_options,
|
'driver_options': driver_options,
|
||||||
'name': name,
|
'name': name,
|
||||||
@ -117,7 +116,7 @@ class ShareSnapshotManager(base.ManagerWithFind):
|
|||||||
of snapshot to delete.
|
of snapshot to delete.
|
||||||
:rtype: :class:`ShareSnapshot`
|
:rtype: :class:`ShareSnapshot`
|
||||||
"""
|
"""
|
||||||
snapshot_id = common_base.getid(snapshot)
|
snapshot_id = base.getid(snapshot)
|
||||||
return self._get('/snapshots/%s' % snapshot_id, 'snapshot')
|
return self._get('/snapshots/%s' % snapshot_id, 'snapshot')
|
||||||
|
|
||||||
def list(self, detailed=True, search_opts=None, sort_key=None,
|
def list(self, detailed=True, search_opts=None, sort_key=None,
|
||||||
@ -161,11 +160,11 @@ class ShareSnapshotManager(base.ManagerWithFind):
|
|||||||
|
|
||||||
:param snapshot: The :class:`ShareSnapshot` to delete.
|
:param snapshot: The :class:`ShareSnapshot` to delete.
|
||||||
"""
|
"""
|
||||||
self._delete("/snapshots/%s" % common_base.getid(snapshot))
|
self._delete("/snapshots/%s" % base.getid(snapshot))
|
||||||
|
|
||||||
def _do_force_delete(self, snapshot, action_name="force_delete"):
|
def _do_force_delete(self, snapshot, action_name="force_delete"):
|
||||||
"""Delete the specified snapshot ignoring its current state."""
|
"""Delete the specified snapshot ignoring its current state."""
|
||||||
return self._action(action_name, common_base.getid(snapshot))
|
return self._action(action_name, base.getid(snapshot))
|
||||||
|
|
||||||
@api_versions.wraps("1.0", "2.6")
|
@api_versions.wraps("1.0", "2.6")
|
||||||
def force_delete(self, snapshot):
|
def force_delete(self, snapshot):
|
||||||
@ -186,7 +185,7 @@ class ShareSnapshotManager(base.ManagerWithFind):
|
|||||||
return
|
return
|
||||||
|
|
||||||
body = {'snapshot': kwargs, }
|
body = {'snapshot': kwargs, }
|
||||||
snapshot_id = common_base.getid(snapshot)
|
snapshot_id = base.getid(snapshot)
|
||||||
return self._update("/snapshots/%s" % snapshot_id, body)
|
return self._update("/snapshots/%s" % snapshot_id, body)
|
||||||
|
|
||||||
def _do_reset_state(self, snapshot, state, action_name="reset_status"):
|
def _do_reset_state(self, snapshot, state, action_name="reset_status"):
|
||||||
@ -222,7 +221,7 @@ class ShareSnapshotManager(base.ManagerWithFind):
|
|||||||
return self._do_deny(snapshot, id)
|
return self._do_deny(snapshot, id)
|
||||||
|
|
||||||
def _do_access_list(self, snapshot):
|
def _do_access_list(self, snapshot):
|
||||||
snapshot_id = common_base.getid(snapshot)
|
snapshot_id = base.getid(snapshot)
|
||||||
access_list = self._list("/snapshots/%s/access-list" % snapshot_id,
|
access_list = self._list("/snapshots/%s/access-list" % snapshot_id,
|
||||||
'snapshot_access_list')
|
'snapshot_access_list')
|
||||||
return access_list
|
return access_list
|
||||||
@ -235,5 +234,5 @@ class ShareSnapshotManager(base.ManagerWithFind):
|
|||||||
"""Perform a snapshot 'action'."""
|
"""Perform a snapshot 'action'."""
|
||||||
body = {action: info}
|
body = {action: info}
|
||||||
self.run_hooks('modify_body_for_action', body, **kwargs)
|
self.run_hooks('modify_body_for_action', body, **kwargs)
|
||||||
url = '/snapshots/%s/action' % common_base.getid(snapshot)
|
url = '/snapshots/%s/action' % base.getid(snapshot)
|
||||||
return self.api.client.post(url, body=body)
|
return self.api.client.post(url, body=body)
|
||||||
|
@ -16,10 +16,9 @@
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
|
|
||||||
|
|
||||||
class ShareTypeAccess(common_base.Resource):
|
class ShareTypeAccess(base.Resource):
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<ShareTypeAccess: %s>" % self.id
|
return "<ShareTypeAccess: %s>" % self.id
|
||||||
|
|
||||||
@ -35,7 +34,7 @@ class ShareTypeAccessManager(base.ManagerWithFind):
|
|||||||
|
|
||||||
return self._list(
|
return self._list(
|
||||||
"/types/%(st_id)s/%(action_name)s" % {
|
"/types/%(st_id)s/%(action_name)s" % {
|
||||||
"st_id": common_base.getid(share_type),
|
"st_id": base.getid(share_type),
|
||||||
"action_name": action_name},
|
"action_name": action_name},
|
||||||
"share_type_access")
|
"share_type_access")
|
||||||
|
|
||||||
@ -61,5 +60,5 @@ class ShareTypeAccessManager(base.ManagerWithFind):
|
|||||||
"""Perform a share type action."""
|
"""Perform a share type action."""
|
||||||
body = {action: info}
|
body = {action: info}
|
||||||
self.run_hooks('modify_body_for_action', body, **kwargs)
|
self.run_hooks('modify_body_for_action', body, **kwargs)
|
||||||
url = '/types/%s/action' % common_base.getid(share_type)
|
url = '/types/%s/action' % base.getid(share_type)
|
||||||
return self.api.client.post(url, body=body)
|
return self.api.client.post(url, body=body)
|
||||||
|
@ -20,11 +20,10 @@ Share Type interface.
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
from manilaclient import exceptions
|
from manilaclient import exceptions
|
||||||
|
|
||||||
|
|
||||||
class ShareType(common_base.Resource):
|
class ShareType(base.Resource):
|
||||||
"""A Share Type is the type of share to be created."""
|
"""A Share Type is the type of share to be created."""
|
||||||
|
|
||||||
def __init__(self, manager, info, loaded=False):
|
def __init__(self, manager, info, loaded=False):
|
||||||
@ -57,7 +56,7 @@ class ShareType(common_base.Resource):
|
|||||||
return extra_specs
|
return extra_specs
|
||||||
|
|
||||||
_resp, body = self.manager.api.client.get(
|
_resp, body = self.manager.api.client.get(
|
||||||
"/types/%s/extra_specs" % common_base.getid(self))
|
"/types/%s/extra_specs" % base.getid(self))
|
||||||
|
|
||||||
self.extra_specs = body["extra_specs"]
|
self.extra_specs = body["extra_specs"]
|
||||||
|
|
||||||
@ -77,7 +76,7 @@ class ShareType(common_base.Resource):
|
|||||||
"""
|
"""
|
||||||
body = {'extra_specs': metadata}
|
body = {'extra_specs': metadata}
|
||||||
return self.manager._create(
|
return self.manager._create(
|
||||||
"/types/%s/extra_specs" % common_base.getid(self),
|
"/types/%s/extra_specs" % base.getid(self),
|
||||||
body,
|
body,
|
||||||
"extra_specs",
|
"extra_specs",
|
||||||
return_raw=True,
|
return_raw=True,
|
||||||
@ -97,7 +96,7 @@ class ShareType(common_base.Resource):
|
|||||||
resp = None
|
resp = None
|
||||||
for k in keys:
|
for k in keys:
|
||||||
resp = self.manager._delete(
|
resp = self.manager._delete(
|
||||||
"/types/%s/extra_specs/%s" % (common_base.getid(self), k))
|
"/types/%s/extra_specs/%s" % (base.getid(self), k))
|
||||||
if resp is not None:
|
if resp is not None:
|
||||||
return resp
|
return resp
|
||||||
|
|
||||||
@ -128,7 +127,7 @@ class ShareTypeManager(base.ManagerWithFind):
|
|||||||
:param share: either share object or text with its ID.
|
:param share: either share object or text with its ID.
|
||||||
:rtype: :class:`Share`
|
:rtype: :class:`Share`
|
||||||
"""
|
"""
|
||||||
type_id = common_base.getid(share_type)
|
type_id = base.getid(share_type)
|
||||||
return self._get("/types/%s" % type_id, "share_type")
|
return self._get("/types/%s" % type_id, "share_type")
|
||||||
|
|
||||||
def get(self, share_type="default"):
|
def get(self, share_type="default"):
|
||||||
@ -137,7 +136,7 @@ class ShareTypeManager(base.ManagerWithFind):
|
|||||||
:param share_type: The ID of the :class:`ShareType` to get.
|
:param share_type: The ID of the :class:`ShareType` to get.
|
||||||
:rtype: :class:`ShareType`
|
:rtype: :class:`ShareType`
|
||||||
"""
|
"""
|
||||||
return self._get("/types/%s" % common_base.getid(share_type),
|
return self._get("/types/%s" % base.getid(share_type),
|
||||||
"share_type")
|
"share_type")
|
||||||
|
|
||||||
def delete(self, share_type):
|
def delete(self, share_type):
|
||||||
@ -145,7 +144,7 @@ class ShareTypeManager(base.ManagerWithFind):
|
|||||||
|
|
||||||
:param share_type: The name or ID of the :class:`ShareType` to get.
|
:param share_type: The name or ID of the :class:`ShareType` to get.
|
||||||
"""
|
"""
|
||||||
self._delete("/types/%s" % common_base.getid(share_type))
|
self._delete("/types/%s" % base.getid(share_type))
|
||||||
|
|
||||||
def _do_create(self, name, extra_specs, is_public,
|
def _do_create(self, name, extra_specs, is_public,
|
||||||
is_public_keyname="share_type_access:is_public",
|
is_public_keyname="share_type_access:is_public",
|
||||||
@ -189,7 +188,7 @@ class ShareTypeManager(base.ManagerWithFind):
|
|||||||
body["share_type"][is_public_keyname] = is_public
|
body["share_type"][is_public_keyname] = is_public
|
||||||
if description or description == "":
|
if description or description == "":
|
||||||
body["share_type"]["description"] = description
|
body["share_type"]["description"] = description
|
||||||
return self._update("/types/%s" % common_base.getid(share_type),
|
return self._update("/types/%s" % base.getid(share_type),
|
||||||
body, "share_type")
|
body, "share_type")
|
||||||
|
|
||||||
@api_versions.wraps("1.0", "2.6")
|
@api_versions.wraps("1.0", "2.6")
|
||||||
|
@ -22,13 +22,12 @@ import string
|
|||||||
|
|
||||||
from manilaclient import api_versions
|
from manilaclient import api_versions
|
||||||
from manilaclient import base
|
from manilaclient import base
|
||||||
from manilaclient.common.apiclient import base as common_base
|
|
||||||
from manilaclient.common import constants
|
from manilaclient.common import constants
|
||||||
from manilaclient import exceptions
|
from manilaclient import exceptions
|
||||||
from manilaclient.v2 import share_instances
|
from manilaclient.v2 import share_instances
|
||||||
|
|
||||||
|
|
||||||
class Share(common_base.Resource):
|
class Share(base.Resource):
|
||||||
"""A share is an extra block level storage to the OpenStack instances."""
|
"""A share is an extra block level storage to the OpenStack instances."""
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<Share: %s>" % self.id
|
return "<Share: %s>" % self.id
|
||||||
@ -150,8 +149,8 @@ class ShareManager(base.ManagerWithFind):
|
|||||||
'description': description,
|
'description': description,
|
||||||
'metadata': share_metadata,
|
'metadata': share_metadata,
|
||||||
'share_proto': share_proto,
|
'share_proto': share_proto,
|
||||||
'share_network_id': common_base.getid(share_network),
|
'share_network_id': base.getid(share_network),
|
||||||
'share_type': common_base.getid(share_type),
|
'share_type': base.getid(share_type),
|
||||||
'is_public': is_public,
|
'is_public': is_public,
|
||||||
'availability_zone': availability_zone,
|
'availability_zone': availability_zone,
|
||||||
'scheduler_hints': scheduler_hints,
|
'scheduler_hints': scheduler_hints,
|
||||||
@ -291,7 +290,7 @@ class ShareManager(base.ManagerWithFind):
|
|||||||
:param share: either share object or text with its ID.
|
:param share: either share object or text with its ID.
|
||||||
"""
|
"""
|
||||||
return self.api.client.post(
|
return self.api.client.post(
|
||||||
"/os-share-unmanage/%s/unmanage" % common_base.getid(share))
|
"/os-share-unmanage/%s/unmanage" % base.getid(share))
|
||||||
|
|
||||||
@api_versions.wraps("2.7") # noqa
|
@api_versions.wraps("2.7") # noqa
|
||||||
def unmanage(self, share): # noqa
|
def unmanage(self, share): # noqa
|
||||||
@ -310,7 +309,7 @@ class ShareManager(base.ManagerWithFind):
|
|||||||
:param snapshot: either snapshot object or text with its ID.
|
:param snapshot: either snapshot object or text with its ID.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
snapshot_id = common_base.getid(snapshot)
|
snapshot_id = base.getid(snapshot)
|
||||||
info = {'snapshot_id': snapshot_id}
|
info = {'snapshot_id': snapshot_id}
|
||||||
return self._action('revert', share, info=info)
|
return self._action('revert', share, info=info)
|
||||||
|
|
||||||
@ -320,7 +319,7 @@ class ShareManager(base.ManagerWithFind):
|
|||||||
:param share: either share object or text with its ID.
|
:param share: either share object or text with its ID.
|
||||||
:rtype: :class:`Share`
|
:rtype: :class:`Share`
|
||||||
"""
|
"""
|
||||||
share_id = common_base.getid(share)
|
share_id = base.getid(share)
|
||||||
return self._get("/shares/%s" % share_id, "share")
|
return self._get("/shares/%s" % share_id, "share")
|
||||||
|
|
||||||
def update(self, share, **kwargs):
|
def update(self, share, **kwargs):
|
||||||
@ -333,7 +332,7 @@ class ShareManager(base.ManagerWithFind):
|
|||||||
return
|
return
|
||||||
|
|
||||||
body = {'share': kwargs, }
|
body = {'share': kwargs, }
|
||||||
share_id = common_base.getid(share)
|
share_id = base.getid(share)
|
||||||
return self._update("/shares/%s" % share_id, body)
|
return self._update("/shares/%s" % share_id, body)
|
||||||
|
|
||||||
@api_versions.wraps("1.0", "2.34")
|
@api_versions.wraps("1.0", "2.34")
|
||||||
@ -432,7 +431,7 @@ class ShareManager(base.ManagerWithFind):
|
|||||||
:param share_group_id: text - ID of the share group to which the share
|
:param share_group_id: text - ID of the share group to which the share
|
||||||
belongs
|
belongs
|
||||||
"""
|
"""
|
||||||
url = "/shares/%s" % common_base.getid(share)
|
url = "/shares/%s" % base.getid(share)
|
||||||
if share_group_id:
|
if share_group_id:
|
||||||
url += "?share_group_id=%s" % share_group_id
|
url += "?share_group_id=%s" % share_group_id
|
||||||
self._delete(url)
|
self._delete(url)
|
||||||
@ -631,7 +630,7 @@ class ShareManager(base.ManagerWithFind):
|
|||||||
|
|
||||||
:param share: either share object or text with its ID.
|
:param share: either share object or text with its ID.
|
||||||
"""
|
"""
|
||||||
return self._get("/shares/%s/metadata" % common_base.getid(share),
|
return self._get("/shares/%s/metadata" % base.getid(share),
|
||||||
"metadata")
|
"metadata")
|
||||||
|
|
||||||
def set_metadata(self, share, metadata):
|
def set_metadata(self, share, metadata):
|
||||||
@ -641,7 +640,7 @@ class ShareManager(base.ManagerWithFind):
|
|||||||
:param metadata: A list of keys to be set.
|
:param metadata: A list of keys to be set.
|
||||||
"""
|
"""
|
||||||
body = {'metadata': metadata}
|
body = {'metadata': metadata}
|
||||||
return self._create("/shares/%s/metadata" % common_base.getid(share),
|
return self._create("/shares/%s/metadata" % base.getid(share),
|
||||||
body, "metadata")
|
body, "metadata")
|
||||||
|
|
||||||
def delete_metadata(self, share, keys):
|
def delete_metadata(self, share, keys):
|
||||||
@ -650,7 +649,7 @@ class ShareManager(base.ManagerWithFind):
|
|||||||
:param share: either share object or text with its ID.
|
:param share: either share object or text with its ID.
|
||||||
:param keys: A list of keys to be removed.
|
:param keys: A list of keys to be removed.
|
||||||
"""
|
"""
|
||||||
share_id = common_base.getid(share)
|
share_id = base.getid(share)
|
||||||
for key in keys:
|
for key in keys:
|
||||||
self._delete("/shares/%(share_id)s/metadata/%(key)s" % {
|
self._delete("/shares/%(share_id)s/metadata/%(key)s" % {
|
||||||
'share_id': share_id, 'key': key})
|
'share_id': share_id, 'key': key})
|
||||||
@ -662,7 +661,7 @@ class ShareManager(base.ManagerWithFind):
|
|||||||
:param metadata: A list of keys to be updated.
|
:param metadata: A list of keys to be updated.
|
||||||
"""
|
"""
|
||||||
body = {'metadata': metadata}
|
body = {'metadata': metadata}
|
||||||
return self._update("/shares/%s/metadata" % common_base.getid(share),
|
return self._update("/shares/%s/metadata" % base.getid(share),
|
||||||
body)
|
body)
|
||||||
|
|
||||||
def _action(self, action, share, info=None, **kwargs):
|
def _action(self, action, share, info=None, **kwargs):
|
||||||
@ -675,7 +674,7 @@ class ShareManager(base.ManagerWithFind):
|
|||||||
"""
|
"""
|
||||||
body = {action: info}
|
body = {action: info}
|
||||||
self.run_hooks('modify_body_for_action', body, **kwargs)
|
self.run_hooks('modify_body_for_action', body, **kwargs)
|
||||||
url = '/shares/%s/action' % common_base.getid(share)
|
url = '/shares/%s/action' % base.getid(share)
|
||||||
return self.api.client.post(url, body=body)
|
return self.api.client.post(url, body=body)
|
||||||
|
|
||||||
def _do_reset_state(self, share, state, action_name):
|
def _do_reset_state(self, share, state, action_name):
|
||||||
@ -742,7 +741,7 @@ class ShareManager(base.ManagerWithFind):
|
|||||||
:param share: either share object or text with its ID.
|
:param share: either share object or text with its ID.
|
||||||
"""
|
"""
|
||||||
return self._list(
|
return self._list(
|
||||||
'/shares/%s/instances' % common_base.getid(share),
|
'/shares/%s/instances' % base.getid(share),
|
||||||
'share_instances',
|
'share_instances',
|
||||||
obj_class=share_instances.ShareInstance
|
obj_class=share_instances.ShareInstance
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user