From a98dd780ed8742d191c4090fbdc5c2a94cec70ae Mon Sep 17 00:00:00 2001 From: Xavi Hernandez Date: Thu, 3 Jul 2025 10:27:10 +0200 Subject: [PATCH] pybind/mgr: add name mangling options to subvolume group creation Signed-off-by: Xavi Hernandez (cherry picked from commit f98990ac1bbdf4ca0f05ea0336289cb32001159f) --- src/pybind/mgr/volumes/fs/operations/group.py | 38 +++++++++++++++++-- src/pybind/mgr/volumes/fs/volume.py | 8 +++- src/pybind/mgr/volumes/module.py | 8 +++- 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/src/pybind/mgr/volumes/fs/operations/group.py b/src/pybind/mgr/volumes/fs/operations/group.py index 60a734d942a79..bce5eaeb886c6 100644 --- a/src/pybind/mgr/volumes/fs/operations/group.py +++ b/src/pybind/mgr/volumes/fs/operations/group.py @@ -126,6 +126,17 @@ class Group(GroupTemplate): except cephfs.Error as e: raise VolumeException(-e.args[0], e.args[1]) + try: + normalization = self.fs.getxattr(self.path, 'ceph.dir.normalization').decode('utf-8') + except cephfs.NoData: + normalization = "none" + + try: + casesensitive = self.fs.getxattr(self.path, 'ceph.dir.casesensitive').decode('utf-8') + casesensitive = casesensitive == "1" + except cephfs.NoData: + casesensitive = True + return {'uid': int(st["uid"]), 'gid': int(st["gid"]), 'atime': str(st["atime"]), @@ -136,7 +147,10 @@ class Group(GroupTemplate): 'created_at': str(st["btime"]), 'bytes_quota': "infinite" if nsize == 0 else nsize, 'bytes_used': int(usedbytes), - 'bytes_pcent': "undefined" if nsize == 0 else '{0:.2f}'.format((float(usedbytes) / nsize) * 100.0)} + 'bytes_pcent': "undefined" if nsize == 0 else '{0:.2f}'.format((float(usedbytes) / nsize) * 100.0), + 'normalization': normalization, + 'casesensitive': casesensitive, + } def resize(self, newsize, noshrink): try: @@ -223,7 +237,21 @@ def set_group_attrs(fs, path, attrs): if mode is not None: fs.lchmod(path, mode) -def create_group(fs, vol_spec, groupname, size, pool, mode, uid, gid): + normalization = attrs.get("normalization") + if normalization is not None: + try: + fs.setxattr(path, "ceph.dir.normalization", normalization.encode('utf-8'), 0) + except cephfs.Error as e: + raise VolumeException(-e.args[0], e.args[1]) + + casesensitive = attrs.get("casesensitive") + if casesensitive is False: + try: + fs.setxattr(path, "ceph.dir.casesensitive", "0".encode('utf-8'), 0) + except cephfs.Error as e: + raise VolumeException(-e.args[0], e.args[1]) + +def create_group(fs, vol_spec, groupname, size, pool, mode, uid, gid, normalization, casesensitive): """ create a subvolume group. @@ -235,6 +263,8 @@ def create_group(fs, vol_spec, groupname, size, pool, mode, uid, gid): :param mode: the user permissions :param uid: the user identifier :param gid: the group identifier + :param normalization: the unicode normalization form to use (nfd, nfc, nfkd or nfkc) + :param casesensitive: whether to make the subvolume case insensitive or not :return: None """ group = Group(fs, vol_spec, groupname) @@ -249,7 +279,9 @@ def create_group(fs, vol_spec, groupname, size, pool, mode, uid, gid): 'uid': uid, 'gid': gid, 'data_pool': pool, - 'quota': size + 'quota': size, + 'normalization': normalization, + 'casesensitive': casesensitive, } set_group_attrs(fs, path, attrs) except (cephfs.Error, VolumeException) as e: diff --git a/src/pybind/mgr/volumes/fs/volume.py b/src/pybind/mgr/volumes/fs/volume.py index 6b796f878c235..bd34faeafb5d5 100644 --- a/src/pybind/mgr/volumes/fs/volume.py +++ b/src/pybind/mgr/volumes/fs/volume.py @@ -1087,6 +1087,8 @@ class VolumeClient(CephfsClient["Module"]): uid = kwargs['uid'] gid = kwargs['gid'] mode = kwargs['mode'] + normalization = kwargs['normalization'] + casesensitive = kwargs['casesensitive'] try: with open_volume(self, volname) as fs_handle: @@ -1098,13 +1100,15 @@ class VolumeClient(CephfsClient["Module"]): 'gid': gid, 'mode': octal_str_to_decimal_int(mode), 'data_pool': pool, - 'quota': size + 'quota': size, + 'normalization': normalization, + 'casesensitive': casesensitive, } set_group_attrs(fs_handle, group.path, attrs) except VolumeException as ve: if ve.errno == -errno.ENOENT: oct_mode = octal_str_to_decimal_int(mode) - create_group(fs_handle, self.volspec, groupname, size, pool, oct_mode, uid, gid) + create_group(fs_handle, self.volspec, groupname, size, pool, oct_mode, uid, gid, normalization, casesensitive) else: raise except VolumeException as ve: diff --git a/src/pybind/mgr/volumes/module.py b/src/pybind/mgr/volumes/module.py index e91c6bb504ce5..6f7f1b3fd1558 100644 --- a/src/pybind/mgr/volumes/module.py +++ b/src/pybind/mgr/volumes/module.py @@ -91,7 +91,9 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule): 'name=pool_layout,type=CephString,req=false ' 'name=uid,type=CephInt,req=false ' 'name=gid,type=CephInt,req=false ' - 'name=mode,type=CephString,req=false ', + 'name=mode,type=CephString,req=false ' + 'name=normalization,type=CephChoices,strings=nfd|nfc|nfkd|nfkc,req=false ' + 'name=casesensitive,type=CephBool,req=false ', 'desc': "Create a CephFS subvolume group in a volume, and optionally, " "with a specific data pool layout, and a specific numeric mode", 'perm': 'rw' @@ -727,7 +729,9 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule): return self.vc.create_subvolume_group( vol_name=cmd['vol_name'], group_name=cmd['group_name'], size=cmd.get('size', None), pool_layout=cmd.get('pool_layout', None), mode=cmd.get('mode', '755'), - uid=cmd.get('uid', None), gid=cmd.get('gid', None)) + uid=cmd.get('uid', None), gid=cmd.get('gid', None), + normalization=cmd.get('normalization', None), + casesensitive=cmd.get('casesensitive', None)) @mgr_cmd_wrap def _cmd_fs_subvolumegroup_rm(self, inbuf, cmd): -- 2.39.5