1 from mgr_module import MgrModule, CommandResult
5 class Module(MgrModule):
6 def __init__(self, *args, **kwargs):
7 super(Module, self).__init__(*args, **kwargs)
8 self.serve_event = threading.Event()
10 def notify(self, notify_type, notify_id):
11 if notify_type == 'osd_map':
14 def handle_osd_map(self):
16 Check pools on each OSDMap change
18 subtree_type = self.get_config('subtree') or 'rack'
19 failure_domain = self.get_config('failure_domain') or 'host'
20 pg_num = self.get_config('pg_num') or '128'
21 num_rep = self.get_config('num_rep') or '3'
22 min_size = self.get_config('min_size')
23 prefix = self.get_config('prefix') or 'by-' + subtree_type + '-'
25 osdmap = self.get("osd_map")
27 for pool in osdmap['pools']:
28 if pool['pool_name'].find(prefix) == 0:
29 lpools.append(pool['pool_name'])
31 self.log.debug('localized pools = %s', lpools)
33 tree = self.get('osd_map_tree')
34 for node in tree['nodes']:
35 if node['type'] == subtree_type:
36 subtrees.append(node['name'])
37 pool_name = prefix + node['name']
38 if pool_name not in lpools:
39 self.log.info('Creating localized pool %s', pool_name)
41 result = CommandResult("")
42 self.send_command(result, "mon", "", json.dumps({
43 "prefix": "osd crush rule create-replicated",
47 "type": failure_domain,
49 r, outb, outs = result.wait()
51 result = CommandResult("")
52 self.send_command(result, "mon", "", json.dumps({
53 "prefix": "osd pool create",
57 'erasure_code_profile': pool_name,
58 "pool_type": 'replicated',
59 'pg_num': str(pg_num),
61 r, outb, outs = result.wait()
63 result = CommandResult("")
64 self.send_command(result, "mon", "", json.dumps({
65 "prefix": "osd pool set",
71 r, outb, outs = result.wait()
74 result = CommandResult("")
75 self.send_command(result, "mon", "", json.dumps({
76 "prefix": "osd pool set",
82 r, outb, outs = result.wait()
84 # TODO remove pools for hosts that don't exist?
88 self.serve_event.wait()
89 self.serve_event.clear()
92 self.serve_event.set()