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"]),
'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:
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.
: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)
'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:
uid = kwargs['uid']
gid = kwargs['gid']
mode = kwargs['mode']
+ normalization = kwargs['normalization']
+ casesensitive = kwargs['casesensitive']
try:
with open_volume(self, volname) as fs_handle:
'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:
'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'
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):