From be79a3a2685804e4f2b692b3fc09f37a97166fe1 Mon Sep 17 00:00:00 2001 From: Rishabh Dave Date: Wed, 2 Apr 2025 20:55:32 +0530 Subject: [PATCH] mgr/vol: add command to get snapshot path Fixes: https://tracker.ceph.com/issues/70815 Signed-off-by: Rishabh Dave (cherry picked from commit 50d28992d99fcd67390815aa42f9da8ffaa82575) Conflicts: src/pybind/mgr/volumes/fs/volume.py - Line where the original patch makes the change is slightly different in main compared to Squid branch, leading to conflict. --- .../mgr/volumes/fs/operations/template.py | 1 + .../fs/operations/versions/subvolume_v2.py | 1 + src/pybind/mgr/volumes/fs/volume.py | 19 ++++++++++++++++++- src/pybind/mgr/volumes/module.py | 18 ++++++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/pybind/mgr/volumes/fs/operations/template.py b/src/pybind/mgr/volumes/fs/operations/template.py index 171363e8fd2..7aa953045a1 100644 --- a/src/pybind/mgr/volumes/fs/operations/template.py +++ b/src/pybind/mgr/volumes/fs/operations/template.py @@ -49,6 +49,7 @@ class SubvolumeOpType(Enum): SNAP_CREATE = 'snap-create' SNAP_REMOVE = 'snap-rm' SNAP_LIST = 'snap-ls' + SNAP_GETPATH = 'snap-getpath' SNAP_INFO = 'snap-info' SNAP_PROTECT = 'snap-protect' SNAP_UNPROTECT = 'snap-unprotect' diff --git a/src/pybind/mgr/volumes/fs/operations/versions/subvolume_v2.py b/src/pybind/mgr/volumes/fs/operations/versions/subvolume_v2.py index bec271f659f..7492b60a200 100644 --- a/src/pybind/mgr/volumes/fs/operations/versions/subvolume_v2.py +++ b/src/pybind/mgr/volumes/fs/operations/versions/subvolume_v2.py @@ -280,6 +280,7 @@ class SubvolumeV2(SubvolumeV1): SubvolumeOpType.INFO, SubvolumeOpType.SNAP_REMOVE, SubvolumeOpType.SNAP_LIST, + SubvolumeOpType.SNAP_GETPATH, SubvolumeOpType.SNAP_INFO, SubvolumeOpType.SNAP_PROTECT, SubvolumeOpType.SNAP_UNPROTECT, diff --git a/src/pybind/mgr/volumes/fs/volume.py b/src/pybind/mgr/volumes/fs/volume.py index b9465552b93..5af27d4c05c 100644 --- a/src/pybind/mgr/volumes/fs/volume.py +++ b/src/pybind/mgr/volumes/fs/volume.py @@ -21,7 +21,7 @@ from .operations.volume import create_volume, delete_volume, rename_volume, \ list_volumes, open_volume, get_pool_names, get_pool_ids, \ get_pending_subvol_deletions_count, get_all_pending_clones_count from .operations.subvolume import open_subvol, create_subvol, remove_subvol, \ - create_clone + create_clone, open_subvol_in_vol from .vol_spec import VolSpec from .exception import VolumeException, ClusterError, ClusterTimeout, \ @@ -777,6 +777,23 @@ class VolumeClient(CephfsClient["Module"]): ret = self.volume_exception_to_retval(ve) return ret + def subvolume_snapshot_getpath(self, **kwargs): + ret = 0, "", "" + volname = kwargs['vol_name'] + subvolname = kwargs['sub_name'] + snapname = kwargs['snap_name'] + groupname = kwargs['group_name'] + + try: + with open_subvol_in_vol(self, self.volspec, volname, groupname, subvolname, + SubvolumeOpType.SNAP_GETPATH) \ + as (vol, group, subvol): + snap_path = subvol.snapshot_data_path(snapname) + ret = 0, snap_path.decode("utf-8"), "" + except VolumeException as ve: + ret = self.volume_exception_to_retval(ve) + return ret + def set_subvolume_snapshot_metadata(self, **kwargs): ret = 0, "", "" volname = kwargs['vol_name'] diff --git a/src/pybind/mgr/volumes/module.py b/src/pybind/mgr/volumes/module.py index e8694709c53..c19fff805f5 100644 --- a/src/pybind/mgr/volumes/module.py +++ b/src/pybind/mgr/volumes/module.py @@ -464,6 +464,17 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule): "and optionally, in a specific subvolume group", 'perm': 'rw' }, + { + 'cmd': 'fs subvolume snapshot getpath ' + 'name=vol_name,type=CephString ' + 'name=sub_name,type=CephString ' + 'name=snap_name,type=CephString ' + 'name=group_name,type=CephString,req=false ', + 'desc': 'Get path for a snapshot of a CephFS subvolume located in ' + 'a specific volume, and optionally, in a specific ' + 'subvolume group', + 'perm': 'r' + }, { 'cmd': 'fs subvolume resize ' 'name=vol_name,type=CephString ' @@ -968,6 +979,13 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule): sub_name=cmd['sub_name'], group_name=cmd.get('group_name', None)) + @mgr_cmd_wrap + def _cmd_fs_subvolume_snapshot_getpath(self, inbuf, cmd): + return self.vc.subvolume_snapshot_getpath(vol_name=cmd['vol_name'], + sub_name=cmd['sub_name'], + snap_name=cmd['snap_name'], + group_name=cmd.get('group_name', None)) + @mgr_cmd_wrap def _cmd_fs_subvolume_resize(self, inbuf, cmd): return self.vc.resize_subvolume(vol_name=cmd['vol_name'], sub_name=cmd['sub_name'], -- 2.39.5