]>
Commit | Line | Data |
---|---|---|
11fdf7f2 TL |
1 | import errno |
2 | import json | |
11fdf7f2 TL |
3 | |
4 | from mgr_module import MgrModule | |
5 | import orchestrator | |
6 | ||
81eedcae | 7 | from .fs.volume import VolumeClient |
f6b5b4d7 | 8 | from .fs.nfs import NFSCluster, FSExport |
11fdf7f2 | 9 | |
11fdf7f2 TL |
10 | class Module(orchestrator.OrchestratorClientMixin, MgrModule): |
11 | COMMANDS = [ | |
12 | { | |
13 | 'cmd': 'fs volume ls', | |
14 | 'desc': "List volumes", | |
15 | 'perm': 'r' | |
16 | }, | |
17 | { | |
18 | 'cmd': 'fs volume create ' | |
9f95a23c TL |
19 | 'name=name,type=CephString ' |
20 | 'name=placement,type=CephString,req=false ', | |
11fdf7f2 TL |
21 | 'desc': "Create a CephFS volume", |
22 | 'perm': 'rw' | |
23 | }, | |
24 | { | |
25 | 'cmd': 'fs volume rm ' | |
eafe8130 TL |
26 | 'name=vol_name,type=CephString ' |
27 | 'name=yes-i-really-mean-it,type=CephString,req=false ', | |
28 | 'desc': "Delete a FS volume by passing --yes-i-really-mean-it flag", | |
11fdf7f2 TL |
29 | 'perm': 'rw' |
30 | }, | |
eafe8130 TL |
31 | { |
32 | 'cmd': 'fs subvolumegroup ls ' | |
33 | 'name=vol_name,type=CephString ', | |
34 | 'desc': "List subvolumegroups", | |
35 | 'perm': 'r' | |
36 | }, | |
81eedcae TL |
37 | { |
38 | 'cmd': 'fs subvolumegroup create ' | |
39 | 'name=vol_name,type=CephString ' | |
40 | 'name=group_name,type=CephString ' | |
41 | 'name=pool_layout,type=CephString,req=false ' | |
92f5a8d4 TL |
42 | 'name=uid,type=CephInt,req=false ' |
43 | 'name=gid,type=CephInt,req=false ' | |
81eedcae TL |
44 | 'name=mode,type=CephString,req=false ', |
45 | 'desc': "Create a CephFS subvolume group in a volume, and optionally, " | |
46 | "with a specific data pool layout, and a specific numeric mode", | |
47 | 'perm': 'rw' | |
48 | }, | |
49 | { | |
50 | 'cmd': 'fs subvolumegroup rm ' | |
51 | 'name=vol_name,type=CephString ' | |
52 | 'name=group_name,type=CephString ' | |
53 | 'name=force,type=CephBool,req=false ', | |
54 | 'desc': "Delete a CephFS subvolume group in a volume", | |
55 | 'perm': 'rw' | |
56 | }, | |
eafe8130 TL |
57 | { |
58 | 'cmd': 'fs subvolume ls ' | |
59 | 'name=vol_name,type=CephString ' | |
60 | 'name=group_name,type=CephString,req=false ', | |
61 | 'desc': "List subvolumes", | |
62 | 'perm': 'r' | |
63 | }, | |
11fdf7f2 TL |
64 | { |
65 | 'cmd': 'fs subvolume create ' | |
66 | 'name=vol_name,type=CephString ' | |
67 | 'name=sub_name,type=CephString ' | |
81eedcae TL |
68 | 'name=size,type=CephInt,req=false ' |
69 | 'name=group_name,type=CephString,req=false ' | |
70 | 'name=pool_layout,type=CephString,req=false ' | |
92f5a8d4 TL |
71 | 'name=uid,type=CephInt,req=false ' |
72 | 'name=gid,type=CephInt,req=false ' | |
e306af50 TL |
73 | 'name=mode,type=CephString,req=false ' |
74 | 'name=namespace_isolated,type=CephBool,req=false ', | |
81eedcae TL |
75 | 'desc': "Create a CephFS subvolume in a volume, and optionally, " |
76 | "with a specific size (in bytes), a specific data pool layout, " | |
e306af50 TL |
77 | "a specific mode, in a specific subvolume group and in separate " |
78 | "RADOS namespace", | |
11fdf7f2 TL |
79 | 'perm': 'rw' |
80 | }, | |
81 | { | |
82 | 'cmd': 'fs subvolume rm ' | |
83 | 'name=vol_name,type=CephString ' | |
81eedcae TL |
84 | 'name=sub_name,type=CephString ' |
85 | 'name=group_name,type=CephString,req=false ' | |
86 | 'name=force,type=CephBool,req=false ', | |
87 | 'desc': "Delete a CephFS subvolume in a volume, and optionally, " | |
88 | "in a specific subvolume group", | |
89 | 'perm': 'rw' | |
90 | }, | |
494da23a TL |
91 | { |
92 | 'cmd': 'fs subvolumegroup getpath ' | |
93 | 'name=vol_name,type=CephString ' | |
94 | 'name=group_name,type=CephString ', | |
95 | 'desc': "Get the mountpath of a CephFS subvolume group in a volume", | |
96 | 'perm': 'r' | |
97 | }, | |
81eedcae TL |
98 | { |
99 | 'cmd': 'fs subvolume getpath ' | |
100 | 'name=vol_name,type=CephString ' | |
101 | 'name=sub_name,type=CephString ' | |
102 | 'name=group_name,type=CephString,req=false ', | |
103 | 'desc': "Get the mountpath of a CephFS subvolume in a volume, " | |
104 | "and optionally, in a specific subvolume group", | |
105 | 'perm': 'rw' | |
106 | }, | |
1911f103 TL |
107 | { |
108 | 'cmd': 'fs subvolume info ' | |
109 | 'name=vol_name,type=CephString ' | |
110 | 'name=sub_name,type=CephString ' | |
111 | 'name=group_name,type=CephString,req=false ', | |
112 | 'desc': "Get the metadata of a CephFS subvolume in a volume, " | |
113 | "and optionally, in a specific subvolume group", | |
114 | 'perm': 'r' | |
115 | }, | |
f6b5b4d7 TL |
116 | { |
117 | 'cmd': 'fs subvolumegroup pin' | |
118 | ' name=vol_name,type=CephString' | |
119 | ' name=group_name,type=CephString,req=true' | |
120 | ' name=pin_type,type=CephChoices,strings=export|distributed|random' | |
121 | ' name=pin_setting,type=CephString,req=true', | |
122 | 'desc': "Set MDS pinning policy for subvolumegroup", | |
123 | 'perm': 'rw' | |
124 | }, | |
eafe8130 TL |
125 | { |
126 | 'cmd': 'fs subvolumegroup snapshot ls ' | |
127 | 'name=vol_name,type=CephString ' | |
128 | 'name=group_name,type=CephString ', | |
129 | 'desc': "List subvolumegroup snapshots", | |
130 | 'perm': 'r' | |
131 | }, | |
81eedcae TL |
132 | { |
133 | 'cmd': 'fs subvolumegroup snapshot create ' | |
134 | 'name=vol_name,type=CephString ' | |
135 | 'name=group_name,type=CephString ' | |
136 | 'name=snap_name,type=CephString ', | |
137 | 'desc': "Create a snapshot of a CephFS subvolume group in a volume", | |
138 | 'perm': 'rw' | |
139 | }, | |
140 | { | |
141 | 'cmd': 'fs subvolumegroup snapshot rm ' | |
142 | 'name=vol_name,type=CephString ' | |
143 | 'name=group_name,type=CephString ' | |
144 | 'name=snap_name,type=CephString ' | |
145 | 'name=force,type=CephBool,req=false ', | |
146 | 'desc': "Delete a snapshot of a CephFS subvolume group in a volume", | |
147 | 'perm': 'rw' | |
148 | }, | |
eafe8130 TL |
149 | { |
150 | 'cmd': 'fs subvolume snapshot ls ' | |
151 | 'name=vol_name,type=CephString ' | |
152 | 'name=sub_name,type=CephString ' | |
153 | 'name=group_name,type=CephString,req=false ', | |
154 | 'desc': "List subvolume snapshots", | |
155 | 'perm': 'r' | |
156 | }, | |
81eedcae TL |
157 | { |
158 | 'cmd': 'fs subvolume snapshot create ' | |
159 | 'name=vol_name,type=CephString ' | |
160 | 'name=sub_name,type=CephString ' | |
161 | 'name=snap_name,type=CephString ' | |
162 | 'name=group_name,type=CephString,req=false ', | |
163 | 'desc': "Create a snapshot of a CephFS subvolume in a volume, " | |
164 | "and optionally, in a specific subvolume group", | |
165 | 'perm': 'rw' | |
166 | }, | |
e306af50 TL |
167 | { |
168 | 'cmd': 'fs subvolume snapshot info ' | |
169 | 'name=vol_name,type=CephString ' | |
170 | 'name=sub_name,type=CephString ' | |
171 | 'name=snap_name,type=CephString ' | |
172 | 'name=group_name,type=CephString,req=false ', | |
173 | 'desc': "Get the metadata of a CephFS subvolume snapshot " | |
174 | "and optionally, in a specific subvolume group", | |
175 | 'perm': 'r' | |
176 | }, | |
81eedcae TL |
177 | { |
178 | 'cmd': 'fs subvolume snapshot rm ' | |
179 | 'name=vol_name,type=CephString ' | |
180 | 'name=sub_name,type=CephString ' | |
181 | 'name=snap_name,type=CephString ' | |
182 | 'name=group_name,type=CephString,req=false ' | |
183 | 'name=force,type=CephBool,req=false ', | |
184 | 'desc': "Delete a snapshot of a CephFS subvolume in a volume, " | |
185 | "and optionally, in a specific subvolume group", | |
11fdf7f2 TL |
186 | 'perm': 'rw' |
187 | }, | |
92f5a8d4 TL |
188 | { |
189 | 'cmd': 'fs subvolume resize ' | |
190 | 'name=vol_name,type=CephString ' | |
191 | 'name=sub_name,type=CephString ' | |
192 | 'name=new_size,type=CephString,req=true ' | |
193 | 'name=group_name,type=CephString,req=false ' | |
194 | 'name=no_shrink,type=CephBool,req=false ', | |
195 | 'desc': "Resize a CephFS subvolume", | |
196 | 'perm': 'rw' | |
197 | }, | |
f6b5b4d7 TL |
198 | { |
199 | 'cmd': 'fs subvolume pin' | |
200 | ' name=vol_name,type=CephString' | |
201 | ' name=sub_name,type=CephString' | |
202 | ' name=pin_type,type=CephChoices,strings=export|distributed|random' | |
203 | ' name=pin_setting,type=CephString,req=true' | |
204 | ' name=group_name,type=CephString,req=false', | |
205 | 'desc': "Set MDS pinning policy for subvolume", | |
206 | 'perm': 'rw' | |
207 | }, | |
92f5a8d4 TL |
208 | { |
209 | 'cmd': 'fs subvolume snapshot protect ' | |
210 | 'name=vol_name,type=CephString ' | |
211 | 'name=sub_name,type=CephString ' | |
212 | 'name=snap_name,type=CephString ' | |
213 | 'name=group_name,type=CephString,req=false ', | |
f6b5b4d7 | 214 | 'desc': "(deprecated) Protect snapshot of a CephFS subvolume in a volume, " |
92f5a8d4 TL |
215 | "and optionally, in a specific subvolume group", |
216 | 'perm': 'rw' | |
217 | }, | |
218 | { | |
219 | 'cmd': 'fs subvolume snapshot unprotect ' | |
220 | 'name=vol_name,type=CephString ' | |
221 | 'name=sub_name,type=CephString ' | |
222 | 'name=snap_name,type=CephString ' | |
223 | 'name=group_name,type=CephString,req=false ', | |
f6b5b4d7 | 224 | 'desc': "(deprecated) Unprotect a snapshot of a CephFS subvolume in a volume, " |
92f5a8d4 TL |
225 | "and optionally, in a specific subvolume group", |
226 | 'perm': 'rw' | |
227 | }, | |
228 | { | |
229 | 'cmd': 'fs subvolume snapshot clone ' | |
230 | 'name=vol_name,type=CephString ' | |
231 | 'name=sub_name,type=CephString ' | |
232 | 'name=snap_name,type=CephString ' | |
233 | 'name=target_sub_name,type=CephString ' | |
234 | 'name=pool_layout,type=CephString,req=false ' | |
235 | 'name=group_name,type=CephString,req=false ' | |
236 | 'name=target_group_name,type=CephString,req=false ', | |
237 | 'desc': "Clone a snapshot to target subvolume", | |
238 | 'perm': 'rw' | |
239 | }, | |
240 | { | |
241 | 'cmd': 'fs clone status ' | |
242 | 'name=vol_name,type=CephString ' | |
243 | 'name=clone_name,type=CephString ' | |
244 | 'name=group_name,type=CephString,req=false ', | |
245 | 'desc': "Get status on a cloned subvolume.", | |
246 | 'perm': 'r' | |
247 | }, | |
9f95a23c TL |
248 | { |
249 | 'cmd': 'fs clone cancel ' | |
250 | 'name=vol_name,type=CephString ' | |
251 | 'name=clone_name,type=CephString ' | |
252 | 'name=group_name,type=CephString,req=false ', | |
253 | 'desc': "Cancel an pending or ongoing clone operation.", | |
254 | 'perm': 'r' | |
255 | }, | |
f6b5b4d7 TL |
256 | { |
257 | 'cmd': 'nfs export create cephfs ' | |
258 | 'name=fsname,type=CephString ' | |
259 | 'name=clusterid,type=CephString ' | |
260 | 'name=binding,type=CephString ' | |
261 | 'name=readonly,type=CephBool,req=false ' | |
262 | 'name=path,type=CephString,req=false ', | |
263 | 'desc': "Create a cephfs export", | |
264 | 'perm': 'rw' | |
265 | }, | |
266 | { | |
267 | 'cmd': 'nfs export delete ' | |
268 | 'name=clusterid,type=CephString ' | |
269 | 'name=binding,type=CephString ', | |
270 | 'desc': "Delete a cephfs export", | |
271 | 'perm': 'rw' | |
272 | }, | |
273 | { | |
274 | 'cmd': 'nfs export ls ' | |
275 | 'name=clusterid,type=CephString ' | |
276 | 'name=detailed,type=CephBool,req=false ', | |
277 | 'desc': "List exports of a NFS cluster", | |
278 | 'perm': 'r' | |
279 | }, | |
280 | { | |
281 | 'cmd': 'nfs export get ' | |
282 | 'name=clusterid,type=CephString ' | |
283 | 'name=binding,type=CephString ', | |
284 | 'desc': "Fetch a export of a NFS cluster given the pseudo path/binding", | |
285 | 'perm': 'r' | |
286 | }, | |
287 | { | |
288 | 'cmd': 'nfs cluster create ' | |
289 | 'name=type,type=CephString ' | |
290 | 'name=clusterid,type=CephString,goodchars=[A-Za-z0-9-_.] ' | |
291 | 'name=placement,type=CephString,req=false ', | |
292 | 'desc': "Create an NFS Cluster", | |
293 | 'perm': 'rw' | |
294 | }, | |
295 | { | |
296 | 'cmd': 'nfs cluster update ' | |
297 | 'name=clusterid,type=CephString ' | |
298 | 'name=placement,type=CephString ', | |
299 | 'desc': "Updates an NFS Cluster", | |
300 | 'perm': 'rw' | |
301 | }, | |
302 | { | |
303 | 'cmd': 'nfs cluster delete ' | |
304 | 'name=clusterid,type=CephString ', | |
305 | 'desc': "Deletes an NFS Cluster", | |
306 | 'perm': 'rw' | |
307 | }, | |
308 | { | |
309 | 'cmd': 'nfs cluster ls ', | |
310 | 'desc': "List NFS Clusters", | |
311 | 'perm': 'r' | |
312 | }, | |
313 | { | |
314 | 'cmd': 'nfs cluster info ' | |
315 | 'name=clusterid,type=CephString,req=false ', | |
316 | 'desc': "Displays NFS Cluster info", | |
317 | 'perm': 'r' | |
318 | }, | |
319 | { | |
320 | 'cmd': 'nfs cluster config set ' | |
321 | 'name=clusterid,type=CephString ', | |
322 | 'desc': "Set NFS-Ganesha config by `-i <config_file>`", | |
323 | 'perm': 'rw' | |
324 | }, | |
325 | { | |
326 | 'cmd': 'nfs cluster config reset ' | |
327 | 'name=clusterid,type=CephString ', | |
328 | 'desc': "Reset NFS-Ganesha Config to default", | |
329 | 'perm': 'rw' | |
330 | }, | |
11fdf7f2 TL |
331 | # volume ls [recursive] |
332 | # subvolume ls <volume> | |
333 | # volume authorize/deauthorize | |
334 | # subvolume authorize/deauthorize | |
335 | ||
336 | # volume describe (free space, etc) | |
337 | # volume auth list (vc.get_authorized_ids) | |
338 | ||
339 | # snapshots? | |
340 | ||
341 | # FIXME: we're doing CephFSVolumeClient.recover on every | |
342 | # path where we instantiate and connect a client. Perhaps | |
343 | # keep clients alive longer, or just pass a "don't recover" | |
344 | # flag in if it's the >1st time we connected a particular | |
345 | # volume in the lifetime of this module instance. | |
346 | ] | |
347 | ||
348 | def __init__(self, *args, **kwargs): | |
349 | super(Module, self).__init__(*args, **kwargs) | |
81eedcae | 350 | self.vc = VolumeClient(self) |
f6b5b4d7 TL |
351 | self.fs_export = FSExport(self) |
352 | self.nfs = NFSCluster(self) | |
11fdf7f2 | 353 | |
92f5a8d4 TL |
354 | def __del__(self): |
355 | self.vc.shutdown() | |
11fdf7f2 | 356 | |
92f5a8d4 TL |
357 | def shutdown(self): |
358 | self.vc.shutdown() | |
11fdf7f2 TL |
359 | |
360 | def handle_command(self, inbuf, cmd): | |
11fdf7f2 TL |
361 | handler_name = "_cmd_" + cmd['prefix'].replace(" ", "_") |
362 | try: | |
363 | handler = getattr(self, handler_name) | |
364 | except AttributeError: | |
365 | return -errno.EINVAL, "", "Unknown command" | |
366 | ||
367 | return handler(inbuf, cmd) | |
368 | ||
11fdf7f2 | 369 | def _cmd_fs_volume_create(self, inbuf, cmd): |
81eedcae | 370 | vol_id = cmd['name'] |
9f95a23c TL |
371 | placement = cmd.get('placement', '') |
372 | return self.vc.create_fs_volume(vol_id, placement) | |
11fdf7f2 | 373 | |
81eedcae | 374 | def _cmd_fs_volume_rm(self, inbuf, cmd): |
11fdf7f2 | 375 | vol_name = cmd['vol_name'] |
eafe8130 | 376 | confirm = cmd.get('yes-i-really-mean-it', None) |
92f5a8d4 | 377 | return self.vc.delete_fs_volume(vol_name, confirm) |
11fdf7f2 | 378 | |
81eedcae | 379 | def _cmd_fs_volume_ls(self, inbuf, cmd): |
92f5a8d4 | 380 | return self.vc.list_fs_volumes() |
11fdf7f2 | 381 | |
81eedcae TL |
382 | def _cmd_fs_subvolumegroup_create(self, inbuf, cmd): |
383 | """ | |
384 | :return: a 3-tuple of return code(int), empty string(str), error message (str) | |
385 | """ | |
494da23a | 386 | return self.vc.create_subvolume_group( |
92f5a8d4 TL |
387 | vol_name=cmd['vol_name'], group_name=cmd['group_name'], |
388 | pool_layout=cmd.get('pool_layout', None), mode=cmd.get('mode', '755'), | |
389 | uid=cmd.get('uid', None), gid=cmd.get('gid', None)) | |
11fdf7f2 | 390 | |
81eedcae TL |
391 | def _cmd_fs_subvolumegroup_rm(self, inbuf, cmd): |
392 | """ | |
393 | :return: a 3-tuple of return code(int), empty string(str), error message (str) | |
394 | """ | |
92f5a8d4 | 395 | return self.vc.remove_subvolume_group(vol_name=cmd['vol_name'], |
494da23a TL |
396 | group_name=cmd['group_name'], |
397 | force=cmd.get('force', False)) | |
11fdf7f2 | 398 | |
eafe8130 | 399 | def _cmd_fs_subvolumegroup_ls(self, inbuf, cmd): |
92f5a8d4 | 400 | return self.vc.list_subvolume_groups(vol_name=cmd['vol_name']) |
eafe8130 | 401 | |
81eedcae TL |
402 | def _cmd_fs_subvolume_create(self, inbuf, cmd): |
403 | """ | |
404 | :return: a 3-tuple of return code(int), empty string(str), error message (str) | |
405 | """ | |
92f5a8d4 | 406 | return self.vc.create_subvolume(vol_name=cmd['vol_name'], |
494da23a TL |
407 | sub_name=cmd['sub_name'], |
408 | group_name=cmd.get('group_name', None), | |
409 | size=cmd.get('size', None), | |
410 | pool_layout=cmd.get('pool_layout', None), | |
92f5a8d4 TL |
411 | uid=cmd.get('uid', None), |
412 | gid=cmd.get('gid', None), | |
e306af50 TL |
413 | mode=cmd.get('mode', '755'), |
414 | namespace_isolated=cmd.get('namespace_isolated', False)) | |
11fdf7f2 TL |
415 | |
416 | def _cmd_fs_subvolume_rm(self, inbuf, cmd): | |
81eedcae TL |
417 | """ |
418 | :return: a 3-tuple of return code(int), empty string(str), error message (str) | |
419 | """ | |
92f5a8d4 | 420 | return self.vc.remove_subvolume(vol_name=cmd['vol_name'], |
494da23a TL |
421 | sub_name=cmd['sub_name'], |
422 | group_name=cmd.get('group_name', None), | |
423 | force=cmd.get('force', False)) | |
11fdf7f2 | 424 | |
eafe8130 | 425 | def _cmd_fs_subvolume_ls(self, inbuf, cmd): |
92f5a8d4 | 426 | return self.vc.list_subvolumes(vol_name=cmd['vol_name'], |
eafe8130 TL |
427 | group_name=cmd.get('group_name', None)) |
428 | ||
494da23a TL |
429 | def _cmd_fs_subvolumegroup_getpath(self, inbuf, cmd): |
430 | return self.vc.getpath_subvolume_group( | |
92f5a8d4 | 431 | vol_name=cmd['vol_name'], group_name=cmd['group_name']) |
11fdf7f2 | 432 | |
81eedcae | 433 | def _cmd_fs_subvolume_getpath(self, inbuf, cmd): |
92f5a8d4 | 434 | return self.vc.subvolume_getpath(vol_name=cmd['vol_name'], |
494da23a TL |
435 | sub_name=cmd['sub_name'], |
436 | group_name=cmd.get('group_name', None)) | |
11fdf7f2 | 437 | |
1911f103 TL |
438 | def _cmd_fs_subvolume_info(self, inbuf, cmd): |
439 | return self.vc.subvolume_info(vol_name=cmd['vol_name'], | |
440 | sub_name=cmd['sub_name'], | |
441 | group_name=cmd.get('group_name', None)) | |
442 | ||
f6b5b4d7 TL |
443 | def _cmd_fs_subvolumegroup_pin(self, inbuf, cmd): |
444 | return self.vc.pin_subvolume_group(vol_name=cmd['vol_name'], | |
445 | group_name=cmd['group_name'], pin_type=cmd['pin_type'], | |
446 | pin_setting=cmd['pin_setting']) | |
447 | ||
81eedcae | 448 | def _cmd_fs_subvolumegroup_snapshot_create(self, inbuf, cmd): |
92f5a8d4 | 449 | return self.vc.create_subvolume_group_snapshot(vol_name=cmd['vol_name'], |
494da23a TL |
450 | group_name=cmd['group_name'], |
451 | snap_name=cmd['snap_name']) | |
11fdf7f2 | 452 | |
81eedcae | 453 | def _cmd_fs_subvolumegroup_snapshot_rm(self, inbuf, cmd): |
92f5a8d4 | 454 | return self.vc.remove_subvolume_group_snapshot(vol_name=cmd['vol_name'], |
494da23a TL |
455 | group_name=cmd['group_name'], |
456 | snap_name=cmd['snap_name'], | |
457 | force=cmd.get('force', False)) | |
11fdf7f2 | 458 | |
eafe8130 | 459 | def _cmd_fs_subvolumegroup_snapshot_ls(self, inbuf, cmd): |
92f5a8d4 | 460 | return self.vc.list_subvolume_group_snapshots(vol_name=cmd['vol_name'], |
eafe8130 TL |
461 | group_name=cmd['group_name']) |
462 | ||
81eedcae | 463 | def _cmd_fs_subvolume_snapshot_create(self, inbuf, cmd): |
92f5a8d4 | 464 | return self.vc.create_subvolume_snapshot(vol_name=cmd['vol_name'], |
494da23a TL |
465 | sub_name=cmd['sub_name'], |
466 | snap_name=cmd['snap_name'], | |
467 | group_name=cmd.get('group_name', None)) | |
11fdf7f2 | 468 | |
81eedcae | 469 | def _cmd_fs_subvolume_snapshot_rm(self, inbuf, cmd): |
92f5a8d4 | 470 | return self.vc.remove_subvolume_snapshot(vol_name=cmd['vol_name'], |
494da23a TL |
471 | sub_name=cmd['sub_name'], |
472 | snap_name=cmd['snap_name'], | |
473 | group_name=cmd.get('group_name', None), | |
474 | force=cmd.get('force', False)) | |
eafe8130 | 475 | |
e306af50 TL |
476 | def _cmd_fs_subvolume_snapshot_info(self, inbuf, cmd): |
477 | return self.vc.subvolume_snapshot_info(vol_name=cmd['vol_name'], | |
478 | sub_name=cmd['sub_name'], | |
479 | snap_name=cmd['snap_name'], | |
480 | group_name=cmd.get('group_name', None)) | |
481 | ||
eafe8130 | 482 | def _cmd_fs_subvolume_snapshot_ls(self, inbuf, cmd): |
92f5a8d4 | 483 | return self.vc.list_subvolume_snapshots(vol_name=cmd['vol_name'], |
eafe8130 TL |
484 | sub_name=cmd['sub_name'], |
485 | group_name=cmd.get('group_name', None)) | |
92f5a8d4 TL |
486 | |
487 | def _cmd_fs_subvolume_resize(self, inbuf, cmd): | |
488 | return self.vc.resize_subvolume(vol_name=cmd['vol_name'], sub_name=cmd['sub_name'], | |
489 | new_size=cmd['new_size'], group_name=cmd.get('group_name', None), | |
490 | no_shrink=cmd.get('no_shrink', False)) | |
491 | ||
f6b5b4d7 TL |
492 | def _cmd_fs_subvolume_pin(self, inbuf, cmd): |
493 | return self.vc.subvolume_pin(vol_name=cmd['vol_name'], | |
494 | sub_name=cmd['sub_name'], pin_type=cmd['pin_type'], | |
495 | pin_setting=cmd['pin_setting'], | |
496 | group_name=cmd.get('group_name', None)) | |
497 | ||
92f5a8d4 TL |
498 | def _cmd_fs_subvolume_snapshot_protect(self, inbuf, cmd): |
499 | return self.vc.protect_subvolume_snapshot(vol_name=cmd['vol_name'], sub_name=cmd['sub_name'], | |
500 | snap_name=cmd['snap_name'], group_name=cmd.get('group_name', None)) | |
501 | ||
502 | def _cmd_fs_subvolume_snapshot_unprotect(self, inbuf, cmd): | |
503 | return self.vc.unprotect_subvolume_snapshot(vol_name=cmd['vol_name'], sub_name=cmd['sub_name'], | |
504 | snap_name=cmd['snap_name'], group_name=cmd.get('group_name', None)) | |
505 | ||
506 | def _cmd_fs_subvolume_snapshot_clone(self, inbuf, cmd): | |
507 | return self.vc.clone_subvolume_snapshot( | |
508 | vol_name=cmd['vol_name'], sub_name=cmd['sub_name'], snap_name=cmd['snap_name'], | |
509 | group_name=cmd.get('group_name', None), pool_layout=cmd.get('pool_layout', None), | |
510 | target_sub_name=cmd['target_sub_name'], target_group_name=cmd.get('target_group_name', None)) | |
511 | ||
512 | def _cmd_fs_clone_status(self, inbuf, cmd): | |
513 | return self.vc.clone_status( | |
514 | vol_name=cmd['vol_name'], clone_name=cmd['clone_name'], group_name=cmd.get('group_name', None)) | |
9f95a23c TL |
515 | |
516 | def _cmd_fs_clone_cancel(self, inbuf, cmd): | |
517 | return self.vc.clone_cancel( | |
518 | vol_name=cmd['vol_name'], clone_name=cmd['clone_name'], group_name=cmd.get('group_name', None)) | |
f6b5b4d7 TL |
519 | |
520 | def _cmd_nfs_export_create_cephfs(self, inbuf, cmd): | |
521 | #TODO Extend export creation for rgw. | |
522 | return self.fs_export.create_export(fs_name=cmd['fsname'], cluster_id=cmd['clusterid'], | |
523 | pseudo_path=cmd['binding'], read_only=cmd.get('readonly', False), path=cmd.get('path', '/')) | |
524 | ||
525 | def _cmd_nfs_export_delete(self, inbuf, cmd): | |
526 | return self.fs_export.delete_export(cluster_id=cmd['clusterid'], pseudo_path=cmd['binding']) | |
527 | ||
528 | def _cmd_nfs_export_ls(self, inbuf, cmd): | |
529 | return self.fs_export.list_exports(cluster_id=cmd['clusterid'], detailed=cmd.get('detailed', False)) | |
530 | ||
531 | def _cmd_nfs_export_get(self, inbuf, cmd): | |
532 | return self.fs_export.get_export(cluster_id=cmd['clusterid'], pseudo_path=cmd['binding']) | |
533 | ||
534 | def _cmd_nfs_cluster_create(self, inbuf, cmd): | |
535 | return self.nfs.create_nfs_cluster(cluster_id=cmd['clusterid'], export_type=cmd['type'], | |
536 | placement=cmd.get('placement', None)) | |
537 | ||
538 | def _cmd_nfs_cluster_update(self, inbuf, cmd): | |
539 | return self.nfs.update_nfs_cluster(cluster_id=cmd['clusterid'], placement=cmd['placement']) | |
540 | ||
541 | def _cmd_nfs_cluster_delete(self, inbuf, cmd): | |
542 | return self.nfs.delete_nfs_cluster(cluster_id=cmd['clusterid']) | |
543 | ||
544 | def _cmd_nfs_cluster_ls(self, inbuf, cmd): | |
545 | return self.nfs.list_nfs_cluster() | |
546 | ||
547 | def _cmd_nfs_cluster_info(self, inbuf, cmd): | |
548 | return self.nfs.show_nfs_cluster_info(cluster_id=cmd.get('clusterid', None)) | |
549 | ||
550 | def _cmd_nfs_cluster_config_set(self, inbuf, cmd): | |
551 | return self.nfs.set_nfs_cluster_config(cluster_id=cmd['clusterid'], nfs_config=inbuf) | |
552 | ||
553 | def _cmd_nfs_cluster_config_reset(self, inbuf, cmd): | |
554 | return self.nfs.reset_nfs_cluster_config(cluster_id=cmd['clusterid']) |