From: Dhairya Parmar Date: Wed, 29 Mar 2023 17:50:50 +0000 (+0530) Subject: mgr/nfs/utils: add helper func to check cephfs path X-Git-Tag: v18.1.0~106^2~13 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=70749fa70ef1e407f2a17e2c97af587a49eac3bb;p=ceph.git mgr/nfs/utils: add helper func to check cephfs path this helper instantiates CephfsClient, however this was initially planned in ExportMgr class in export.py but due to make check failure where main python thread experienced a dead lock which after several efforts pointed at instantiation of CephfsClient in ExportMgr was problematic, it was decided in order to achieve singleton behavior, func has been added inside this helper func that restricts instantiation using functool's lru_cache. Signed-off-by: Dhairya Parmar (cherry picked from commit 1356992c1c1362a994bc5e17d857d2dfc01791c5) --- diff --git a/src/pybind/mgr/nfs/utils.py b/src/pybind/mgr/nfs/utils.py index 1e901c8c5296..058b0195d343 100644 --- a/src/pybind/mgr/nfs/utils.py +++ b/src/pybind/mgr/nfs/utils.py @@ -1,7 +1,13 @@ +import errno +import functools +import logging +import stat from typing import List, Tuple, TYPE_CHECKING from object_format import ErrorResponseBase import orchestrator +import cephfs +from mgr_util import CephfsClient, open_filesystem if TYPE_CHECKING: from nfs.module import Module @@ -10,6 +16,8 @@ EXPORT_PREFIX: str = "export-" CONF_PREFIX: str = "conf-nfs." USER_CONF_PREFIX: str = "userconf-nfs." +log = logging.getLogger(__name__) + class NonFatalError(ErrorResponseBase): """Raise this exception when you want to interrupt the flow of a function @@ -82,3 +90,25 @@ def check_fs(mgr: 'Module', fs_name: str) -> bool: ''' fs_map = mgr.get('fs_map') return fs_name in [fs['mdsmap']['fs_name'] for fs in fs_map['filesystems']] + + +def check_cephfs_path(mgr: 'Module', fs: str, path: str) -> None: + @functools.lru_cache(maxsize=1) + def _get_cephfs_client() -> CephfsClient: + return CephfsClient(mgr) + try: + cephfs_client = _get_cephfs_client() + with open_filesystem(cephfs_client, fs) as fs_handle: + stx = fs_handle.statx(path.encode('utf-8'), + cephfs.CEPH_STATX_MODE, 0) + if not stat.S_ISDIR(stx.get('mode')): + raise NotADirectoryError(f"{path} is not a dir") + except cephfs.ObjectNotFound as e: + log.exception(f"{-errno.ENOENT}: {e.args[1]}") + raise e + except cephfs.Error as e: + log.exception(f"{e.args[0]}: {e.args[1]}") + raise e + except Exception as e: + log.exception(f"unknown exception occurred: {e}") + raise e