]>
git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/dashboard/controllers/crush_rule.py
2 # -*- coding: utf-8 -*-
3 from __future__
import absolute_import
5 from cherrypy
import NotFound
8 from ..security
import Scope
9 from ..services
.ceph_service
import CephService
10 from . import APIDoc
, APIRouter
, Endpoint
, EndpointDoc
, ReadPermission
, RESTController
, UIRouter
11 from ._version
import APIVersion
14 "rule_id": (int, 'Rule ID'),
15 "rule_name": (str, 'Rule Name'),
16 "ruleset": (int, 'RuleSet related to the rule'),
17 "type": (int, 'Type of Rule'),
18 "min_size": (int, 'Minimum size of Rule'),
19 "max_size": (int, 'Maximum size of Rule'),
20 'steps': ([{str}
], 'Steps included in the rule')
24 @APIRouter('/crush_rule', Scope
.POOL
)
25 @APIDoc("Crush Rule Management API", "CrushRule")
26 class CrushRule(RESTController
):
27 @EndpointDoc("List Crush Rule Configuration",
28 responses
={200: LIST_SCHEMA
})
29 @RESTController.MethodMap(version
=APIVersion(2, 0))
31 return mgr
.get('osd_map_crush')['rules']
33 @RESTController.MethodMap(version
=APIVersion(2, 0))
35 rules
= mgr
.get('osd_map_crush')['rules']
37 if r
['rule_name'] == name
:
39 raise NotFound('No such crush rule')
41 def create(self
, name
, root
, failure_domain
, device_class
=None):
45 'type': failure_domain
,
48 CephService
.send_command('mon', 'osd crush rule create-replicated', **rule
)
50 def delete(self
, name
):
51 CephService
.send_command('mon', 'osd crush rule rm', name
=name
)
54 @UIRouter('/crush_rule', Scope
.POOL
)
55 @APIDoc("Dashboard UI helper function; not part of the public API", "CrushRuleUi")
56 class CrushRuleUi(CrushRule
):
60 '''Used for crush rule creation modal'''
61 osd_map
= mgr
.get_osdmap()
62 crush
= osd_map
.get_crush()
65 'names': [r
['rule_name'] for r
in mgr
.get('osd_map_crush')['rules']],
66 'nodes': mgr
.get('osd_map_tree')['nodes'],
67 'roots': crush
.find_roots()