From 142fe072c24ee0d505c1722a60b7033c061bf21c Mon Sep 17 00:00:00 2001 From: Ramana Raja Date: Wed, 17 Jul 2019 17:31:22 +0530 Subject: [PATCH] mgr/volumes: add `ceph fs subvolumegroup getpath` command ... to return the path of a FS subvolume group. Fixes: http://tracker.ceph.com/issues/40617 Signed-off-by: Ramana Raja (cherry picked from commit 4ac6c2acc2b8d08dd00cf1463a62246bb8128ff4) --- qa/tasks/cephfs/test_volumes.py | 14 ++++++++++---- src/pybind/mgr/volumes/fs/volume.py | 14 ++++++++++++++ src/pybind/mgr/volumes/module.py | 11 +++++++++++ 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/qa/tasks/cephfs/test_volumes.py b/qa/tasks/cephfs/test_volumes.py index 30756e99506c7..be747e52b4f8b 100644 --- a/qa/tasks/cephfs/test_volumes.py +++ b/qa/tasks/cephfs/test_volumes.py @@ -47,6 +47,12 @@ class TestVolumes(CephFSTestCase): else: self.volname = result[0]['name'] + def _get_subvolume_group_path(self, vol_name, group_name): + args = ("subvolumegroup", "getpath", vol_name, group_name) + path = self._fs_cmd(*args) + # remove the leading '/', and trailing whitespaces + return path[1:].rstrip() + def _get_subvolume_path(self, vol_name, subvol_name, group_name=None): args = ["subvolume", "getpath", vol_name, subvol_name] if group_name: @@ -178,7 +184,7 @@ class TestVolumes(CephFSTestCase): # create group self._fs_cmd("subvolumegroup", "create", self.volname, group1) - group1_path = os.path.join('volumes', group1) + group1_path = self._get_subvolume_group_path(self.volname, group1) default_pool = self.mount_a.getfattr(group1_path, "ceph.dir.layout.pool") new_pool = "new_pool" @@ -190,7 +196,7 @@ class TestVolumes(CephFSTestCase): # create group specifying the new data pool as its pool layout self._fs_cmd("subvolumegroup", "create", self.volname, group2, "--pool_layout", new_pool) - group2_path = os.path.join('volumes', group2) + group2_path = self._get_subvolume_group_path(self.volname, group2) desired_pool = self.mount_a.getfattr(group2_path, "ceph.dir.layout.pool") self.assertEqual(desired_pool, new_pool) @@ -242,8 +248,8 @@ class TestVolumes(CephFSTestCase): self._fs_cmd("subvolumegroup", "create", self.volname, group1) self._fs_cmd("subvolumegroup", "create", self.volname, group2, "--mode", "777") - group1_path = os.path.join('volumes', group1) - group2_path = os.path.join('volumes', group2) + group1_path = self._get_subvolume_group_path(self.volname, group1) + group2_path = self._get_subvolume_group_path(self.volname, group2) # check group's mode actual_mode1 = self.mount_a.run_shell(['stat', '-c' '%a', group1_path]).stdout.getvalue().strip() diff --git a/src/pybind/mgr/volumes/fs/volume.py b/src/pybind/mgr/volumes/fs/volume.py index e3e4501c25287..5cfb4fcb3e54d 100644 --- a/src/pybind/mgr/volumes/fs/volume.py +++ b/src/pybind/mgr/volumes/fs/volume.py @@ -507,6 +507,20 @@ class VolumeClient(object): ret = self.volume_exception_to_retval(ve) return ret + @connection_pool_wrap + def getpath_subvolume_group(self, fs_handle, **kwargs): + groupname = kwargs['group_name'] + try: + with SubVolume(self.mgr, fs_handle) as sv: + spec = SubvolumeSpec("", groupname) + path = sv.get_group_path(spec) + if path is None: + raise VolumeException( + -errno.ENOENT, "Subvolume group '{0}' not found".format(groupname)) + return 0, path, "" + except VolumeException as ve: + return self.volume_exception_to_retval(ve) + ### group snapshot @connection_pool_wrap diff --git a/src/pybind/mgr/volumes/module.py b/src/pybind/mgr/volumes/module.py index 167b7e0044b17..5d63fc56d2164 100644 --- a/src/pybind/mgr/volumes/module.py +++ b/src/pybind/mgr/volumes/module.py @@ -83,6 +83,13 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule): "in a specific subvolume group", 'perm': 'rw' }, + { + 'cmd': 'fs subvolumegroup getpath ' + 'name=vol_name,type=CephString ' + 'name=group_name,type=CephString ', + 'desc': "Get the mountpath of a CephFS subvolume group in a volume", + 'perm': 'r' + }, { 'cmd': 'fs subvolume getpath ' 'name=vol_name,type=CephString ' @@ -231,6 +238,10 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule): group_name=cmd.get('group_name', None), force=cmd.get('force', False)) + def _cmd_fs_subvolumegroup_getpath(self, inbuf, cmd): + return self.vc.getpath_subvolume_group( + None, vol_name=cmd['vol_name'], group_name=cmd['group_name']) + def _cmd_fs_subvolume_getpath(self, inbuf, cmd): return self.vc.subvolume_getpath(None, vol_name=cmd['vol_name'], sub_name=cmd['sub_name'], -- 2.39.5