]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/volumes: Add subvolumegroup resize cmd
authorKotresh HR <khiremat@redhat.com>
Thu, 14 Apr 2022 06:41:41 +0000 (12:11 +0530)
committerNikhilkumar Shelke <nshelke@redhat.com>
Wed, 22 Jun 2022 06:53:42 +0000 (12:23 +0530)
Fixes: https://tracker.ceph.com/issues/53509
Signed-off-by: Kotresh HR <khiremat@redhat.com>
(cherry picked from commit 346964a89ce3b1ad80f8513387e7d84b036016b5)

src/pybind/mgr/volumes/fs/operations/group.py
src/pybind/mgr/volumes/fs/volume.py
src/pybind/mgr/volumes/module.py

index cab7e26178252ff48872d59dd6a6a9d3a81933df..d64e7fcdb3e8445474b59cc4e9302bdf1dbc40c3 100644 (file)
@@ -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
index 285a7afa515279fa26b1a73308c5e20473d50ea4..9678602cda22c33dc9174df39daf8d0ec602b0e4 100644 (file)
@@ -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']
index ee1c7d607d72e05ba27635387d8084b1da09e54e..dab0a9f6954a1397fb479da4a1a2202efecfb122 100644 (file)
@@ -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'])