mirror of
https://github.com/ceph/ceph
synced 2025-04-17 04:41:36 +00:00
Fixes: https://tracker.ceph.com/issues/52589 Signed-off-by: Ernesto Puerta <epuertat@redhat.com>
66 lines
2.3 KiB
Python
66 lines
2.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from cherrypy import NotFound
|
|
|
|
from .. import mgr
|
|
from ..security import Scope
|
|
from ..services.ceph_service import CephService
|
|
from . import APIDoc, APIRouter, Endpoint, EndpointDoc, ReadPermission, RESTController, UIRouter
|
|
|
|
LIST_CODE__SCHEMA = {
|
|
"crush-failure-domain": (str, ''),
|
|
"k": (int, 'Number of data chunks'),
|
|
"m": (int, 'Number of coding chunks'),
|
|
"plugin": (str, 'Plugin Info'),
|
|
"technique": (str, ''),
|
|
"name": (str, 'Name of the profile')
|
|
}
|
|
|
|
|
|
@APIRouter('/erasure_code_profile', Scope.POOL)
|
|
@APIDoc("Erasure Code Profile Management API", "ErasureCodeProfile")
|
|
class ErasureCodeProfile(RESTController):
|
|
"""
|
|
create() supports additional key-value arguments that are passed to the
|
|
ECP plugin.
|
|
"""
|
|
@EndpointDoc("List Erasure Code Profile Information",
|
|
responses={'200': [LIST_CODE__SCHEMA]})
|
|
def list(self):
|
|
return CephService.get_erasure_code_profiles()
|
|
|
|
def get(self, name):
|
|
profiles = CephService.get_erasure_code_profiles()
|
|
for p in profiles:
|
|
if p['name'] == name:
|
|
return p
|
|
raise NotFound('No such erasure code profile')
|
|
|
|
def create(self, name, **kwargs):
|
|
profile = ['{}={}'.format(key, value) for key, value in kwargs.items()]
|
|
CephService.send_command('mon', 'osd erasure-code-profile set', name=name,
|
|
profile=profile)
|
|
|
|
def delete(self, name):
|
|
CephService.send_command('mon', 'osd erasure-code-profile rm', name=name)
|
|
|
|
|
|
@UIRouter('/erasure_code_profile', Scope.POOL)
|
|
@APIDoc("Dashboard UI helper function; not part of the public API", "ErasureCodeProfileUi")
|
|
class ErasureCodeProfileUi(ErasureCodeProfile):
|
|
@Endpoint()
|
|
@ReadPermission
|
|
def info(self):
|
|
"""
|
|
Used for profile creation and editing
|
|
"""
|
|
config = mgr.get('config')
|
|
return {
|
|
# Because 'shec' and 'clay' are experimental they're not included
|
|
'plugins': config['osd_erasure_code_plugins'].split() + ['shec', 'clay'],
|
|
'directory': config['erasure_code_dir'],
|
|
'nodes': mgr.get('osd_map_tree')['nodes'],
|
|
'names': [name for name, _ in
|
|
mgr.get('osd_map').get('erasure_code_profiles', {}).items()]
|
|
}
|