diff --git a/etc/manila/policy.json b/etc/manila/policy.json index 834fb58182..661e8f9965 100644 --- a/etc/manila/policy.json +++ b/etc/manila/policy.json @@ -7,6 +7,9 @@ "availability_zone:index": "rule:default", + "service:index": "rule:admin_api", + "service:update": "rule:admin_api", + "share:create": "", "share:delete": "rule:default", "share:get": "rule:default", @@ -54,7 +57,6 @@ "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": "", "share_extension:types_manage": "rule:admin_api", diff --git a/manila/api/v1/router.py b/manila/api/v1/router.py index f74f814c60..fa5177e2ea 100644 --- a/manila/api/v1/router.py +++ b/manila/api/v1/router.py @@ -29,6 +29,7 @@ from manila.api.v1 import consistency_groups 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 services from manila.api.v1 import share_instances from manila.api.v1 import share_manage from manila.api.v1 import share_metadata @@ -67,6 +68,13 @@ class APIRouter(manila.api.openstack.APIRouter): "os-availability-zone", controller=self.resources["availability_zones"]) + self.resources["services"] = services.create_resource() + mapper.resource("service", + # TODO(vponomaryov): rename 'os-services' to + # 'services' when API urls rename happens. + "os-services", + controller=self.resources["services"]) + self.resources["share_manage"] = share_manage.create_resource() mapper.resource("share_manage", # TODO(vponomaryov): remove it when it is ported diff --git a/manila/api/contrib/services.py b/manila/api/v1/services.py similarity index 63% rename from manila/api/contrib/services.py rename to manila/api/v1/services.py index 607903fef8..ec796be37c 100644 --- a/manila/api/contrib/services.py +++ b/manila/api/v1/services.py @@ -1,4 +1,5 @@ # Copyright 2012 IBM Corp. +# Copyright (c) 2015 Mirantis inc. # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -16,20 +17,25 @@ from oslo_log import log import webob.exc -from manila.api import extensions +from manila.api.openstack import wsgi +from manila.api.views import services as services_views from manila import db -from manila import exception from manila import utils LOG = log.getLogger(__name__) -authorize = extensions.extension_authorizer('share', 'services') -class ServiceController(object): +class ServiceController(wsgi.Controller): + """The Services API controller for the OpenStack API.""" + + resource_name = "service" + _view_builder_class = services_views.ViewBuilder + def index(self, req): """Return a list of all running services.""" + context = req.environ['manila.context'] - authorize(context) + self.authorize(context, 'index') all_services = db.service_get_all(context) services = [] @@ -60,48 +66,32 @@ class ServiceController(object): if len(services) == 0: break - return {'services': services} + return self._view_builder.detail_list(services) def update(self, req, id, body): """Enable/Disable scheduling for a service.""" context = req.environ['manila.context'] - authorize(context) + self.authorize(context, 'update') if id == "enable": - disabled = False + data = {'disabled': False} elif id == "disable": - disabled = True + data = {'disabled': True} else: - raise webob.exc.HTTPNotFound("Unknown action") + raise webob.exc.HTTPNotFound("Unknown action '%s'" % id) try: - host = body['host'] - binary = body['binary'] + data['host'] = body['host'] + data['binary'] = body['binary'] except (TypeError, KeyError): raise webob.exc.HTTPBadRequest() - try: - svc = db.service_get_by_args(context, host, binary) - if not svc: - raise webob.exc.HTTPNotFound('Unknown service') + svc = db.service_get_by_args(context, data['host'], data['binary']) + db.service_update( + context, svc['id'], {'disabled': data['disabled']}) - db.service_update(context, svc['id'], {'disabled': disabled}) - except exception.ServiceNotFound: - raise webob.exc.HTTPNotFound("service not found") - - return {'host': host, 'binary': binary, 'disabled': disabled} + return self._view_builder.summary(data) -class Services(extensions.ExtensionDescriptor): - """Services support.""" - - name = "Services" - alias = "os-services" - updated = "2012-10-28T00:00:00-00:00" - - def get_resources(self): - resources = [] - resource = extensions.ResourceExtension('os-services', - ServiceController()) - resources.append(resource) - return resources +def create_resource(): + return wsgi.Resource(ServiceController()) diff --git a/manila/api/views/services.py b/manila/api/views/services.py new file mode 100644 index 0000000000..759ffd0c1c --- /dev/null +++ b/manila/api/views/services.py @@ -0,0 +1,32 @@ +# Copyright (c) 2015 Mirantis inc. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from manila.api import common + + +class ViewBuilder(common.ViewBuilder): + + _collection_name = "services" + + def summary(self, service): + """Summary view of a single service.""" + keys = 'host', 'binary', 'disabled' + return {key: service.get(key) for key in keys} + + def detail_list(self, services): + """Detailed view of a list of services.""" + keys = 'id', 'binary', 'host', 'zone', 'status', 'state', 'updated_at' + views = [{key: s.get(key) for key in keys} for s in services] + return {self._collection_name: views} diff --git a/manila/tests/api/contrib/test_services.py b/manila/tests/api/v1/test_services.py similarity index 99% rename from manila/tests/api/contrib/test_services.py rename to manila/tests/api/v1/test_services.py index 524bfec3ef..b6151858a6 100644 --- a/manila/tests/api/contrib/test_services.py +++ b/manila/tests/api/v1/test_services.py @@ -19,7 +19,7 @@ import datetime from oslo_utils import timeutils -from manila.api.contrib import services +from manila.api.v1 import services from manila import context from manila import db from manila import exception diff --git a/manila/tests/policy.json b/manila/tests/policy.json index 191108a287..928bc16a6f 100644 --- a/manila/tests/policy.json +++ b/manila/tests/policy.json @@ -6,6 +6,9 @@ "availability_zone:index": "rule:default", + "service:index": "rule:admin_api", + "service:update": "rule:admin_api", + "share:create": "", "share:list_by_share_server_id": "rule:admin_api", "share:get": "",