diff --git a/etc/manila/policy.json b/etc/manila/policy.json index 7ac91b53ee..834fb58182 100644 --- a/etc/manila/policy.json +++ b/etc/manila/policy.json @@ -28,6 +28,8 @@ "share:delete_share_metadata": "rule:default", "share:update_share_metadata": "rule:default", "share:migrate": "rule:admin_api", + "share:manage": "rule:admin_api", + "share:unmanage": "rule:admin_api", "share_type:index": "rule:default", "share_type:show": "rule:default", @@ -62,9 +64,6 @@ "share_extension:share_type_access:addProjectAccess": "rule:admin_api", "share_extension:share_type_access:removeProjectAccess": "rule:admin_api", - "share_extension:manage": "rule:admin_api", - "share_extension:unmanage": "rule:admin_api", - "security_service:create": "rule:default", "security_service:delete": "rule:default", "security_service:update": "rule:default", diff --git a/manila/api/v1/router.py b/manila/api/v1/router.py index 3712f430e5..f74f814c60 100644 --- a/manila/api/v1/router.py +++ b/manila/api/v1/router.py @@ -30,11 +30,13 @@ from manila.api.v1 import limits from manila.api.v1 import scheduler_stats from manila.api.v1 import security_service from manila.api.v1 import share_instances +from manila.api.v1 import share_manage from manila.api.v1 import share_metadata from manila.api.v1 import share_networks from manila.api.v1 import share_servers from manila.api.v1 import share_snapshots from manila.api.v1 import share_types +from manila.api.v1 import share_unmanage from manila.api.v1 import shares from manila.api import versions @@ -65,6 +67,21 @@ class APIRouter(manila.api.openstack.APIRouter): "os-availability-zone", controller=self.resources["availability_zones"]) + self.resources["share_manage"] = share_manage.create_resource() + mapper.resource("share_manage", + # TODO(vponomaryov): remove it when it is ported + # to shares controller. + "os-share-manage", + controller=self.resources["share_manage"]) + + self.resources["share_unmanage"] = share_unmanage.create_resource() + mapper.resource("share_unmanage", + # TODO(vponomaryov): remove it when it is ported + # to shares controller. + "os-share-unmanage", + controller=self.resources["share_unmanage"], + member={'unmanage': 'POST'}) + self.resources['shares'] = shares.create_resource() mapper.resource("share", "shares", controller=self.resources['shares'], diff --git a/manila/api/contrib/share_manage.py b/manila/api/v1/share_manage.py similarity index 87% rename from manila/api/contrib/share_manage.py rename to manila/api/v1/share_manage.py index ebe3559ad5..acb1ac283a 100644 --- a/manila/api/contrib/share_manage.py +++ b/manila/api/v1/share_manage.py @@ -15,7 +15,6 @@ import six from webob import exc -from manila.api import extensions from manila.api.openstack import wsgi from manila.api.views import shares as share_views from manila import exception @@ -25,20 +24,22 @@ from manila.share import share_types from manila.share import utils as share_utils from manila import utils -authorize = extensions.extension_authorizer('share', 'manage') - class ShareManageController(wsgi.Controller): + """Allows existing share to be 'managed' by Manila.""" + resource_name = "share" _view_builder_class = share_views.ViewBuilder def __init__(self, *args, **kwargs): - super(ShareManageController, self).__init__(*args, **kwargs) + super(self.__class__, self).__init__(*args, **kwargs) self.share_api = share.API() def create(self, req, body): + # TODO(vponomaryov): move it to shares controller. + context = req.environ['manila.context'] - authorize(context) + self.authorize(req.environ['manila.context'], 'manage') share_data = self._validate_manage_parameters(context, body) # NOTE(vponomaryov): compatibility actions are required between API and @@ -74,7 +75,7 @@ class ShareManageController(wsgi.Controller): msg = _("Share entity not found in request body") raise exc.HTTPUnprocessableEntity(explanation=msg) - required_parameters = ['export_path', 'service_host', 'protocol'] + required_parameters = ('export_path', 'service_host', 'protocol') data = body['share'] @@ -115,15 +116,5 @@ class ShareManageController(wsgi.Controller): raise exc.HTTPNotFound(explanation=six.text_type(e)) -class Share_manage(extensions.ExtensionDescriptor): - """Allows existing share to be 'managed' by Manila.""" - - name = 'ShareManage' - alias = 'os-share-manage' - updated = '2015-02-17T00:00:00+00:00' - - def get_resources(self): - controller = ShareManageController() - res = extensions.ResourceExtension(Share_manage.alias, - controller) - return [res] +def create_resource(): + return wsgi.Resource(ShareManageController()) diff --git a/manila/api/contrib/share_unmanage.py b/manila/api/v1/share_unmanage.py similarity index 77% rename from manila/api/contrib/share_unmanage.py rename to manila/api/v1/share_unmanage.py index e1d13560e7..57c5a63f1b 100644 --- a/manila/api/contrib/share_unmanage.py +++ b/manila/api/v1/share_unmanage.py @@ -17,29 +17,30 @@ import six import webob from webob import exc -from manila.api import extensions from manila.api.openstack import wsgi from manila.common import constants from manila import exception -from manila.i18n import _ -from manila.i18n import _LI +from manila.i18n import _, _LI from manila import share -authorize = extensions.extension_authorizer('share', 'unmanage') - LOG = log.getLogger(__name__) class ShareUnmanageController(wsgi.Controller): + """The Unmanage API controller for the OpenStack API.""" + + resource_name = "share" + def __init__(self, *args, **kwargs): - super(ShareUnmanageController, self).__init__(*args, **kwargs) + super(self.__class__, self).__init__(*args, **kwargs) self.share_api = share.API() - @wsgi.action('create') + @wsgi.action("unmanage") def unmanage(self, req, id): """Unmanage a share.""" + # TODO(vponomaryov): move it to shares controller as 'unmanage' action. context = req.environ['manila.context'] - authorize(context) + self.authorize(req.environ['manila.context'], 'unmanage') LOG.info(_LI("Unmanage share with id: %s"), id, context=context) @@ -71,16 +72,5 @@ class ShareUnmanageController(wsgi.Controller): return webob.Response(status_int=202) -class Share_unmanage(extensions.ExtensionDescriptor): - """Enable share unmanage operation.""" - - name = 'ShareUnmanage' - alias = 'os-share-unmanage' - updated = '2015-02-17T00:00:00+00:00' - - def get_resources(self): - controller = ShareUnmanageController() - res = extensions.ResourceExtension(Share_unmanage.alias, - controller, - member_actions={"unmanage": "POST"}) - return [res] +def create_resource(): + return wsgi.Resource(ShareUnmanageController()) diff --git a/manila/tests/api/contrib/test_share_manage.py b/manila/tests/api/v1/test_share_manage.py similarity index 98% rename from manila/tests/api/contrib/test_share_manage.py rename to manila/tests/api/v1/test_share_manage.py index eba11250d7..4fe7c15503 100644 --- a/manila/tests/api/contrib/test_share_manage.py +++ b/manila/tests/api/v1/test_share_manage.py @@ -17,7 +17,7 @@ import ddt import mock import webob -from manila.api.contrib import share_manage +from manila.api.v1 import share_manage from manila.db import api as db_api from manila import exception from manila.share import api as share_api @@ -165,7 +165,7 @@ class ShareManageTest(test.TestCase): def test_wrong_permissions(self): body = get_fake_manage_body() - self.assertRaises(exception.PolicyNotAuthorized, + self.assertRaises(webob.exc.HTTPForbidden, self.controller.create, fakes.HTTPRequest.blank('/share/manage', use_admin_context=False), diff --git a/manila/tests/api/contrib/test_share_unmanage.py b/manila/tests/api/v1/test_share_unmanage.py similarity index 98% rename from manila/tests/api/contrib/test_share_unmanage.py rename to manila/tests/api/v1/test_share_unmanage.py index 6f25917a7d..ed18089b75 100644 --- a/manila/tests/api/contrib/test_share_unmanage.py +++ b/manila/tests/api/v1/test_share_unmanage.py @@ -17,7 +17,7 @@ import ddt import mock import webob -from manila.api.contrib import share_unmanage +from manila.api.v1 import share_unmanage from manila.common import constants from manila import exception from manila.share import api as share_api @@ -140,7 +140,7 @@ class ShareUnmanageTest(test.TestCase): req = fakes.HTTPRequest.blank('/share/%s/unmanage' % share_id, use_admin_context=False) - self.assertRaises(exception.PolicyNotAuthorized, + self.assertRaises(webob.exc.HTTPForbidden, self.controller.unmanage, req, share_id) diff --git a/manila/tests/policy.json b/manila/tests/policy.json index 9507ec701c..191108a287 100644 --- a/manila/tests/policy.json +++ b/manila/tests/policy.json @@ -19,6 +19,8 @@ "share:get_all_snapshots": "", "share:extend": "", "share:shrink": "", + "share:manage": "rule:admin_api", + "share:unmanage": "rule:admin_api", "share_type:index": "rule:default", "share_type:show": "rule:default", @@ -58,8 +60,6 @@ "share_extension:share_type_access": "", "share_extension:share_type_access:addProjectAccess": "rule:admin_api", "share_extension:share_type_access:removeProjectAccess": "rule:admin_api", - "share_extension:manage": "rule:admin_api", - "share_extension:unmanage": "rule:admin_api", "share_extension:availability_zones": "", "security_service:index": "",