]> git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/volumes/module.py
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / pybind / mgr / volumes / module.py
1 import errno
2 import json
3
4 from mgr_module import MgrModule
5 import orchestrator
6
7 from .fs.volume import VolumeClient
8
9 class Module(orchestrator.OrchestratorClientMixin, MgrModule):
10 COMMANDS = [
11 {
12 'cmd': 'fs volume ls',
13 'desc': "List volumes",
14 'perm': 'r'
15 },
16 {
17 'cmd': 'fs volume create '
18 'name=name,type=CephString ',
19 'desc': "Create a CephFS volume",
20 'perm': 'rw'
21 },
22 {
23 'cmd': 'fs volume rm '
24 'name=vol_name,type=CephString '
25 'name=yes-i-really-mean-it,type=CephString,req=false ',
26 'desc': "Delete a FS volume by passing --yes-i-really-mean-it flag",
27 'perm': 'rw'
28 },
29 {
30 'cmd': 'fs subvolumegroup ls '
31 'name=vol_name,type=CephString ',
32 'desc': "List subvolumegroups",
33 'perm': 'r'
34 },
35 {
36 'cmd': 'fs subvolumegroup create '
37 'name=vol_name,type=CephString '
38 'name=group_name,type=CephString '
39 'name=pool_layout,type=CephString,req=false '
40 'name=uid,type=CephInt,req=false '
41 'name=gid,type=CephInt,req=false '
42 'name=mode,type=CephString,req=false ',
43 'desc': "Create a CephFS subvolume group in a volume, and optionally, "
44 "with a specific data pool layout, and a specific numeric mode",
45 'perm': 'rw'
46 },
47 {
48 'cmd': 'fs subvolumegroup rm '
49 'name=vol_name,type=CephString '
50 'name=group_name,type=CephString '
51 'name=force,type=CephBool,req=false ',
52 'desc': "Delete a CephFS subvolume group in a volume",
53 'perm': 'rw'
54 },
55 {
56 'cmd': 'fs subvolume ls '
57 'name=vol_name,type=CephString '
58 'name=group_name,type=CephString,req=false ',
59 'desc': "List subvolumes",
60 'perm': 'r'
61 },
62 {
63 'cmd': 'fs subvolume create '
64 'name=vol_name,type=CephString '
65 'name=sub_name,type=CephString '
66 'name=size,type=CephInt,req=false '
67 'name=group_name,type=CephString,req=false '
68 'name=pool_layout,type=CephString,req=false '
69 'name=uid,type=CephInt,req=false '
70 'name=gid,type=CephInt,req=false '
71 'name=mode,type=CephString,req=false ',
72 'desc': "Create a CephFS subvolume in a volume, and optionally, "
73 "with a specific size (in bytes), a specific data pool layout, "
74 "a specific mode, and in a specific subvolume group",
75 'perm': 'rw'
76 },
77 {
78 'cmd': 'fs subvolume rm '
79 'name=vol_name,type=CephString '
80 'name=sub_name,type=CephString '
81 'name=group_name,type=CephString,req=false '
82 'name=force,type=CephBool,req=false ',
83 'desc': "Delete a CephFS subvolume in a volume, and optionally, "
84 "in a specific subvolume group",
85 'perm': 'rw'
86 },
87 {
88 'cmd': 'fs subvolumegroup getpath '
89 'name=vol_name,type=CephString '
90 'name=group_name,type=CephString ',
91 'desc': "Get the mountpath of a CephFS subvolume group in a volume",
92 'perm': 'r'
93 },
94 {
95 'cmd': 'fs subvolume getpath '
96 'name=vol_name,type=CephString '
97 'name=sub_name,type=CephString '
98 'name=group_name,type=CephString,req=false ',
99 'desc': "Get the mountpath of a CephFS subvolume in a volume, "
100 "and optionally, in a specific subvolume group",
101 'perm': 'rw'
102 },
103 {
104 'cmd': 'fs subvolumegroup snapshot ls '
105 'name=vol_name,type=CephString '
106 'name=group_name,type=CephString ',
107 'desc': "List subvolumegroup snapshots",
108 'perm': 'r'
109 },
110 {
111 'cmd': 'fs subvolumegroup snapshot create '
112 'name=vol_name,type=CephString '
113 'name=group_name,type=CephString '
114 'name=snap_name,type=CephString ',
115 'desc': "Create a snapshot of a CephFS subvolume group in a volume",
116 'perm': 'rw'
117 },
118 {
119 'cmd': 'fs subvolumegroup snapshot rm '
120 'name=vol_name,type=CephString '
121 'name=group_name,type=CephString '
122 'name=snap_name,type=CephString '
123 'name=force,type=CephBool,req=false ',
124 'desc': "Delete a snapshot of a CephFS subvolume group in a volume",
125 'perm': 'rw'
126 },
127 {
128 'cmd': 'fs subvolume snapshot ls '
129 'name=vol_name,type=CephString '
130 'name=sub_name,type=CephString '
131 'name=group_name,type=CephString,req=false ',
132 'desc': "List subvolume snapshots",
133 'perm': 'r'
134 },
135 {
136 'cmd': 'fs subvolume snapshot create '
137 'name=vol_name,type=CephString '
138 'name=sub_name,type=CephString '
139 'name=snap_name,type=CephString '
140 'name=group_name,type=CephString,req=false ',
141 'desc': "Create a snapshot of a CephFS subvolume in a volume, "
142 "and optionally, in a specific subvolume group",
143 'perm': 'rw'
144 },
145 {
146 'cmd': 'fs subvolume snapshot rm '
147 'name=vol_name,type=CephString '
148 'name=sub_name,type=CephString '
149 'name=snap_name,type=CephString '
150 'name=group_name,type=CephString,req=false '
151 'name=force,type=CephBool,req=false ',
152 'desc': "Delete a snapshot of a CephFS subvolume in a volume, "
153 "and optionally, in a specific subvolume group",
154 'perm': 'rw'
155 },
156 {
157 'cmd': 'fs subvolume resize '
158 'name=vol_name,type=CephString '
159 'name=sub_name,type=CephString '
160 'name=new_size,type=CephString,req=true '
161 'name=group_name,type=CephString,req=false '
162 'name=no_shrink,type=CephBool,req=false ',
163 'desc': "Resize a CephFS subvolume",
164 'perm': 'rw'
165 },
166 {
167 'cmd': 'fs subvolume snapshot protect '
168 'name=vol_name,type=CephString '
169 'name=sub_name,type=CephString '
170 'name=snap_name,type=CephString '
171 'name=group_name,type=CephString,req=false ',
172 'desc': "Protect snapshot of a CephFS subvolume in a volume, "
173 "and optionally, in a specific subvolume group",
174 'perm': 'rw'
175 },
176 {
177 'cmd': 'fs subvolume snapshot unprotect '
178 'name=vol_name,type=CephString '
179 'name=sub_name,type=CephString '
180 'name=snap_name,type=CephString '
181 'name=group_name,type=CephString,req=false ',
182 'desc': "Unprotect a snapshot of a CephFS subvolume in a volume, "
183 "and optionally, in a specific subvolume group",
184 'perm': 'rw'
185 },
186 {
187 'cmd': 'fs subvolume snapshot clone '
188 'name=vol_name,type=CephString '
189 'name=sub_name,type=CephString '
190 'name=snap_name,type=CephString '
191 'name=target_sub_name,type=CephString '
192 'name=pool_layout,type=CephString,req=false '
193 'name=group_name,type=CephString,req=false '
194 'name=target_group_name,type=CephString,req=false ',
195 'desc': "Clone a snapshot to target subvolume",
196 'perm': 'rw'
197 },
198 {
199 'cmd': 'fs clone status '
200 'name=vol_name,type=CephString '
201 'name=clone_name,type=CephString '
202 'name=group_name,type=CephString,req=false ',
203 'desc': "Get status on a cloned subvolume.",
204 'perm': 'r'
205 },
206
207 # volume ls [recursive]
208 # subvolume ls <volume>
209 # volume authorize/deauthorize
210 # subvolume authorize/deauthorize
211
212 # volume describe (free space, etc)
213 # volume auth list (vc.get_authorized_ids)
214
215 # snapshots?
216
217 # FIXME: we're doing CephFSVolumeClient.recover on every
218 # path where we instantiate and connect a client. Perhaps
219 # keep clients alive longer, or just pass a "don't recover"
220 # flag in if it's the >1st time we connected a particular
221 # volume in the lifetime of this module instance.
222 ]
223
224 def __init__(self, *args, **kwargs):
225 super(Module, self).__init__(*args, **kwargs)
226 self.vc = VolumeClient(self)
227
228 def __del__(self):
229 self.vc.shutdown()
230
231 def shutdown(self):
232 self.vc.shutdown()
233
234 def handle_command(self, inbuf, cmd):
235 handler_name = "_cmd_" + cmd['prefix'].replace(" ", "_")
236 try:
237 handler = getattr(self, handler_name)
238 except AttributeError:
239 return -errno.EINVAL, "", "Unknown command"
240
241 return handler(inbuf, cmd)
242
243 def _cmd_fs_volume_create(self, inbuf, cmd):
244 vol_id = cmd['name']
245 return self.vc.create_fs_volume(vol_id)
246
247 def _cmd_fs_volume_rm(self, inbuf, cmd):
248 vol_name = cmd['vol_name']
249 confirm = cmd.get('yes-i-really-mean-it', None)
250 return self.vc.delete_fs_volume(vol_name, confirm)
251
252 def _cmd_fs_volume_ls(self, inbuf, cmd):
253 return self.vc.list_fs_volumes()
254
255 def _cmd_fs_subvolumegroup_create(self, inbuf, cmd):
256 """
257 :return: a 3-tuple of return code(int), empty string(str), error message (str)
258 """
259 return self.vc.create_subvolume_group(
260 vol_name=cmd['vol_name'], group_name=cmd['group_name'],
261 pool_layout=cmd.get('pool_layout', None), mode=cmd.get('mode', '755'),
262 uid=cmd.get('uid', None), gid=cmd.get('gid', None))
263
264 def _cmd_fs_subvolumegroup_rm(self, inbuf, cmd):
265 """
266 :return: a 3-tuple of return code(int), empty string(str), error message (str)
267 """
268 return self.vc.remove_subvolume_group(vol_name=cmd['vol_name'],
269 group_name=cmd['group_name'],
270 force=cmd.get('force', False))
271
272 def _cmd_fs_subvolumegroup_ls(self, inbuf, cmd):
273 return self.vc.list_subvolume_groups(vol_name=cmd['vol_name'])
274
275 def _cmd_fs_subvolume_create(self, inbuf, cmd):
276 """
277 :return: a 3-tuple of return code(int), empty string(str), error message (str)
278 """
279 return self.vc.create_subvolume(vol_name=cmd['vol_name'],
280 sub_name=cmd['sub_name'],
281 group_name=cmd.get('group_name', None),
282 size=cmd.get('size', None),
283 pool_layout=cmd.get('pool_layout', None),
284 uid=cmd.get('uid', None),
285 gid=cmd.get('gid', None),
286 mode=cmd.get('mode', '755'))
287
288 def _cmd_fs_subvolume_rm(self, inbuf, cmd):
289 """
290 :return: a 3-tuple of return code(int), empty string(str), error message (str)
291 """
292 return self.vc.remove_subvolume(vol_name=cmd['vol_name'],
293 sub_name=cmd['sub_name'],
294 group_name=cmd.get('group_name', None),
295 force=cmd.get('force', False))
296
297 def _cmd_fs_subvolume_ls(self, inbuf, cmd):
298 return self.vc.list_subvolumes(vol_name=cmd['vol_name'],
299 group_name=cmd.get('group_name', None))
300
301 def _cmd_fs_subvolumegroup_getpath(self, inbuf, cmd):
302 return self.vc.getpath_subvolume_group(
303 vol_name=cmd['vol_name'], group_name=cmd['group_name'])
304
305 def _cmd_fs_subvolume_getpath(self, inbuf, cmd):
306 return self.vc.subvolume_getpath(vol_name=cmd['vol_name'],
307 sub_name=cmd['sub_name'],
308 group_name=cmd.get('group_name', None))
309
310 def _cmd_fs_subvolumegroup_snapshot_create(self, inbuf, cmd):
311 return self.vc.create_subvolume_group_snapshot(vol_name=cmd['vol_name'],
312 group_name=cmd['group_name'],
313 snap_name=cmd['snap_name'])
314
315 def _cmd_fs_subvolumegroup_snapshot_rm(self, inbuf, cmd):
316 return self.vc.remove_subvolume_group_snapshot(vol_name=cmd['vol_name'],
317 group_name=cmd['group_name'],
318 snap_name=cmd['snap_name'],
319 force=cmd.get('force', False))
320
321 def _cmd_fs_subvolumegroup_snapshot_ls(self, inbuf, cmd):
322 return self.vc.list_subvolume_group_snapshots(vol_name=cmd['vol_name'],
323 group_name=cmd['group_name'])
324
325 def _cmd_fs_subvolume_snapshot_create(self, inbuf, cmd):
326 return self.vc.create_subvolume_snapshot(vol_name=cmd['vol_name'],
327 sub_name=cmd['sub_name'],
328 snap_name=cmd['snap_name'],
329 group_name=cmd.get('group_name', None))
330
331 def _cmd_fs_subvolume_snapshot_rm(self, inbuf, cmd):
332 return self.vc.remove_subvolume_snapshot(vol_name=cmd['vol_name'],
333 sub_name=cmd['sub_name'],
334 snap_name=cmd['snap_name'],
335 group_name=cmd.get('group_name', None),
336 force=cmd.get('force', False))
337
338 def _cmd_fs_subvolume_snapshot_ls(self, inbuf, cmd):
339 return self.vc.list_subvolume_snapshots(vol_name=cmd['vol_name'],
340 sub_name=cmd['sub_name'],
341 group_name=cmd.get('group_name', None))
342
343 def _cmd_fs_subvolume_resize(self, inbuf, cmd):
344 return self.vc.resize_subvolume(vol_name=cmd['vol_name'], sub_name=cmd['sub_name'],
345 new_size=cmd['new_size'], group_name=cmd.get('group_name', None),
346 no_shrink=cmd.get('no_shrink', False))
347
348 def _cmd_fs_subvolume_snapshot_protect(self, inbuf, cmd):
349 return self.vc.protect_subvolume_snapshot(vol_name=cmd['vol_name'], sub_name=cmd['sub_name'],
350 snap_name=cmd['snap_name'], group_name=cmd.get('group_name', None))
351
352 def _cmd_fs_subvolume_snapshot_unprotect(self, inbuf, cmd):
353 return self.vc.unprotect_subvolume_snapshot(vol_name=cmd['vol_name'], sub_name=cmd['sub_name'],
354 snap_name=cmd['snap_name'], group_name=cmd.get('group_name', None))
355
356 def _cmd_fs_subvolume_snapshot_clone(self, inbuf, cmd):
357 return self.vc.clone_subvolume_snapshot(
358 vol_name=cmd['vol_name'], sub_name=cmd['sub_name'], snap_name=cmd['snap_name'],
359 group_name=cmd.get('group_name', None), pool_layout=cmd.get('pool_layout', None),
360 target_sub_name=cmd['target_sub_name'], target_group_name=cmd.get('target_group_name', None))
361
362 def _cmd_fs_clone_status(self, inbuf, cmd):
363 return self.vc.clone_status(
364 vol_name=cmd['vol_name'], clone_name=cmd['clone_name'], group_name=cmd.get('group_name', None))