]> git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/rbd_support/module.py
6062ceffa78a51422a4acaed993e9c990f0ae631
[ceph.git] / ceph / src / pybind / mgr / rbd_support / module.py
1 """
2 RBD support module
3 """
4
5 import errno
6 import rados
7 import rbd
8 import traceback
9
10 from mgr_module import MgrModule
11
12 from .common import NotAuthorizedError
13 from .mirror_snapshot_schedule import MirrorSnapshotScheduleHandler
14 from .perf import PerfHandler
15 from .task import TaskHandler
16 from .trash_purge_schedule import TrashPurgeScheduleHandler
17
18
19 class Module(MgrModule):
20 COMMANDS = [
21 {
22 "cmd": "rbd mirror snapshot schedule add "
23 "name=level_spec,type=CephString "
24 "name=interval,type=CephString "
25 "name=start_time,type=CephString,req=false ",
26 "desc": "Add rbd mirror snapshot schedule",
27 "perm": "w"
28 },
29 {
30 "cmd": "rbd mirror snapshot schedule remove "
31 "name=level_spec,type=CephString "
32 "name=interval,type=CephString,req=false "
33 "name=start_time,type=CephString,req=false ",
34 "desc": "Remove rbd mirror snapshot schedule",
35 "perm": "w"
36 },
37 {
38 "cmd": "rbd mirror snapshot schedule list "
39 "name=level_spec,type=CephString,req=false ",
40 "desc": "List rbd mirror snapshot schedule",
41 "perm": "r"
42 },
43 {
44 "cmd": "rbd mirror snapshot schedule status "
45 "name=level_spec,type=CephString,req=false ",
46 "desc": "Show rbd mirror snapshot schedule status",
47 "perm": "r"
48 },
49 {
50 "cmd": "rbd perf image stats "
51 "name=pool_spec,type=CephString,req=false "
52 "name=sort_by,type=CephChoices,strings="
53 "write_ops|write_bytes|write_latency|"
54 "read_ops|read_bytes|read_latency,"
55 "req=false ",
56 "desc": "Retrieve current RBD IO performance stats",
57 "perm": "r"
58 },
59 {
60 "cmd": "rbd perf image counters "
61 "name=pool_spec,type=CephString,req=false "
62 "name=sort_by,type=CephChoices,strings="
63 "write_ops|write_bytes|write_latency|"
64 "read_ops|read_bytes|read_latency,"
65 "req=false ",
66 "desc": "Retrieve current RBD IO performance counters",
67 "perm": "r"
68 },
69 {
70 "cmd": "rbd task add flatten "
71 "name=image_spec,type=CephString",
72 "desc": "Flatten a cloned image asynchronously in the background",
73 "perm": "w"
74 },
75 {
76 "cmd": "rbd task add remove "
77 "name=image_spec,type=CephString",
78 "desc": "Remove an image asynchronously in the background",
79 "perm": "w"
80 },
81 {
82 "cmd": "rbd task add trash remove "
83 "name=image_id_spec,type=CephString",
84 "desc": "Remove an image from the trash asynchronously in the background",
85 "perm": "w"
86 },
87 {
88 "cmd": "rbd task add migration execute "
89 "name=image_spec,type=CephString",
90 "desc": "Execute an image migration asynchronously in the background",
91 "perm": "w"
92 },
93 {
94 "cmd": "rbd task add migration commit "
95 "name=image_spec,type=CephString",
96 "desc": "Commit an executed migration asynchronously in the background",
97 "perm": "w"
98 },
99 {
100 "cmd": "rbd task add migration abort "
101 "name=image_spec,type=CephString",
102 "desc": "Abort a prepared migration asynchronously in the background",
103 "perm": "w"
104 },
105 {
106 "cmd": "rbd task cancel "
107 "name=task_id,type=CephString ",
108 "desc": "Cancel a pending or running asynchronous task",
109 "perm": "r"
110 },
111 {
112 "cmd": "rbd task list "
113 "name=task_id,type=CephString,req=false ",
114 "desc": "List pending or running asynchronous tasks",
115 "perm": "r"
116 },
117 {
118 "cmd": "rbd trash purge schedule add "
119 "name=level_spec,type=CephString "
120 "name=interval,type=CephString "
121 "name=start_time,type=CephString,req=false ",
122 "desc": "Add rbd trash purge schedule",
123 "perm": "w"
124 },
125 {
126 "cmd": "rbd trash purge schedule remove "
127 "name=level_spec,type=CephString "
128 "name=interval,type=CephString,req=false "
129 "name=start_time,type=CephString,req=false ",
130 "desc": "Remove rbd trash purge schedule",
131 "perm": "w"
132 },
133 {
134 "cmd": "rbd trash purge schedule list "
135 "name=level_spec,type=CephString,req=false ",
136 "desc": "List rbd trash purge schedule",
137 "perm": "r"
138 },
139 {
140 "cmd": "rbd trash purge schedule status "
141 "name=level_spec,type=CephString,req=false ",
142 "desc": "Show rbd trash purge schedule status",
143 "perm": "r"
144 }
145 ]
146 MODULE_OPTIONS = [
147 {'name': MirrorSnapshotScheduleHandler.MODULE_OPTION_NAME},
148 {'name': TrashPurgeScheduleHandler.MODULE_OPTION_NAME},
149 ]
150
151 mirror_snapshot_schedule = None
152 perf = None
153 task = None
154 trash_purge_schedule = None
155
156 def __init__(self, *args, **kwargs):
157 super(Module, self).__init__(*args, **kwargs)
158 self.rados.wait_for_latest_osdmap()
159 self.mirror_snapshot_schedule = MirrorSnapshotScheduleHandler(self)
160 self.perf = PerfHandler(self)
161 self.task = TaskHandler(self)
162 self.trash_purge_schedule = TrashPurgeScheduleHandler(self)
163
164 def handle_command(self, inbuf, cmd):
165 # ensure we have latest pools available
166 self.rados.wait_for_latest_osdmap()
167
168 prefix = cmd['prefix']
169 try:
170 try:
171 if prefix.startswith('rbd mirror snapshot schedule '):
172 return self.mirror_snapshot_schedule.handle_command(
173 inbuf, prefix[29:], cmd)
174 elif prefix.startswith('rbd perf '):
175 return self.perf.handle_command(inbuf, prefix[9:], cmd)
176 elif prefix.startswith('rbd task '):
177 return self.task.handle_command(inbuf, prefix[9:], cmd)
178 elif prefix.startswith('rbd trash purge schedule '):
179 return self.trash_purge_schedule.handle_command(
180 inbuf, prefix[25:], cmd)
181
182 except NotAuthorizedError:
183 raise
184 except Exception as ex:
185 # log the full traceback but don't send it to the CLI user
186 self.log.fatal("Fatal runtime error: {}\n{}".format(
187 ex, traceback.format_exc()))
188 raise
189
190 except rados.Error as ex:
191 return -ex.errno, "", str(ex)
192 except rbd.OSError as ex:
193 return -ex.errno, "", str(ex)
194 except rbd.Error as ex:
195 return -errno.EINVAL, "", str(ex)
196 except KeyError as ex:
197 return -errno.ENOENT, "", str(ex)
198 except ValueError as ex:
199 return -errno.EINVAL, "", str(ex)
200 except NotAuthorizedError as ex:
201 return -errno.EACCES, "", str(ex)
202
203 raise NotImplementedError(cmd['prefix'])