From 4674e6aa0de4ac56619c6e4b5e18fff109560372 Mon Sep 17 00:00:00 2001 From: Kotresh HR Date: Thu, 14 Apr 2022 12:11:41 +0530 Subject: [PATCH] mgr/volumes: Add subvolumegroup resize cmd Fixes: https://tracker.ceph.com/issues/53509 Signed-off-by: Kotresh HR (cherry picked from commit 346964a89ce3b1ad80f8513387e7d84b036016b5) --- src/pybind/mgr/volumes/fs/operations/group.py | 34 +++++++++++++++++++ src/pybind/mgr/volumes/fs/volume.py | 19 +++++++++++ src/pybind/mgr/volumes/module.py | 15 ++++++++ 3 files changed, 68 insertions(+) diff --git a/src/pybind/mgr/volumes/fs/operations/group.py b/src/pybind/mgr/volumes/fs/operations/group.py index cab7e26178252..d64e7fcdb3e84 100644 --- a/src/pybind/mgr/volumes/fs/operations/group.py +++ b/src/pybind/mgr/volumes/fs/operations/group.py @@ -115,6 +115,40 @@ class Group(GroupTemplate): 'bytes_used': int(usedbytes), 'bytes_pcent': "undefined" if nsize == 0 else '{0:.2f}'.format((float(usedbytes) / nsize) * 100.0)} + def resize(self, newsize, noshrink): + try: + newsize = int(newsize) + if newsize <= 0: + raise VolumeException(-errno.EINVAL, "Invalid subvolume group size") + except ValueError: + newsize = newsize.lower() + if not (newsize == "inf" or newsize == "infinite"): + raise (VolumeException(-errno.EINVAL, "invalid size option '{0}'".format(newsize))) + newsize = 0 + noshrink = False + + try: + maxbytes = int(self.fs.getxattr(self.path, 'ceph.quota.max_bytes').decode('utf-8')) + except cephfs.NoData: + maxbytes = 0 + except cephfs.Error as e: + raise VolumeException(-e.args[0], e.args[1]) + + group_stat = self.fs.stat(self.path) + if newsize > 0 and newsize < group_stat.st_size: + if noshrink: + raise VolumeException(-errno.EINVAL, "Can't resize the subvolume group. The new size" + " '{0}' would be lesser than the current used size '{1}'" + .format(newsize, group_stat.st_size)) + + if not newsize == maxbytes: + try: + self.fs.setxattr(self.path, 'ceph.quota.max_bytes', str(newsize).encode('utf-8'), 0) + except cephfs.Error as e: + raise (VolumeException(-e.args[0], + "Cannot set new size for the subvolume group. '{0}'".format(e.args[1]))) + return newsize, group_stat.st_size + def set_group_attrs(fs, path, attrs): # set subvolume group attrs # set size diff --git a/src/pybind/mgr/volumes/fs/volume.py b/src/pybind/mgr/volumes/fs/volume.py index 285a7afa51527..9678602cda22c 100644 --- a/src/pybind/mgr/volumes/fs/volume.py +++ b/src/pybind/mgr/volumes/fs/volume.py @@ -709,6 +709,25 @@ class VolumeClient(CephfsClient["Module"]): ret = self.volume_exception_to_retval(ve) return ret + def resize_subvolume_group(self, **kwargs): + ret = 0, "", "" + volname = kwargs['vol_name'] + groupname = kwargs['group_name'] + newsize = kwargs['new_size'] + noshrink = kwargs['no_shrink'] + + try: + with open_volume(self, volname) as fs_handle: + with open_group(fs_handle, self.volspec, groupname) as group: + nsize, usedbytes = group.resize(newsize, noshrink) + ret = 0, json.dumps( + [{'bytes_used': usedbytes},{'bytes_quota': nsize}, + {'bytes_pcent': "undefined" if nsize == 0 else '{0:.2f}'.format((float(usedbytes) / nsize) * 100.0)}], + indent=4, sort_keys=True), "" + except VolumeException as ve: + ret = self.volume_exception_to_retval(ve) + return ret + def getpath_subvolume_group(self, **kwargs): volname = kwargs['vol_name'] groupname = kwargs['group_name'] diff --git a/src/pybind/mgr/volumes/module.py b/src/pybind/mgr/volumes/module.py index ee1c7d607d72e..dab0a9f6954a1 100644 --- a/src/pybind/mgr/volumes/module.py +++ b/src/pybind/mgr/volumes/module.py @@ -89,6 +89,15 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule): 'desc': "Get the metadata of a CephFS subvolume group in a volume, ", 'perm': 'r' }, + { + 'cmd': 'fs subvolumegroup resize ' + 'name=vol_name,type=CephString ' + 'name=group_name,type=CephString ' + 'name=new_size,type=CephString,req=true ' + 'name=no_shrink,type=CephBool,req=false ', + 'desc': "Resize a CephFS subvolume group", + 'perm': 'rw' + }, { 'cmd': 'fs subvolume ls ' 'name=vol_name,type=CephString ' @@ -485,6 +494,12 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule): group_name=cmd['group_name']) @mgr_cmd_wrap + def _cmd_fs_subvolumegroup_resize(self, inbuf, cmd): + return self.vc.resize_subvolume_group(vol_name=cmd['vol_name'], + group_name=cmd['group_name'], + new_size=cmd['new_size'], + no_shrink=cmd.get('no_shrink', False)) + @mgr_cmd_wrap def _cmd_fs_subvolumegroup_ls(self, inbuf, cmd): return self.vc.list_subvolume_groups(vol_name=cmd['vol_name']) -- 2.39.5