1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from cherrypy import NotFound
from . import ApiController, RESTController, Endpoint, ReadPermission
from ..security import Scope
from ..services.ceph_service import CephService
from .. import mgr
def _serialize_ecp(name, ecp):
def serialize_numbers(key):
value = ecp.get(key)
if value is not None:
ecp[key] = int(value)
ecp['name'] = name
serialize_numbers('k')
serialize_numbers('m')
return ecp
@ApiController('/erasure_code_profile', Scope.POOL)
class ErasureCodeProfile(RESTController):
'''
create() supports additional key-value arguments that are passed to the
ECP plugin.
'''
def list(self):
ret = []
for name, ecp in mgr.get('osd_map').get('erasure_code_profiles', {}).items():
ret.append(_serialize_ecp(name, ecp))
return ret
def get(self, name):
try:
ecp = mgr.get('osd_map')['erasure_code_profiles'][name]
return _serialize_ecp(name, ecp)
except KeyError:
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)
@Endpoint()
@ReadPermission
def _info(self):
'''Used for profile creation and editing'''
config = mgr.get('config')
osd_map_crush = mgr.get('osd_map_crush')
return {
# Because 'shec' is experimental it's not included
'plugins': config['osd_erasure_code_plugins'].split() + ['shec'],
'directory': config['erasure_code_dir'],
'devices': list({device['class'] for device in osd_map_crush['devices']}),
'failure_domains': [domain['name'] for domain in osd_map_crush['types']],
'names': [name for name, _ in
mgr.get('osd_map').get('erasure_code_profiles', {}).items()]
}
|