raise
if self.fs_config is not None:
- log.debug(f"fs_config: {self.fs_config}")
max_mds = self.fs_config.get('max_mds', 1)
if max_mds > 1:
self.set_max_mds(max_mds)
if session_timeout != 60:
self.set_session_timeout(session_timeout)
- if self.fs_config.get('subvols', None) is not None:
- log.debug(f"Creating {self.fs_config.get('subvols')} subvols "
- f"for filesystem '{self.name}'")
- if not hasattr(self._ctx, "created_subvols"):
- self._ctx.created_subvols = dict()
-
- subvols = self.fs_config.get('subvols')
- assert(isinstance(subvols, dict))
- assert(isinstance(subvols['create'], int))
- assert(subvols['create'] > 0)
-
- for sv in range(0, subvols['create']):
- sv_name = f'sv_{sv}'
- self.mon_manager.raw_cluster_cmd(
- 'fs', 'subvolume', 'create', self.name, sv_name,
- self.fs_config.get('subvol_options', ''))
-
- if self.name not in self._ctx.created_subvols:
- self._ctx.created_subvols[self.name] = []
-
- subvol_path = self.mon_manager.raw_cluster_cmd(
- 'fs', 'subvolume', 'getpath', self.name, sv_name)
- subvol_path = subvol_path.strip()
- self._ctx.created_subvols[self.name].append(subvol_path)
- else:
- log.debug(f"Not Creating any subvols for filesystem '{self.name}'")
-
-
self.getinfo(refresh = True)
# wait pgs to be clean
+++ /dev/null
-import logging
-
-from tasks.cephfs.cephfs_test_case import CephFSTestCase
-from teuthology.exceptions import CommandFailedError
-
-log = logging.getLogger(__name__)
-
-
-class TestSubvolume(CephFSTestCase):
- CLIENTS_REQUIRED = 1
- MDSS_REQUIRED = 1
-
- def setUp(self):
- super().setUp()
- self.setup_test()
-
- def tearDown(self):
- # clean up
- self.cleanup_test()
- super().tearDown()
-
- def setup_test(self):
- self.mount_a.run_shell(['mkdir', 'group'])
- self.mount_a.run_shell(['mkdir', 'group/subvol1'])
- self.mount_a.run_shell(['setfattr', '-n', 'ceph.dir.subvolume',
- '-v', '1', 'group/subvol1'])
- self.mount_a.run_shell(['mv', 'group/subvol1', 'group/subvol2'])
-
- def cleanup_test(self):
- self.mount_a.run_shell(['rm', '-rf', 'group'])
-
- def test_subvolume_move_out_file(self):
- """
- To verify that file can't be moved out of subvolume
- """
- self.mount_a.run_shell(['touch', 'group/subvol2/file1'])
-
- # file can't be moved out of a subvolume
- with self.assertRaises(CommandFailedError):
- self.mount_a.run_shell(['rename', 'group/subvol2/file1',
- 'group/file1', 'group/subvol2/file1'])
-
-
- def test_subvolume_move_in_file(self):
- """
- To verify that file can't be moved into subvolume
- """
- # file can't be moved into a subvolume
- self.mount_a.run_shell(['touch', 'group/file2'])
- with self.assertRaises(CommandFailedError):
- self.mount_a.run_shell(['rename', 'group/file2',
- 'group/subvol2/file2', 'group/file2'])
-
- def test_subvolume_hardlink_to_outside(self):
- """
- To verify that file can't be hardlinked to outside subvolume
- """
- self.mount_a.run_shell(['touch', 'group/subvol2/file1'])
-
- # create hard link within subvolume
- self.mount_a.run_shell(['ln',
- 'group/subvol2/file1', 'group/subvol2/file1_'])
-
- # hard link can't be created out of subvolume
- with self.assertRaises(CommandFailedError):
- self.mount_a.run_shell(['ln',
- 'group/subvol2/file1', 'group/file1_'])
-
- def test_subvolume_hardlink_to_inside(self):
- """
- To verify that file can't be hardlinked to inside subvolume
- """
- self.mount_a.run_shell(['touch', 'group/subvol2/file1'])
-
- # create hard link within subvolume
- self.mount_a.run_shell(['ln',
- 'group/subvol2/file1', 'group/subvol2/file1_'])
-
- # hard link can't be created inside subvolume
- self.mount_a.run_shell(['touch', 'group/file2'])
- with self.assertRaises(CommandFailedError):
- self.mount_a.run_shell(['ln',
- 'group/file2', 'group/subvol2/file2_'])
-
- def test_subvolume_snapshot_inside_subvolume_subdir(self):
- """
- To verify that snapshot can't be taken for a subvolume subdir
- """
- self.mount_a.run_shell(['touch', 'group/subvol2/file1'])
-
- # create snapshot at subvolume root
- self.mount_a.run_shell(['mkdir', 'group/subvol2/.snap/s1'])
-
- # can't create snapshot in a descendent dir of subvolume
- self.mount_a.run_shell(['mkdir', 'group/subvol2/dir'])
- with self.assertRaises(CommandFailedError):
- self.mount_a.run_shell(['mkdir', 'group/subvol2/dir/.snap/s2'])
-
- # clean up
- self.mount_a.run_shell(['rmdir', 'group/subvol2/.snap/s1'])
-
- def test_subvolume_file_move_across_subvolumes(self):
- """
- To verify that file can't be moved across subvolumes
- """
- self.mount_a.run_shell(['touch', 'group/subvol2/file1'])
-
- # create another subvol
- self.mount_a.run_shell(['mkdir', 'group/subvol3'])
- self.mount_a.run_shell(['setfattr', '-n', 'ceph.dir.subvolume',
- '-v', '1', 'group/subvol3'])
-
- # can't move file across subvolumes
- with self.assertRaises(CommandFailedError):
- self.mount_a.run_shell(['rename', 'group/subvol2/file1',
- 'group/subvol3/file1',
- 'group/subvol2/file1'])
-
- def test_subvolume_hardlink_across_subvolumes(self):
- """
- To verify that hardlink can't be created across subvolumes
- """
- self.mount_a.run_shell(['touch', 'group/subvol2/file1'])
-
- # create another subvol
- self.mount_a.run_shell(['mkdir', 'group/subvol3'])
- self.mount_a.run_shell(['setfattr', '-n', 'ceph.dir.subvolume',
- '-v', '1', 'group/subvol3'])
-
- # can't create hard link across subvolumes
- with self.assertRaises(CommandFailedError):
- self.mount_a.run_shell(['ln', 'group/subvol2/file1',
- 'group/subvol3/file1'])
-
- def test_subvolume_create_subvolume_inside_subvolume(self):
- """
- To verify that subvolume can't be created inside a subvolume
- """
- # can't create subvolume inside a subvolume
- self.mount_a.run_shell(['mkdir', 'group/subvol2/dir'])
- with self.assertRaises(CommandFailedError):
- self.mount_a.run_shell(['setfattr', '-n', 'ceph.dir.subvolume',
- '-v', '1', 'group/subvol2/dir'])
-
- def test_subvolume_create_snapshot_inside_new_subvolume_parent(self):
- """
- To verify that subvolume can't be created inside a new subvolume parent
- """
- self.mount_a.run_shell(['touch', 'group/subvol2/file1'])
-
- # clear subvolume flag
- self.mount_a.run_shell(['setfattr', '-n', 'ceph.dir.subvolume',
- '-v', '0', 'group/subvol2'])
-
- # create a snap
- self.mount_a.run_shell(['mkdir', 'group/subvol2/dir'])
- self.mount_a.run_shell(['mkdir', 'group/subvol2/dir/.snap/s2'])
-
- # override subdir subvolume with parent subvolume
- self.mount_a.run_shell(['setfattr', '-n', 'ceph.dir.subvolume',
- '-v', '1', 'group/subvol2/dir'])
- self.mount_a.run_shell(['setfattr', '-n', 'ceph.dir.subvolume',
- '-v', '1', 'group/subvol2'])
-
- # can't create a snap in a subdir of a subvol parent
- with self.assertRaises(CommandFailedError):
- self.mount_a.run_shell(['mkdir', 'group/subvol2/dir/.snap/s3'])
-
- # clean up
- self.mount_a.run_shell(['rmdir', 'group/subvol2/dir/.snap/s2'])
--- /dev/null
+#!/bin/sh -x
+
+expect_failure() {
+ if "$@"; then return 1; else return 0; fi
+}
+
+set -e
+
+mkdir group
+mkdir group/subvol1
+
+setfattr -n ceph.dir.subvolume -v 1 group/subvol1
+
+# rename subvolume
+mv group/subvol1 group/subvol2
+
+# move file out of the subvolume
+touch group/subvol2/file1
+expect_failure python3 -c "import os; os.rename('group/subvol2/file1', 'group/file1')"
+# move file into the subvolume
+touch group/file2
+expect_failure python3 -c "import os; os.rename('group/file2', 'group/subvol2/file2')"
+
+# create hardlink within subvolume
+ln group/subvol2/file1 group/subvol2/file1_
+
+# create hardlink out of subvolume
+expect_failure ln group/subvol2/file1 group/file1_
+expect_failure ln group/file2 group/subvol1/file2_
+
+# create snapshot at subvolume root
+mkdir group/subvol2/.snap/s1
+
+# create snapshot at descendent dir of subvolume
+mkdir group/subvol2/dir
+expect_failure mkdir group/subvol2/dir/.snap/s2
+
+mkdir group/subvol3
+setfattr -n ceph.dir.subvolume -v 1 group/subvol3
+
+# move file across subvolumes
+expect_failure python3 -c "import os; os.rename('group/subvol2/file1', 'group/subvol3/file1')"
+
+# create hardlink across subvolumes
+expect_failure ln group/subvol2/file1 group/subvol3/file1
+
+# create subvolume inside existing subvolume
+expect_failure setfattr -n ceph.dir.subvolume -v 1 group/subvol2/dir
+
+# clear subvolume flag
+setfattr -n ceph.dir.subvolume -v 0 group/subvol2
+mkdir group/subvol2/dir/.snap/s2
+
+# parent subvolume override child subvolume
+setfattr -n ceph.dir.subvolume -v 1 group/subvol2/dir
+setfattr -n ceph.dir.subvolume -v 1 group/subvol2
+expect_failure mkdir group/subvol2/dir/.snap/s3
+
+rmdir group/subvol2/.snap/s1
+rmdir group/subvol2/dir/.snap/s2
+rm -rf group
+
+echo OK