]>
git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/localpool/module.py
1 from mgr_module
import MgrModule
, CommandResult
, Option
, NotifyType
4 from typing
import cast
, Any
7 class Module(MgrModule
):
14 desc
='CRUSH level for which to create a local pool',
15 long_desc
='which CRUSH subtree type the module should create a pool for.',
18 name
='failure_domain',
21 desc
='failure domain for any created local pool',
22 long_desc
='what failure domain we should separate data replicas across.',
27 desc
='default min_size for any created local pool',
28 long_desc
='value to set min_size to (unchanged from Ceph\'s default if this option is not set)',
34 desc
='default replica count for any created local pool',
40 desc
='default pg_num for any created local pool',
46 desc
='name prefix for any created local pool',
49 NOTIFY_TYPES
= [NotifyType
.osd_map
]
51 def __init__(self
, *args
: Any
, **kwargs
: Any
) -> None:
52 super(Module
, self
).__init
__(*args
, **kwargs
)
53 self
.serve_event
= threading
.Event()
55 def notify(self
, notify_type
: NotifyType
, notify_id
: str) -> None:
56 if notify_type
== NotifyType
.osd_map
:
59 def handle_osd_map(self
) -> None:
61 Check pools on each OSDMap change
63 subtree_type
= cast(str, self
.get_module_option('subtree'))
64 failure_domain
= self
.get_module_option('failure_domain')
65 pg_num
= self
.get_module_option('pg_num')
66 num_rep
= self
.get_module_option('num_rep')
67 min_size
= self
.get_module_option('min_size')
68 prefix
= cast(str, self
.get_module_option('prefix')) or 'by-' + subtree_type
+ '-'
70 osdmap
= self
.get("osd_map")
72 for pool
in osdmap
['pools']:
73 if pool
['pool_name'].find(prefix
) == 0:
74 lpools
.append(pool
['pool_name'])
76 self
.log
.debug('localized pools = %s', lpools
)
78 tree
= self
.get('osd_map_tree')
79 for node
in tree
['nodes']:
80 if node
['type'] == subtree_type
:
81 subtrees
.append(node
['name'])
82 pool_name
= prefix
+ node
['name']
83 if pool_name
not in lpools
:
84 self
.log
.info('Creating localized pool %s', pool_name
)
86 result
= CommandResult("")
87 self
.send_command(result
, "mon", "", json
.dumps({
88 "prefix": "osd crush rule create-replicated",
92 "type": failure_domain
,
94 r
, outb
, outs
= result
.wait()
96 result
= CommandResult("")
97 self
.send_command(result
, "mon", "", json
.dumps({
98 "prefix": "osd pool create",
102 "pool_type": 'replicated',
105 r
, outb
, outs
= result
.wait()
107 result
= CommandResult("")
108 self
.send_command(result
, "mon", "", json
.dumps({
109 "prefix": "osd pool set",
115 r
, outb
, outs
= result
.wait()
118 result
= CommandResult("")
119 self
.send_command(result
, "mon", "", json
.dumps({
120 "prefix": "osd pool set",
124 "val": str(min_size
),
126 r
, outb
, outs
= result
.wait()
128 # TODO remove pools for hosts that don't exist?
130 def serve(self
) -> None:
131 self
.handle_osd_map()
132 self
.serve_event
.wait()
133 self
.serve_event
.clear()
135 def shutdown(self
) -> None:
136 self
.serve_event
.set()