]> git.proxmox.com Git - ceph.git/blame - ceph/src/pybind/mgr/volumes/module.py
import 15.2.5
[ceph.git] / ceph / src / pybind / mgr / volumes / module.py
CommitLineData
11fdf7f2
TL
1import errno
2import json
11fdf7f2
TL
3
4from mgr_module import MgrModule
5import orchestrator
6
81eedcae 7from .fs.volume import VolumeClient
f6b5b4d7 8from .fs.nfs import NFSCluster, FSExport
11fdf7f2 9
11fdf7f2
TL
10class 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'])