From fa3c56f55273eca5be0a4a9d9fc93aab3dacda2b Mon Sep 17 00:00:00 2001 From: Venky Shankar Date: Mon, 2 Dec 2019 03:10:36 -0500 Subject: [PATCH] mgr/volumes: interface for fetching cloned subvolume status Signed-off-by: Venky Shankar --- .../mgr/volumes/fs/operations/template.py | 3 ++ .../fs/operations/versions/subvolume_v1.py | 30 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/pybind/mgr/volumes/fs/operations/template.py b/src/pybind/mgr/volumes/fs/operations/template.py index fa903b79369..7c3d60882b6 100644 --- a/src/pybind/mgr/volumes/fs/operations/template.py +++ b/src/pybind/mgr/volumes/fs/operations/template.py @@ -41,6 +41,9 @@ class SubvolumeTemplate(object): def open(self, need_complete=True, expected_types=[]): raise VolumeException(-errno.ENOTSUP, "operation not supported.") + def status(self): + raise VolumeException(-errno.ENOTSUP, "operation not supported.") + def create(self, size, isolate_nspace, pool, mode, uid, gid): """ set up metadata, pools and auth for a subvolume. diff --git a/src/pybind/mgr/volumes/fs/operations/versions/subvolume_v1.py b/src/pybind/mgr/volumes/fs/operations/versions/subvolume_v1.py index c767727ab85..f1e83863ee8 100644 --- a/src/pybind/mgr/volumes/fs/operations/versions/subvolume_v1.py +++ b/src/pybind/mgr/volumes/fs/operations/versions/subvolume_v1.py @@ -138,6 +138,36 @@ class SubvolumeV1(SubvolumeBase, SubvolumeTemplate): except cephfs.Error as e: raise VolumeException(-e.args[0], e.args[1]) + def _get_clone_source(self): + try: + clone_source = { + 'volume' : self.metadata_mgr.get_option("source", "volume"), + 'subvolume': self.metadata_mgr.get_option("source", "subvolume"), + 'snapshot' : self.metadata_mgr.get_option("source", "snapshot"), + } + + try: + clone_source["group"] = self.metadata_mgr.get_option("source", "group") + except MetadataMgrException as me: + if me.errno == -errno.ENOENT: + pass + else: + raise + except MetadataMgrException as me: + raise VolumeException(-errno.EINVAL, "error fetching subvolume metadata") + return clone_source + + @property + def status(self): + state = self.metadata_mgr.get_global_option(MetadataManager.GLOBAL_META_KEY_STATE) + subvolume_type = self.metadata_mgr.get_global_option(MetadataManager.GLOBAL_META_KEY_TYPE) + subvolume_status = { + 'state' : state + } + if not OpSm.is_final_state(state) and subvolume_type == SubvolumeBase.SUBVOLUME_TYPE_CLONE: + subvolume_status["source"] = self._get_clone_source() + return subvolume_status + def remove(self): self.trash_base_dir() -- 2.39.5