From: Ramana Raja Date: Sun, 14 Apr 2019 13:38:50 +0000 (+0530) Subject: mgr/volumes: use the fs_subvolume module X-Git-Tag: v15.1.0~2673^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9d273603b344aa30c114bbc2c58e25c92bcfa232;p=ceph.git mgr/volumes: use the fs_subvolume module ... instead of src/pybind/ceph_volume_client.py to manage CephFS subvolumes using `ceph fs subvolume` set of commands. Signed-off-by: Ramana Raja --- diff --git a/src/pybind/mgr/volumes/module.py b/src/pybind/mgr/volumes/module.py index 0b2588a86848..c1de44763d51 100644 --- a/src/pybind/mgr/volumes/module.py +++ b/src/pybind/mgr/volumes/module.py @@ -6,10 +6,11 @@ try: except ImportError: import Queue +import cephfs from mgr_module import MgrModule import orchestrator -from ceph_volume_client import CephFSVolumeClient, VolumePath +from .fs.subvolume import SubvolumePath, SubvolumeClient class PurgeJob(object): def __init__(self, volume_fscid, subvolume_path): @@ -47,15 +48,17 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule): 'cmd': 'fs subvolume create ' 'name=vol_name,type=CephString ' 'name=sub_name,type=CephString ' - 'name=size,type=CephString,req=false ', - 'desc': "Create a CephFS subvolume within an existing volume", + 'name=size,type=CephInt,req=false ', + 'desc': "Create a CephFS subvolume in a volume, and " + "optionally with a specific size(in bytes)", 'perm': 'rw' }, { 'cmd': 'fs subvolume rm ' 'name=vol_name,type=CephString ' - 'name=sub_name,type=CephString', - 'desc': "Delete a CephFS subvolume", + 'name=sub_name,type=CephString ' + 'name=force,type=CephBool,req=false ', + 'desc': "Delete a CephFS subvolume in a volume", 'perm': 'rw' }, @@ -210,6 +213,9 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule): return self._volume_get_fs(vol_name) is not None def _cmd_fs_subvolume_create(self, inbuf, cmd): + """ + :return: a 3-tuple of return code(int), empty string(str), error message (str) + """ vol_name = cmd['vol_name'] sub_name = cmd['sub_name'] @@ -217,39 +223,54 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule): if not self._volume_exists(vol_name): return -errno.ENOENT, "", \ - "Volume not found, create it with `ceph volume create` " \ - "before trying to create subvolumes" + "Volume '{0}' not found, create it with `ceph fs volume create` " \ + "before trying to create subvolumes".format(vol_name) # TODO: validate that subvol size fits in volume size - with CephFSVolumeClient(rados=self.rados, fs_name=vol_name) as vc: + with SubvolumeClient(self, fs_name=vol_name) as svc: # TODO: support real subvolume groups rather than just # always having them 1:1 with subvolumes. - vp = VolumePath(sub_name, sub_name) - - vc.create_volume(vp, size) + svp = SubvolumePath(sub_name, sub_name) + svc.create_subvolume(svp, size) return 0, "", "" def _cmd_fs_subvolume_rm(self, inbuf, cmd): + """ + :return: a 3-tuple of return code(int), empty string(str), error message (str) + """ vol_name = cmd['vol_name'] sub_name = cmd['sub_name'] + force = cmd.get('force', False) + fs = self._volume_get_fs(vol_name) if fs is None: - return 0, "", "Volume '{0}' already deleted".format(vol_name) + if force: + return 0, "", "" + else: + return -errno.ENOENT, "", \ + "Volume '{0}' not found, cannot remove subvolume '{1}'".format(vol_name, sub_name) vol_fscid = fs['id'] - with CephFSVolumeClient(rados=self.rados, fs_name=vol_name) as vc: + with SubvolumeClient(self, fs_name=vol_name) as svc: # TODO: support real subvolume groups rather than just # always having them 1:1 with subvolumes. - vp = VolumePath(sub_name, sub_name) - - vc.delete_volume(vp) - - # TODO: create a progress event - self._background_jobs.put(PurgeJob(vol_fscid, vp)) + svp = SubvolumePath(sub_name, sub_name) + try: + svc.delete_subvolume(svp) + except cephfs.ObjectNotFound: + if force: + return 0, "", "" + else: + return -errno.ENOENT, "", \ + "Subvolume '{0}' not found, cannot remove it".format(sub_name) + svc.purge_subvolume(svp) + + # TODO: purge subvolume asynchronously + # self._background_jobs.put(PurgeJob(vol_fscid, svp)) return 0, "", ""