From 5cd46426cb78d672b738f7e852d9268f7899ddbe Mon Sep 17 00:00:00 2001 From: Rishabh Dave Date: Mon, 7 Apr 2025 19:44:57 +0530 Subject: [PATCH] qa/cephfs: add tests for "subvolume snapshot getpath" cmd Signed-off-by: Rishabh Dave (cherry picked from commit 870cbf62d288ae09ea06a5da112ea62156336924) --- qa/tasks/cephfs/test_volumes.py | 117 ++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) diff --git a/qa/tasks/cephfs/test_volumes.py b/qa/tasks/cephfs/test_volumes.py index 6357e79777c..4ca896dfcf1 100644 --- a/qa/tasks/cephfs/test_volumes.py +++ b/qa/tasks/cephfs/test_volumes.py @@ -4614,6 +4614,123 @@ class TestSubvolumeSnapshots(TestVolumesHelper): # verify trash dir is clean self._wait_for_trash_empty() + def get_subvol_uuid(self, subvol_name, group_name=None): + ''' + Return the UUID directory component obtained from the path of + subvolume. + ''' + if group_name: + cmd = (f'fs subvolume getpath {self.volname} {subvol_name} ' + f'{group_name}') + else: + cmd = f'fs subvolume getpath {self.volname} {subvol_name}' + + subvol_path = self.get_ceph_cmd_stdout(cmd).strip() + + subvol_uuid = os.path.basename(subvol_path) + return subvol_uuid + + def test_snapshot_getpath(self): + ''' + Test that "ceph fs subvolume snapshot getpath" command returns path to + the specified snapshot in the specified subvolume. + ''' + subvol_name = self._gen_subvol_name() + snap_name = self._gen_subvol_snap_name() + + self.run_ceph_cmd(f'fs subvolume create {self.volname} {subvol_name}') + sv_uuid = self.get_subvol_uuid(subvol_name) + self.run_ceph_cmd(f'fs subvolume snapshot create {self.volname} ' + f'{subvol_name} {snap_name}') + + snap_path = self.get_ceph_cmd_stdout(f'fs subvolume snapshot getpath ' + f'{self.volname} {subvol_name} ' + f'{snap_name}').strip() + # expected snapshot path + exp_snap_path = os.path.join('/volumes', '_nogroup', subvol_name, + '.snap', snap_name, sv_uuid) + self.assertEqual(snap_path, exp_snap_path) + + def test_snapshot_getpath_in_group(self): + ''' + Test that "ceph fs subvolume snapshot getpath" command returns path to + the specified snapshot in the specified subvolume in the specified + group. + ''' + subvol_name = self._gen_subvol_name() + group_name = self._gen_subvol_grp_name() + snap_name = self._gen_subvol_snap_name() + + self.run_ceph_cmd(f'fs subvolumegroup create {self.volname} {group_name}') + self.run_ceph_cmd(f'fs subvolume create {self.volname} {subvol_name} ' + f'{group_name}') + sv_uuid = self.get_subvol_uuid(subvol_name, group_name) + self.run_ceph_cmd(f'fs subvolume snapshot create {self.volname} ' + f'{subvol_name} {snap_name} {group_name}') + + snap_path = self.get_ceph_cmd_stdout(f'fs subvolume snapshot getpath ' + f'{self.volname} {subvol_name} ' + f'{snap_name} {group_name}')\ + .strip() + # expected snapshot path + exp_snap_path = os.path.join('/volumes', group_name, subvol_name, + '.snap', snap_name, sv_uuid) + self.assertEqual(snap_path, exp_snap_path) + + def test_snapshot_getpath_on_retained_subvol(self): + ''' + Test that "ceph fs subvolume snapshot getpath" command returns path to + the specified snapshot in the specified subvolume that was deleted but + snapshots on which is retained. + ''' + subvol_name = self._gen_subvol_name() + snap_name = self._gen_subvol_snap_name() + + self.run_ceph_cmd(f'fs subvolume create {self.volname} {subvol_name}') + sv_uuid = self.get_subvol_uuid(subvol_name) + self.run_ceph_cmd(f'fs subvolume snapshot create {self.volname} ' + f'{subvol_name} {snap_name}') + self.run_ceph_cmd(f'fs subvolume rm {self.volname} {subvol_name} ' + '--retain-snapshots') + + snap_path = self.get_ceph_cmd_stdout(f'fs subvolume snapshot getpath ' + f'{self.volname} {subvol_name} ' + f'{snap_name}').strip() + + # expected snapshot path + exp_snap_path = os.path.join('/volumes', '_nogroup', subvol_name, + '.snap', snap_name, sv_uuid) + self.assertEqual(snap_path, exp_snap_path) + + def test_snapshot_getpath_on_retained_subvol_in_group(self): + ''' + Test that "ceph fs subvolume snapshot getpath" command returns path to + the specified snapshot in the specified subvolume that was deleted but + snapshots on which is retained. And the deleted subvolume is located on + a non-default group. + ''' + subvol_name = self._gen_subvol_name() + group_name = self._gen_subvol_grp_name() + snap_name = self._gen_subvol_snap_name() + + self.run_ceph_cmd(f'fs subvolumegroup create {self.volname} {group_name}') + self.run_ceph_cmd(f'fs subvolume create {self.volname} {subvol_name} ' + f'{group_name}') + sv_uuid = self.get_subvol_uuid(subvol_name, group_name) + self.run_ceph_cmd(f'fs subvolume snapshot create {self.volname} ' + f'{subvol_name} {snap_name} {group_name}') + self.run_ceph_cmd(f'fs subvolume rm {self.volname} {subvol_name} ' + f'{group_name} --retain-snapshots') + + snap_path = self.get_ceph_cmd_stdout(f'fs subvolume snapshot getpath ' + f'{self.volname} {subvol_name} ' + f'{snap_name} {group_name}')\ + .strip() + # expected snapshot path + exp_snap_path = os.path.join('/volumes', group_name, subvol_name, + '.snap', snap_name, sv_uuid) + self.assertEqual(snap_path, exp_snap_path) + def test_subvolume_snapshot_info(self): """ -- 2.39.5