Skip to content

Commit

Permalink
Merge "Add Consistency Groups API"
Browse files Browse the repository at this point in the history
  • Loading branch information
Jenkins authored and openstack-gerrit committed Sep 7, 2015
2 parents 4b4b739 + 680fd50 commit fa8faad
Show file tree
Hide file tree
Showing 31 changed files with 3,757 additions and 24 deletions.
17 changes: 16 additions & 1 deletion etc/manila/policy.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@
"share_extension:snapshot_admin_actions:reset_status": "rule:admin_api",
"share_extension:share_instance_admin_actions:force_delete": "rule:admin_api",
"share_extension:share_instance_admin_actions:reset_status": "rule:admin_api",
"share_extension:consistency_group_admin_actions:force_delete": "rule:admin_api",
"share_extension:consistency_group_admin_actions:reset_status": "rule:admin_api",
"share_extension:cgsnapshot_admin_actions:force_delete": "rule:admin_api",
"share_extension:cgsnapshot_admin_actions:reset_status": "rule:admin_api",

"share_extension:services": "rule:admin_api",
"share_extension:availability_zones": "",
Expand Down Expand Up @@ -78,5 +82,16 @@
"share_network:get_all_share_networks": "rule:admin_api",

"scheduler_stats:pools:index": "rule:admin_api",
"scheduler_stats:pools:detail": "rule:admin_api"
"scheduler_stats:pools:detail": "rule:admin_api",

"consistency_group:create" : "rule:default",
"consistency_group:delete": "rule:default",
"consistency_group:update": "rule:default",
"consistency_group:get": "rule:default",
"consistency_group:get_all": "rule:default",

"consistency_group:create_cgsnapshot" : "rule:default",
"consistency_group:delete_cgsnapshot": "rule:default",
"consistency_group:get_cgsnapshot": "rule:default",
"consistency_group:get_all_cgsnapshots": "rule:default"
}
40 changes: 40 additions & 0 deletions manila/api/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
from six.moves.urllib import parse
import webob

from manila.api.openstack import api_version_request as api_version
from manila.api.openstack import versioned_method
from manila.i18n import _

api_common_opts = [
Expand Down Expand Up @@ -201,6 +203,7 @@ class ViewBuilder(object):
"""Model API responses as dictionaries."""

_collection_name = None
_detail_version_modifiers = []

def _get_links(self, request, identifier):
return [{"rel": "self",
Expand Down Expand Up @@ -262,6 +265,43 @@ def _update_link_prefix(self, orig_url, prefix):
url_parts[0:2] = prefix_parts[0:2]
return parse.urlunsplit(url_parts)

def update_versioned_resource_dict(self, request, resource_dict, resource):
"""Updates teh given resource dict for the given request version.
This method calls every method, that is applicable to the request
version, in _detail_version_modifiers.
"""
for method_name in self._detail_version_modifiers:
method = getattr(self, method_name)
if request.api_version_request.matches_versioned_method(method):
method.func(self, resource_dict, resource)

@classmethod
def versioned_method(cls, min_ver, max_ver=None, experimental=False):
"""Decorator for versioning API methods.
:param min_ver: string representing minimum version
:param max_ver: optional string representing maximum version
:param experimental: flag indicating an API is experimental and is
subject to change or removal at any time
"""

def decorator(f):
obj_min_ver = api_version.APIVersionRequest(min_ver)
if max_ver:
obj_max_ver = api_version.APIVersionRequest(max_ver)
else:
obj_max_ver = api_version.APIVersionRequest()

# Add to list of versioned methods registered
func_name = f.__name__
new_func = versioned_method.VersionedMethod(
func_name, obj_min_ver, obj_max_ver, experimental, f)

return new_func

return decorator


def remove_invalid_options(context, search_options, allowed_search_options):
"""Remove search options that are not valid for non-admin API/context."""
Expand Down
74 changes: 69 additions & 5 deletions manila/api/contrib/admin_actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
from manila.api import extensions
from manila.api.openstack import wsgi
from manila.common import constants
import manila.consistency_group.api as cg_api
from manila import db
from manila import exception
from manila import share
Expand All @@ -42,8 +43,9 @@ class AdminController(wsgi.Controller):

def __init__(self, *args, **kwargs):
super(AdminController, self).__init__(*args, **kwargs)
self.resource_name = self.collection.rstrip('s')
self.resource_name = self.collection.rstrip('s').replace('-', '_')
self.share_api = share.API()
self.cg_api = cg_api.API()

def _update(self, *args, **kwargs):
raise NotImplementedError()
Expand Down Expand Up @@ -143,18 +145,80 @@ def _delete(self, *args, **kwargs):
return self.share_api.delete_snapshot(*args, **kwargs)


class CGAdminController(AdminController):
"""AdminController for Consistency Groups."""

collection = 'consistency-groups'

def __init__(self, *args, **kwargs):
super(CGAdminController, self).__init__(*args, **kwargs)
self.cg_api = cg_api.API()

def _update(self, *args, **kwargs):
db.consistency_group_update(*args, **kwargs)

def _get(self, *args, **kwargs):
return self.cg_api.get(*args, **kwargs)

def _delete(self, context, resource, force=True):
db.consistency_group_destroy(context.elevated(), resource['id'])

@wsgi.action('os-reset_status')
@wsgi.response(202)
@wsgi.Controller.api_version('1.5', experimental=True)
def cg_reset_status(self, req, id, body):
super(CGAdminController, self)._reset_status(req, id, body)

@wsgi.action('os-force_delete')
@wsgi.response(202)
@wsgi.Controller.api_version('1.5', experimental=True)
def cg_force_delete(self, req, id, body):
super(CGAdminController, self)._force_delete(req, id, body)


class CGSnapshotAdminController(AdminController):
"""AdminController for CGSnapshots."""

collection = 'cgsnapshots'

def __init__(self, *args, **kwargs):
super(CGSnapshotAdminController, self).__init__(*args, **kwargs)
self.cg_api = cg_api.API()

def _update(self, *args, **kwargs):
db.cgsnapshot_update(*args, **kwargs)

def _get(self, *args, **kwargs):
return self.cg_api.get_cgsnapshot(*args, **kwargs)

def _delete(self, context, resource, force=True):
db.cgsnapshot_destroy(context.elevated(), resource['id'])

@wsgi.action('os-reset_status')
@wsgi.response(202)
@wsgi.Controller.api_version('1.5', experimental=True)
def cgsnapshot_reset_status(self, req, id, body):
super(CGSnapshotAdminController, self)._reset_status(req, id, body)

@wsgi.action('os-force_delete')
@wsgi.response(202)
@wsgi.Controller.api_version('1.5', experimental=True)
def cgsnapshot_force_delete(self, req, id, body):
super(CGSnapshotAdminController, self)._force_delete(req, id, body)


class Admin_actions(extensions.ExtensionDescriptor):
"""Enable admin actions."""

name = "AdminActions"
alias = "os-admin-actions"
updated = "2015-08-03T00:00:00+00:00"
updated = "2015-09-01T00:00:00+00:00"

def get_controller_extensions(self):
exts = []
controllers = (ShareAdminController, SnapshotAdminController,
ShareInstancesAdminController)
for class_ in controllers:
for class_ in (ShareAdminController, SnapshotAdminController,
ShareInstancesAdminController,
CGAdminController, CGSnapshotAdminController):
controller = class_()
extension = extensions.ControllerExtension(
self, class_.collection, controller)
Expand Down
7 changes: 4 additions & 3 deletions manila/api/openstack/api_version_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,15 @@
* 1.2 - Share create() doesn't ignore availability_zone field of share.
* 1.3 - Snapshots become optional feature.
* 1.4 - Share instances admin API
* 1.5 - Consistency Group support
"""

# The minimum and maximum versions of the API supported
# The default api version request is defined to be the
# the minimum version of the API supported.
_MIN_API_VERSION = "1.0"
_MAX_API_VERSION = "1.4"
_MAX_API_VERSION = "1.5"
DEFAULT_API_VERSION = _MIN_API_VERSION


Expand All @@ -79,11 +80,11 @@ class APIVersionRequest(utils.ComparableMixin):
API microversions.
"""

def __init__(self, version_string=None):
def __init__(self, version_string=None, experimental=False):
"""Create an API version request object."""
self._ver_major = None
self._ver_minor = None
self._experimental = False
self._experimental = experimental

if version_string is not None:
match = re.match(r"^([1-9]\d*)\.([1-9]\d*|0)$",
Expand Down
6 changes: 6 additions & 0 deletions manila/api/openstack/rest_api_version_history.rst
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,9 @@ user documentation.
1.4
---
Share instances admin API and update of Admin Actions extension.

1.5
---
Consistency groups support. /consistency-groups and /cgsnapshots are
implemented. AdminActions 'os-force_delete and' 'os-reset_status' have been
updated for both new resources.
2 changes: 1 addition & 1 deletion manila/api/openstack/versioned_method.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,4 @@ def __str__(self):

def _cmpkey(self):
"""Return the value used by ComparableMixin for rich comparisons."""
return self.start_version
return self.start_version

0 comments on commit fa8faad

Please sign in to comment.