--- /dev/null
+import errno
+
+import cephfs
+
+from ..exception import VolumeException
+from ceph.utils import strtobool
+
+_charmap_type = {
+ "casesensitive": lambda x: int(strtobool(x)),
+ "normalization": lambda x: str(x),
+ "encoding": lambda x: str(x),
+}
+
+def charmap_set(fs, path, setting, value):
+ """
+ Set and get a charmap on a directory.
+ """
+
+ if setting not in _charmap_type:
+ raise VolumeException(-errno.EINVAL, f"charmap setting invalid")
+
+ try:
+ value = _charmap_type[setting](value)
+ except ValueError:
+ raise VolumeException(-errno.EINVAL, f"charmap value wrong type: {setting}")
+
+ try:
+ fs.setxattr(path, f"ceph.dir.{setting}", str(value).encode('utf-8'), 0)
+ except cephfs.Error as e:
+ raise VolumeException(-e.args[0], e.args[1])
+
+ try:
+ return fs.getxattr(path, f"ceph.dir.charmap").decode('utf-8')
+ except cephfs.Error as e:
+ raise VolumeException(-e.args[0], e.args[1])
+
+def charmap_rm(fs, path):
+ """
+ Remove a charmap on a directory.
+ """
+
+ try:
+ fs.removexattr(path, "ceph.dir.charmap", 0)
+ except cephfs.Error as e:
+ raise VolumeException(-e.args[0], e.args[1])
+
+def charmap_get(fs, path, setting):
+ """
+ Get a charmap on a directory.
+ """
+
+ if setting not in _charmap_type and setting != 'charmap':
+ raise VolumeException(-errno.EINVAL, f"charmap setting invalid")
+
+ try:
+ return fs.getxattr(path, f"ceph.dir.{setting}").decode('utf-8')
+ except cephfs.Error as e:
+ raise VolumeException(-e.args[0], e.args[1])
import cephfs
from .snapshot_util import mksnap, rmsnap
+from .charmap_util import charmap_get, charmap_set, charmap_rm
from .pin_util import pin
from .template import GroupTemplate
from ..fs_util import listdir, listsnaps, get_ancestor_xattr, create_base_dir, has_subdir
def pin(self, pin_type, pin_setting):
return pin(self.fs, self.path, pin_type, pin_setting)
+ def charmap_set(self, setting, value):
+ return charmap_set(self.fs, self.path, setting, value)
+
+ def charmap_rm(self):
+ return charmap_rm(self.fs, self.path)
+
+ def charmap_get(self, setting):
+ return charmap_get(self.fs, self.path, setting)
+
def create_snapshot(self, snapname):
snappath = os.path.join(self.path,
self.vol_spec.snapshot_dir_prefix.encode('utf-8'),
CREATE = 'create'
REMOVE = 'rm'
REMOVE_FORCE = 'rm-force'
+ CHARMAP = 'charmap'
PIN = 'pin'
LIST = 'ls'
GETPATH = 'getpath'
import cephfs
+from ..charmap_util import charmap_get, charmap_set, charmap_rm
from ..pin_util import pin
from .subvolume_attrs import SubvolumeTypes
from .metadata_manager import MetadataManager
def pin(self, pin_type, pin_setting):
return pin(self.fs, self.base_path, pin_type, pin_setting)
+ def charmap_set(self, setting, value):
+ return charmap_set(self.fs, self.path, setting, value)
+
+ def charmap_rm(self):
+ return charmap_rm(self.fs, self.path)
+
+ def charmap_get(self, setting):
+ return charmap_get(self.fs, self.path, setting)
+
def init_config(self, version, subvolume_type,
subvolume_path, subvolume_state):
self.metadata_mgr.init(version, subvolume_type.value,
ret = self.volume_exception_to_retval(ve)
return ret
+ def subvolume_charmap_set(self, **kwargs):
+ ret = 0, "", ""
+ volname = kwargs['vol_name']
+ subvolname = kwargs['sub_name']
+ setting = kwargs['setting']
+ value = kwargs['value']
+ groupname = kwargs['group_name']
+
+ try:
+ with open_volume(self, volname) as fs_handle:
+ with open_group(fs_handle, self.volspec, groupname) as group:
+ with open_subvol(self.mgr, fs_handle, self.volspec, group, subvolname, SubvolumeOpType.CHARMAP) as subvolume:
+ v = subvolume.charmap_set(setting, value)
+ ret = 0, v, ""
+ except VolumeException as ve:
+ ret = self.volume_exception_to_retval(ve)
+ return ret
+
+ def subvolume_charmap_rm(self, **kwargs):
+ ret = 0, "", ""
+ volname = kwargs['vol_name']
+ subvolname = kwargs['sub_name']
+ groupname = kwargs['group_name']
+
+ try:
+ with open_volume(self, volname) as fs_handle:
+ with open_group(fs_handle, self.volspec, groupname) as group:
+ with open_subvol(self.mgr, fs_handle, self.volspec, group, subvolname, SubvolumeOpType.CHARMAP) as subvolume:
+ subvolume.charmap_rm()
+ ret = 0, json.dumps({}), ""
+ except VolumeException as ve:
+ ret = self.volume_exception_to_retval(ve)
+ return ret
+
+
+ def subvolume_charmap_get(self, **kwargs):
+ ret = 0, "", ""
+ volname = kwargs['vol_name']
+ subvolname = kwargs['sub_name']
+ setting = kwargs['setting']
+ groupname = kwargs['group_name']
+
+ try:
+ with open_volume(self, volname) as fs_handle:
+ with open_group(fs_handle, self.volspec, groupname) as group:
+ with open_subvol(self.mgr, fs_handle, self.volspec, group, subvolname, SubvolumeOpType.CHARMAP) as subvolume:
+ v = subvolume.charmap_get(setting)
+ ret = 0, v, ""
+ except VolumeException as ve:
+ ret = self.volume_exception_to_retval(ve)
+ return ret
+
def subvolume_getpath(self, **kwargs):
ret = None
volname = kwargs['vol_name']
ret = self.volume_exception_to_retval(ve)
return ret
+ def subvolume_group_charmap_set(self, **kwargs):
+ ret = 0, "", ""
+ volname = kwargs['vol_name']
+ groupname = kwargs['group_name']
+ setting = kwargs['setting']
+ value = kwargs['value']
+
+ try:
+ with open_volume(self, volname) as fs_handle:
+ with open_group(fs_handle, self.volspec, groupname) as group:
+ v = group.charmap_set(setting, value)
+ ret = 0, v, ""
+ except VolumeException as ve:
+ ret = self.volume_exception_to_retval(ve)
+ return ret
+
+ def subvolume_group_charmap_rm(self, **kwargs):
+ ret = 0, "", ""
+ volname = kwargs['vol_name']
+ groupname = kwargs['group_name']
+
+ try:
+ with open_volume(self, volname) as fs_handle:
+ with open_group(fs_handle, self.volspec, groupname) as group:
+ group.charmap_rm()
+ ret = 0, json.dumps({}), ""
+ except VolumeException as ve:
+ ret = self.volume_exception_to_retval(ve)
+ return ret
+
+ def subvolume_group_charmap_get(self, **kwargs):
+ ret = 0, "", ""
+ volname = kwargs['vol_name']
+ groupname = kwargs['group_name']
+ setting = kwargs['setting']
+
+ try:
+ with open_volume(self, volname) as fs_handle:
+ with open_group(fs_handle, self.volspec, groupname) as group:
+ v = group.charmap_get(setting)
+ ret = 0, v, ""
+ except VolumeException as ve:
+ ret = self.volume_exception_to_retval(ve)
+ return ret
+
def subvolume_group_exists(self, **kwargs):
volname = kwargs['vol_name']
ret = 0, "", ""
'desc': "Set MDS pinning policy for subvolumegroup",
'perm': 'rw'
},
+ {
+ 'cmd': 'fs subvolumegroup charmap set'
+ ' name=vol_name,type=CephString'
+ ' name=group_name,type=CephString,req=true'
+ ' name=setting,type=CephChoices,strings=casesensitive|normalization|encoding'
+ ' name=value,type=CephString,req=true',
+ 'desc': "Set charmap settings for subvolumegroup",
+ 'perm': 'rw'
+ },
+ {
+ 'cmd': 'fs subvolumegroup charmap rm'
+ ' name=vol_name,type=CephString'
+ ' name=group_name,type=CephString,req=true',
+ 'desc': "Remove charmap settings for subvolumegroup",
+ 'perm': 'rw'
+ },
+ {
+ 'cmd': 'fs subvolumegroup charmap get'
+ ' name=vol_name,type=CephString'
+ ' name=group_name,type=CephString,req=true'
+ ' name=setting,type=CephChoices,strings=casesensitive|normalization|encoding,req=false',
+ 'desc': "Get charmap settings for subvolumegroup",
+ 'perm': 'rw'
+ },
+
{
'cmd': 'fs subvolumegroup snapshot ls '
'name=vol_name,type=CephString '
'desc': "Set MDS pinning policy for subvolume",
'perm': 'rw'
},
+ {
+ 'cmd': 'fs subvolume charmap set'
+ ' name=vol_name,type=CephString'
+ ' name=sub_name,type=CephString'
+ ' name=setting,type=CephChoices,strings=casesensitive|normalization|encoding'
+ ' name=value,type=CephString,req=true'
+ ' name=group_name,type=CephString,req=false',
+ 'desc': "Set charmap settings for subvolumegroup",
+ 'perm': 'rw'
+ },
+ {
+ 'cmd': 'fs subvolume charmap rm'
+ ' name=vol_name,type=CephString'
+ ' name=sub_name,type=CephString'
+ ' name=group_name,type=CephString,req=false',
+ 'desc': "Remove charmap settings for subvolume",
+ 'perm': 'rw'
+ },
+ {
+ 'cmd': 'fs subvolume charmap get'
+ ' name=vol_name,type=CephString'
+ ' name=sub_name,type=CephString'
+ ' name=setting,type=CephChoices,strings=casesensitive|normalization|encoding,req=false'
+ ' name=group_name,type=CephString,req=false',
+ 'desc': "Get charmap settings for subvolumegroup",
+ 'perm': 'rw'
+ },
{
'cmd': 'fs subvolume snapshot protect '
'name=vol_name,type=CephString '
group_name=cmd['group_name'], pin_type=cmd['pin_type'],
pin_setting=cmd['pin_setting'])
+ @mgr_cmd_wrap
+ def _cmd_fs_subvolumegroup_charmap_set(self, inbuf, cmd):
+ return self.vc.subvolume_group_charmap_set(vol_name=cmd['vol_name'],
+ group_name=cmd['group_name'],
+ setting=cmd['setting'],
+ value=cmd['value'])
+ @mgr_cmd_wrap
+ def _cmd_fs_subvolumegroup_charmap_rm(self, inbuf, cmd):
+ return self.vc.subvolume_group_charmap_rm(vol_name=cmd['vol_name'],
+ group_name=cmd['group_name'])
+
+ @mgr_cmd_wrap
+ def _cmd_fs_subvolumegroup_charmap_get(self, inbuf, cmd):
+ return self.vc.subvolume_group_charmap_get(vol_name=cmd['vol_name'],
+ group_name=cmd['group_name'],
+ setting=cmd.get('setting', 'charmap'))
+
@mgr_cmd_wrap
def _cmd_fs_subvolumegroup_snapshot_create(self, inbuf, cmd):
return self.vc.create_subvolume_group_snapshot(vol_name=cmd['vol_name'],
pin_setting=cmd['pin_setting'],
group_name=cmd.get('group_name', None))
+ @mgr_cmd_wrap
+ def _cmd_fs_subvolume_charmap_set(self, inbuf, cmd):
+ return self.vc.subvolume_charmap_set(vol_name=cmd['vol_name'],
+ sub_name=cmd['sub_name'],
+ setting=cmd['setting'],
+ value=cmd['value'],
+ group_name=cmd.get('group_name', None))
+
+ @mgr_cmd_wrap
+ def _cmd_fs_subvolume_charmap_rm(self, inbuf, cmd):
+ return self.vc.subvolume_charmap_rm(vol_name=cmd['vol_name'],
+ sub_name=cmd['sub_name'],
+ group_name=cmd.get('group_name', None))
+
+ @mgr_cmd_wrap
+ def _cmd_fs_subvolume_charmap_get(self, inbuf, cmd):
+ return self.vc.subvolume_charmap_get(vol_name=cmd['vol_name'],
+ sub_name=cmd['sub_name'],
+ setting=cmd.get('setting', 'charmap'),
+ group_name=cmd.get('group_name', None))
+
@mgr_cmd_wrap
def _cmd_fs_subvolume_snapshot_protect(self, inbuf, cmd):
return self.vc.protect_subvolume_snapshot(vol_name=cmd['vol_name'], sub_name=cmd['sub_name'],