.. prompt:: bash #
- ceph fs subvolume create <vol_name> <subvol_name> [--size <size_in_bytes>] [--group_name <subvol_group_name>] [--pool_layout <data_pool_name>] [--uid <uid>] [--gid <gid>] [--mode <octal_mode>] [--namespace-isolated] [--earmark <earmark>] [--normalization <form>] [--case-insensitive]
+ ceph fs subvolume create <vol_name> <subvol_name> [--size <size_in_bytes>] [--group_name <subvol_group_name>] [--pool_layout <data_pool_name>] [--uid <uid>] [--gid <gid>] [--mode <octal_mode>] [--namespace-isolated] [--earmark <earmark>] [--normalization <form>] [--casesensitive <bool>]
The command succeeds even if the subvolume already exists.
To learn more about unicode normalization forms see https://unicode.org/reports/tr15
It's also possible to configure a subvolume for case insensitive access when
-the ``--case-insensitive`` option is used. When this option is added, file
+the ``--casesensitive=0`` option is used. When this option is added, file
names that only differ in the case of its characters will be mapped to the same
file. The case of the file name used when the file was created is preserved.
-.. note:: Setting ``--case-insensitive`` option implicitly enables
+.. note:: Setting ``--casesensitive=0`` option implicitly enables
unicode normalization on the subvolume.
Removing a subvolume
def test_subvolume_create_with_case_insensitive(self):
# create subvolume
subvolume = self._gen_subvol_name()
- self._fs_cmd("subvolume", "create", self.volname, subvolume, "--case-insensitive")
+ self._fs_cmd("subvolume", "create", self.volname, subvolume, "--casesensitive=0")
# make sure it exists
subvolpath = self._get_subvolume_path(self.volname, subvolume)
from .template import SubvolumeOpType
from .versions import loaded_subvolumes
-def create_subvol(mgr, fs, vol_spec, group, subvolname, size, isolate_nspace, pool, mode, uid, gid, earmark, normalization, case_insensitive):
+def create_subvol(mgr, fs, vol_spec, group, subvolname, size, isolate_nspace, pool, mode, uid, gid, earmark, normalization, casesensitive):
"""
create a subvolume (create a subvolume with the max known version).
:param gid: the group identifier
:param earmark: metadata string to identify if subvolume is associated with nfs/smb
:param normalization: the unicode normalization form to use (nfd, nfc, nfkd or nfkc)
- :param case_insensitive: whether to make the subvolume case insensitive or not
+ :param casesensitive: whether to make the subvolume case insensitive or not
:return: None
"""
subvolume = loaded_subvolumes.get_subvolume_object_max(mgr, fs, vol_spec, group, subvolname)
- subvolume.create(size, isolate_nspace, pool, mode, uid, gid, earmark, normalization, case_insensitive)
+ subvolume.create(size, isolate_nspace, pool, mode, uid, gid, earmark, normalization, casesensitive)
def create_clone(mgr, fs, vol_spec, group, subvolname, pool, source_volume, source_subvolume, snapname):
try:
casesensitive = self.fs.getxattr(pathname, 'ceph.dir.casesensitive').decode('utf-8')
- attrs["case_insensitive"] = casesensitive == "0"
+ attrs["casesensitive"] = casesensitive == "1"
except cephfs.NoData:
- attrs["case_insensitive"] = False
+ attrs["casesensitive"] = True
return attrs
except cephfs.Error as e:
raise VolumeException(-e.args[0], e.args[1])
- case_insensitive = attrs.get("case_insensitive")
- if case_insensitive:
+ casesensitive = attrs.get("casesensitive")
+ if casesensitive is False:
try:
self.fs.setxattr(path, "ceph.dir.casesensitive", "0".encode('utf-8'), 0)
except cephfs.Error as e:
normalization = "none"
try:
- case_insensitive = self.fs.getxattr(subvolpath,
+ casesensitive = self.fs.getxattr(subvolpath,
'ceph.dir.casesensitive'
).decode('utf-8')
- case_insensitive = case_insensitive == "0"
+ casesensitive = casesensitive == "1"
except cephfs.NoData:
- case_insensitive = False
+ casesensitive = True
return {'path': subvolpath,
'type': etype.value,
'state': self.state.value,
'earmark': earmark,
'normalization': normalization,
- 'case_insensitive': case_insensitive,
+ 'casesensitive': casesensitive,
}
def set_user_metadata(self, keyname, value):
""" Path to user data directory within a subvolume snapshot named 'snapname' """
return self.snapshot_path(snapname)
- def create(self, size, isolate_nspace, pool, mode, uid, gid, earmark, normalization, case_insensitive):
+ def create(self, size, isolate_nspace, pool, mode, uid, gid, earmark, normalization, casesensitive):
subvolume_type = SubvolumeTypes.TYPE_NORMAL
try:
initial_state = SubvolumeOpSm.get_init_state(subvolume_type)
'quota': size,
'earmark': earmark,
'normalization': normalization,
- 'case_insensitive': case_insensitive,
+ 'casesensitive': casesensitive,
}
self.set_attrs(subvol_path, attrs)
self.metadata_mgr.update_global_section(MetadataManager.GLOBAL_META_KEY_PATH, qpath)
self.metadata_mgr.update_global_section(MetadataManager.GLOBAL_META_KEY_STATE, initial_state.value)
- def create(self, size, isolate_nspace, pool, mode, uid, gid, earmark, normalization, case_insensitive):
+ def create(self, size, isolate_nspace, pool, mode, uid, gid, earmark, normalization, casesensitive):
subvolume_type = SubvolumeTypes.TYPE_NORMAL
try:
initial_state = SubvolumeOpSm.get_init_state(subvolume_type)
'quota': size,
'earmark': earmark,
'normalization': normalization,
- 'case_insensitive': case_insensitive,
+ 'casesensitive': casesensitive,
}
self.set_attrs(subvol_path, attrs)
isolate_nspace = kwargs['namespace_isolated']
earmark = kwargs['earmark'] or '' # if not set, default to empty string --> no earmark
normalization = kwargs['normalization']
- case_insensitive = kwargs['case_insensitive']
+ casesensitive = kwargs['casesensitive']
oct_mode = octal_str_to_decimal_int(mode)
try:
create_subvol(
- self.mgr, fs_handle, self.volspec, group, subvolname, size, isolate_nspace, pool, oct_mode, uid, gid, earmark, normalization, case_insensitive)
+ self.mgr, fs_handle, self.volspec, group, subvolname, size, isolate_nspace, pool, oct_mode, uid, gid, earmark, normalization, casesensitive)
except VolumeException as ve:
# kick the purge threads for async removal -- note that this
# assumes that the subvolume is moved to trashcan for cleanup on error.
isolate_nspace = kwargs['namespace_isolated']
earmark = kwargs['earmark'] or '' # if not set, default to empty string --> no earmark
normalization = kwargs['normalization']
- case_insensitive = kwargs['case_insensitive']
+ casesensitive = kwargs['casesensitive']
try:
with open_volume(self, volname) as fs_handle:
'quota': size,
'earmark': earmark,
'normalization': normalization,
- 'case_insensitive': case_insensitive,
+ 'casesensitive': casesensitive,
}
subvolume.set_attrs(subvolume.path, attrs)
except VolumeException as ve:
'name=namespace_isolated,type=CephBool,req=false '
'name=earmark,type=CephString,req=false '
'name=normalization,type=CephChoices,strings=nfd|nfc|nfkd|nfkc,req=false '
- 'name=case_insensitive,type=CephBool,req=false ',
+ 'name=casesensitive,type=CephBool,req=false ',
'desc': "Create a CephFS subvolume in a volume, and optionally, "
"with a specific size (in bytes), a specific data pool layout, "
"a specific mode, in a specific subvolume group and in separate "
namespace_isolated=cmd.get('namespace_isolated', False),
earmark=cmd.get('earmark', None),
normalization=cmd.get('normalization', None),
- case_insensitive=cmd.get('case_insensitive', False))
+ casesensitive=cmd.get('casesensitive', None))
@mgr_cmd_wrap
def _cmd_fs_subvolume_rm(self, inbuf, cmd):