"""
An instance of this class represents an endpoint.
"""
+
def __init__(self, ctrl, func):
self.ctrl = ctrl
self.inst = None
def UpdatePermission(func):
_set_func_permissions(func, Permission.UPDATE)
return func
+
+
+# Empty request body decorator
+
+def allow_empty_body(func): # noqa: N802
+ """
+ The POST/PUT request methods decorated with ``@allow_empty_body``
+ are allowed to send empty request body.
+ """
+ try:
+ func._cp_config['tools.json_in.force'] = False
+ except (AttributeError, KeyError):
+ func._cp_config = {'tools.json_in.force': False}
+ return func
import cherrypy
import jwt
-from . import ApiController, RESTController
+from . import ApiController, RESTController, \
+ allow_empty_body
from .. import logger, mgr
from ..exceptions import DashboardException
from ..services.auth import AuthManager, JwtManager
component='auth')
@RESTController.Collection('POST')
+ @allow_empty_body
def logout(self):
logger.debug('Logout successful')
token = JwtManager.get_token_from_header()
import cherrypy
-from . import Controller, BaseController, Endpoint, ENDPOINT_MAP
+from . import Controller, BaseController, Endpoint, ENDPOINT_MAP, \
+ allow_empty_body
from .. import logger, mgr
from ..tools import str_to_bool
@Endpoint('POST', path="/", json_response=False,
query_params="{all_endpoints}")
+ @allow_empty_body
def _with_token(self, token, all_endpoints=False):
return self._swagger_ui_page(all_endpoints, token)
# -*- coding: utf-8 -*-
from __future__ import absolute_import
-from . import ApiController, RESTController
+from . import ApiController, RESTController, \
+ allow_empty_body
from .. import mgr
from ..security import Scope
from ..services.ceph_service import CephService
@RESTController.Resource('POST')
@handle_send_command_error('mgr_modules')
+ @allow_empty_body
def enable(self, module_name):
"""
Enable the specified Ceph Mgr module.
@RESTController.Resource('POST')
@handle_send_command_error('mgr_modules')
+ @allow_empty_body
def disable(self, module_name):
"""
Disable the specified Ceph Mgr module.
from mgr_util import get_most_recent_rate
-from . import ApiController, RESTController, UpdatePermission
+from . import ApiController, RESTController, UpdatePermission, \
+ allow_empty_body
from .. import mgr, logger
from ..security import Scope
from ..services.ceph_service import CephService, SendCommandError
@RESTController.Resource('POST', query_params=['deep'])
@UpdatePermission
+ @allow_empty_body
def scrub(self, svc_id, deep=False):
api_scrub = "osd deep-scrub" if str_to_bool(deep) else "osd scrub"
CephService.send_command("mon", api_scrub, who=svc_id)
@RESTController.Resource('POST')
+ @allow_empty_body
def mark_out(self, svc_id):
CephService.send_command('mon', 'osd out', ids=[svc_id])
@RESTController.Resource('POST')
+ @allow_empty_body
def mark_in(self, svc_id):
CephService.send_command('mon', 'osd in', ids=[svc_id])
@RESTController.Resource('POST')
+ @allow_empty_body
def mark_down(self, svc_id):
CephService.send_command('mon', 'osd down', ids=[svc_id])
@RESTController.Resource('POST')
+ @allow_empty_body
def reweight(self, svc_id, weight):
"""
Reweights the OSD temporarily.
weight=float(weight))
@RESTController.Resource('POST')
+ @allow_empty_body
def mark_lost(self, svc_id):
"""
Note: osd must be marked `down` before marking lost.
}
@RESTController.Resource('POST')
+ @allow_empty_body
def purge(self, svc_id):
"""
Note: osd must be marked `down` before removal.
yes_i_really_mean_it=True)
@RESTController.Resource('POST')
+ @allow_empty_body
def destroy(self, svc_id):
"""
Mark osd as being destroyed. Keeps the ID intact (allowing reuse), but
import rbd
from . import ApiController, RESTController, Task, UpdatePermission, \
- DeletePermission, CreatePermission, ReadPermission
+ DeletePermission, CreatePermission, ReadPermission, allow_empty_body
from .. import mgr, logger
from ..security import Scope
from ..services.ceph_service import CephService
'dest_pool_name': '{dest_pool_name}',
'dest_image_name': '{dest_image_name}'}, 2.0)
@RESTController.Resource('POST')
+ @allow_empty_body
def copy(self, pool_name, image_name, dest_pool_name, dest_image_name,
snapshot_name=None, obj_size=None, features=None, stripe_unit=None,
stripe_count=None, data_pool=None, configuration=None):
@RbdTask('flatten', ['{pool_name}', '{image_name}'], 2.0)
@RESTController.Resource('POST')
@UpdatePermission
+ @allow_empty_body
def flatten(self, pool_name, image_name):
def _flatten(ioctx, image):
@RbdTask('trash/move', ['{pool_name}', '{image_name}'], 2.0)
@RESTController.Resource('POST')
+ @allow_empty_body
def move_trash(self, pool_name, image_name, delay=0):
"""Move an image to the trash.
Images, even ones actively in-use by clones,
['{pool_name}', '{image_name}', '{snapshot_name}'], 5.0)
@RESTController.Resource('POST')
@UpdatePermission
+ @allow_empty_body
def rollback(self, pool_name, image_name, snapshot_name):
def _rollback(ioctx, img, snapshot_name):
img.rollback_to_snap(snapshot_name)
'child_pool_name': '{child_pool_name}',
'child_image_name': '{child_image_name}'}, 2.0)
@RESTController.Resource('POST')
+ @allow_empty_body
def clone(self, pool_name, image_name, snapshot_name, child_pool_name,
child_image_name, obj_size=None, features=None, stripe_unit=None, stripe_count=None,
data_pool=None, configuration=None):
@RbdTask('trash/purge', ['{pool_name}'], 2.0)
@RESTController.Collection('POST', query_params=['pool_name'])
@DeletePermission
+ @allow_empty_body
def purge(self, pool_name=None):
"""Remove all expired images from trash."""
now = "{}Z".format(datetime.utcnow().isoformat())
@RbdTask('trash/restore', ['{pool_name}', '{image_id}', '{new_image_name}'], 2.0)
@RESTController.Resource('POST')
@CreatePermission
+ @allow_empty_body
def restore(self, pool_name, image_id, new_image_name):
"""Restore an image from trash."""
return _rbd_call(pool_name, self.rbd_inst.trash_restore, image_id, new_image_name)
import cherrypy
from . import ApiController, BaseController, RESTController, Endpoint, \
- ReadPermission
+ ReadPermission, allow_empty_body
from .. import logger
from ..exceptions import DashboardException
from ..rest_client import RequestException
result = self.proxy('GET', 'bucket', {'bucket': bucket})
return self._append_bid(result)
+ @allow_empty_body
def create(self, bucket, uid):
try:
rgw_client = RgwClient.instance(uid)
except RequestException as e:
raise DashboardException(e, http_status_code=500, component='rgw')
+ @allow_empty_body
def set(self, bucket, bucket_id, uid):
result = self.proxy('PUT', 'bucket', {
'bucket': RgwBucket.strip_tenant_from_bucket_name(bucket, uid),
emails.append(user["email"])
return emails
+ @allow_empty_body
def create(self, uid, display_name, email=None, max_buckets=None,
suspended=None, generate_key=None, access_key=None,
secret_key=None):
result = self.proxy('PUT', 'user', params)
return self._append_uid(result)
+ @allow_empty_body
def set(self, uid, display_name=None, email=None, max_buckets=None,
suspended=None):
params = {'uid': uid}
# pylint: disable=redefined-builtin
@RESTController.Resource(method='POST', path='/capability', status=201)
+ @allow_empty_body
def create_cap(self, uid, type, perm):
return self.proxy('PUT', 'user?caps', {
'uid': uid,
})
@RESTController.Resource(method='POST', path='/key', status=201)
+ @allow_empty_body
def create_key(self, uid, key_type='s3', subuser=None, generate_key='true',
access_key=None, secret_key=None):
params = {'uid': uid, 'key-type': key_type, 'generate-key': generate_key}
return self.proxy('GET', 'user?quota', {'uid': uid})
@RESTController.Resource(method='PUT', path='/quota')
+ @allow_empty_body
def set_quota(self, uid, quota_type, enabled, max_size_kb, max_objects):
return self.proxy('PUT', 'user?quota', {
'uid': uid,
}, json_response=False)
@RESTController.Resource(method='POST', path='/subuser', status=201)
+ @allow_empty_body
def create_subuser(self, uid, subuser, access, key_type='s3',
generate_secret='true', access_key=None,
secret_key=None):
'application/javascript',
],
'tools.json_in.on': True,
- 'tools.json_in.force': False,
+ 'tools.json_in.force': True,
'tools.plugin_hooks_filter_request.on': True,
}