From af9336316f978a9f67faafad2eb3e608ed2616b1 Mon Sep 17 00:00:00 2001 From: Varsha Rao Date: Thu, 25 Mar 2021 17:13:05 +0530 Subject: [PATCH] mgr/volumes/nfs: Move nfs code out of volumes plugin This PR is to support integration of dashboard with volumes/nfs plugin. Fixes: https://tracker.ceph.com/issues/50080 Signed-off-by: Varsha Rao --- src/pybind/mgr/nfs/__init__.py | 1 + src/pybind/mgr/nfs/fs/__init__.py | 0 src/pybind/mgr/{volumes => nfs}/fs/nfs.py | 8 +- src/pybind/mgr/nfs/module.py | 168 ++++++++++++++++++++++ src/pybind/mgr/volumes/module.py | 132 ----------------- 5 files changed, 170 insertions(+), 139 deletions(-) create mode 100644 src/pybind/mgr/nfs/__init__.py create mode 100644 src/pybind/mgr/nfs/fs/__init__.py rename src/pybind/mgr/{volumes => nfs}/fs/nfs.py (99%) create mode 100644 src/pybind/mgr/nfs/module.py diff --git a/src/pybind/mgr/nfs/__init__.py b/src/pybind/mgr/nfs/__init__.py new file mode 100644 index 00000000000..8f210ac9247 --- /dev/null +++ b/src/pybind/mgr/nfs/__init__.py @@ -0,0 +1 @@ +from .module import Module diff --git a/src/pybind/mgr/nfs/fs/__init__.py b/src/pybind/mgr/nfs/fs/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/pybind/mgr/volumes/fs/nfs.py b/src/pybind/mgr/nfs/fs/nfs.py similarity index 99% rename from src/pybind/mgr/volumes/fs/nfs.py rename to src/pybind/mgr/nfs/fs/nfs.py index 6b52cddb273..8d9c15a6ffc 100644 --- a/src/pybind/mgr/volumes/fs/nfs.py +++ b/src/pybind/mgr/nfs/fs/nfs.py @@ -10,8 +10,6 @@ from rados import TimedOut, ObjectNotFound import orchestrator -from .fs_util import create_pool - log = logging.getLogger(__name__) POOL_NAME = 'nfs-ganesha' @@ -874,11 +872,7 @@ class NFSCluster: pool_list = [p['pool_name'] for p in self.mgr.get_osdmap().dump().get('pools', [])] if self.pool_name not in pool_list: - r, out, err = create_pool(self.mgr, self.pool_name) - if r != 0: - return r, out, err - log.info(f"Pool Status: {out}") - + self.mgr.check_mon_command({'prefix': 'osd pool create', 'pool': self.pool_name}) self.mgr.check_mon_command({'prefix': 'osd pool application enable', 'pool': self.pool_name, 'app': 'nfs'}) diff --git a/src/pybind/mgr/nfs/module.py b/src/pybind/mgr/nfs/module.py new file mode 100644 index 00000000000..970a37b24c8 --- /dev/null +++ b/src/pybind/mgr/nfs/module.py @@ -0,0 +1,168 @@ +import errno +import logging +import traceback +import threading + +from mgr_module import MgrModule +from volumes.module import mgr_cmd_wrap +import orchestrator + +from .fs.nfs import NFSCluster, FSExport + +log = logging.getLogger(__name__) + +goodchars = '[A-Za-z0-9-_.]' + + +class Module(orchestrator.OrchestratorClientMixin, MgrModule): + COMMANDS = [ + { + 'cmd': 'nfs export create cephfs ' + 'name=fsname,type=CephString ' + 'name=clusterid,type=CephString ' + 'name=binding,type=CephString ' + 'name=readonly,type=CephBool,req=false ' + 'name=path,type=CephString,req=false ', + 'desc': "Create a cephfs export", + 'perm': 'rw' + }, + { + 'cmd': 'nfs export delete ' + 'name=clusterid,type=CephString ' + 'name=binding,type=CephString ', + 'desc': "Delete a cephfs export", + 'perm': 'rw' + }, + { + 'cmd': 'nfs export ls ' + 'name=clusterid,type=CephString ' + 'name=detailed,type=CephBool,req=false ', + 'desc': "List exports of a NFS cluster", + 'perm': 'r' + }, + { + 'cmd': 'nfs export get ' + 'name=clusterid,type=CephString ' + 'name=binding,type=CephString ', + 'desc': "Fetch a export of a NFS cluster given the pseudo path/binding", + 'perm': 'r' + }, + { + 'cmd': 'nfs export update ', + 'desc': "Update an export of a NFS cluster by `-i `", + 'perm': 'rw' + }, + { + 'cmd': 'nfs cluster create ' + f'name=clusterid,type=CephString,goodchars={goodchars} ' + 'name=placement,type=CephString,req=false ', + 'desc': "Create an NFS Cluster", + 'perm': 'rw' + }, + { + 'cmd': 'nfs cluster update ' + 'name=clusterid,type=CephString ' + 'name=placement,type=CephString ', + 'desc': "Updates an NFS Cluster", + 'perm': 'rw' + }, + { + 'cmd': 'nfs cluster delete ' + 'name=clusterid,type=CephString ', + 'desc': "Deletes an NFS Cluster", + 'perm': 'rw' + }, + { + 'cmd': 'nfs cluster ls ', + 'desc': "List NFS Clusters", + 'perm': 'r' + }, + { + 'cmd': 'nfs cluster info ' + 'name=clusterid,type=CephString,req=false ', + 'desc': "Displays NFS Cluster info", + 'perm': 'r' + }, + { + 'cmd': 'nfs cluster config set ' + 'name=clusterid,type=CephString ', + 'desc': "Set NFS-Ganesha config by `-i `", + 'perm': 'rw' + }, + { + 'cmd': 'nfs cluster config reset ' + 'name=clusterid,type=CephString ', + 'desc': "Reset NFS-Ganesha Config to default", + 'perm': 'rw' + }, + ] + + MODULE_OPTIONS = [] + + def __init__(self, *args, **kwargs): + self.inited = False + self.lock = threading.Lock() + super(Module, self).__init__(*args, **kwargs) + with self.lock: + self.fs_export = FSExport(self) + self.nfs = NFSCluster(self) + self.inited = True + + def handle_command(self, inbuf, cmd): + handler_name = "_cmd_" + cmd['prefix'].replace(" ", "_") + try: + handler = getattr(self, handler_name) + except AttributeError: + return -errno.EINVAL, "", "Unknown command" + + return handler(inbuf, cmd) + + @mgr_cmd_wrap + def _cmd_nfs_export_create_cephfs(self, inbuf, cmd): + #TODO Extend export creation for rgw. + return self.fs_export.create_export(fs_name=cmd['fsname'], cluster_id=cmd['clusterid'], + pseudo_path=cmd['binding'], read_only=cmd.get('readonly', False), path=cmd.get('path', '/')) + + @mgr_cmd_wrap + def _cmd_nfs_export_delete(self, inbuf, cmd): + return self.fs_export.delete_export(cluster_id=cmd['clusterid'], pseudo_path=cmd['binding']) + + @mgr_cmd_wrap + def _cmd_nfs_export_ls(self, inbuf, cmd): + return self.fs_export.list_exports(cluster_id=cmd['clusterid'], detailed=cmd.get('detailed', False)) + + @mgr_cmd_wrap + def _cmd_nfs_export_get(self, inbuf, cmd): + return self.fs_export.get_export(cluster_id=cmd['clusterid'], pseudo_path=cmd['binding']) + + @mgr_cmd_wrap + def _cmd_nfs_export_update(self, inbuf, cmd): + # The export is passed to -i and it's processing is handled by the Ceph CLI. + return self.fs_export.update_export(export_config=inbuf) + + @mgr_cmd_wrap + def _cmd_nfs_cluster_create(self, inbuf, cmd): + return self.nfs.create_nfs_cluster(cluster_id=cmd['clusterid'], + placement=cmd.get('placement', None)) + + @mgr_cmd_wrap + def _cmd_nfs_cluster_update(self, inbuf, cmd): + return self.nfs.update_nfs_cluster(cluster_id=cmd['clusterid'], placement=cmd['placement']) + + @mgr_cmd_wrap + def _cmd_nfs_cluster_delete(self, inbuf, cmd): + return self.nfs.delete_nfs_cluster(cluster_id=cmd['clusterid']) + + @mgr_cmd_wrap + def _cmd_nfs_cluster_ls(self, inbuf, cmd): + return self.nfs.list_nfs_cluster() + + @mgr_cmd_wrap + def _cmd_nfs_cluster_info(self, inbuf, cmd): + return self.nfs.show_nfs_cluster_info(cluster_id=cmd.get('clusterid', None)) + + def _cmd_nfs_cluster_config_set(self, inbuf, cmd): + return self.nfs.set_nfs_cluster_config(cluster_id=cmd['clusterid'], nfs_config=inbuf) + + def _cmd_nfs_cluster_config_reset(self, inbuf, cmd): + return self.nfs.reset_nfs_cluster_config(cluster_id=cmd['clusterid']) diff --git a/src/pybind/mgr/volumes/module.py b/src/pybind/mgr/volumes/module.py index 030a9f8f4cf..6a52206951a 100644 --- a/src/pybind/mgr/volumes/module.py +++ b/src/pybind/mgr/volumes/module.py @@ -7,7 +7,6 @@ from mgr_module import MgrModule, Option import orchestrator from .fs.volume import VolumeClient -from .fs.nfs import NFSCluster, FSExport log = logging.getLogger(__name__) @@ -321,85 +320,6 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule): 'desc': "Cancel an pending or ongoing clone operation.", 'perm': 'r' }, - { - 'cmd': 'nfs export create cephfs ' - 'name=fsname,type=CephString ' - 'name=clusterid,type=CephString ' - 'name=binding,type=CephString ' - 'name=readonly,type=CephBool,req=false ' - 'name=path,type=CephString,req=false ', - 'desc': "Create a cephfs export", - 'perm': 'rw' - }, - { - 'cmd': 'nfs export delete ' - 'name=clusterid,type=CephString ' - 'name=binding,type=CephString ', - 'desc': "Delete a cephfs export", - 'perm': 'rw' - }, - { - 'cmd': 'nfs export ls ' - 'name=clusterid,type=CephString ' - 'name=detailed,type=CephBool,req=false ', - 'desc': "List exports of a NFS cluster", - 'perm': 'r' - }, - { - 'cmd': 'nfs export get ' - 'name=clusterid,type=CephString ' - 'name=binding,type=CephString ', - 'desc': "Fetch a export of a NFS cluster given the pseudo path/binding", - 'perm': 'r' - }, - { - 'cmd': 'nfs export update ', - 'desc': "Update an export of a NFS cluster by `-i `", - 'perm': 'rw' - }, - { - 'cmd': 'nfs cluster create ' - f'name=clusterid,type=CephString,goodchars={goodchars} ' - 'name=placement,type=CephString,req=false ', - 'desc': "Create an NFS Cluster", - 'perm': 'rw' - }, - { - 'cmd': 'nfs cluster update ' - 'name=clusterid,type=CephString ' - 'name=placement,type=CephString ', - 'desc': "Updates an NFS Cluster", - 'perm': 'rw' - }, - { - 'cmd': 'nfs cluster delete ' - 'name=clusterid,type=CephString ', - 'desc': "Deletes an NFS Cluster", - 'perm': 'rw' - }, - { - 'cmd': 'nfs cluster ls ', - 'desc': "List NFS Clusters", - 'perm': 'r' - }, - { - 'cmd': 'nfs cluster info ' - 'name=clusterid,type=CephString,req=false ', - 'desc': "Displays NFS Cluster info", - 'perm': 'r' - }, - { - 'cmd': 'nfs cluster config set ' - 'name=clusterid,type=CephString ', - 'desc': "Set NFS-Ganesha config by `-i `", - 'perm': 'rw' - }, - { - 'cmd': 'nfs cluster config reset ' - 'name=clusterid,type=CephString ', - 'desc': "Reset NFS-Ganesha Config to default", - 'perm': 'rw' - }, # volume ls [recursive] # subvolume ls # volume authorize/deauthorize @@ -436,8 +356,6 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule): self.config_notify() with self.lock: self.vc = VolumeClient(self) - self.fs_export = FSExport(self) - self.nfs = NFSCluster(self) self.inited = True def __del__(self): @@ -690,53 +608,3 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule): def _cmd_fs_clone_cancel(self, inbuf, cmd): return self.vc.clone_cancel( vol_name=cmd['vol_name'], clone_name=cmd['clone_name'], group_name=cmd.get('group_name', None)) - - @mgr_cmd_wrap - def _cmd_nfs_export_create_cephfs(self, inbuf, cmd): - #TODO Extend export creation for rgw. - return self.fs_export.create_export(fs_name=cmd['fsname'], cluster_id=cmd['clusterid'], - pseudo_path=cmd['binding'], read_only=cmd.get('readonly', False), path=cmd.get('path', '/')) - - @mgr_cmd_wrap - def _cmd_nfs_export_delete(self, inbuf, cmd): - return self.fs_export.delete_export(cluster_id=cmd['clusterid'], pseudo_path=cmd['binding']) - - @mgr_cmd_wrap - def _cmd_nfs_export_ls(self, inbuf, cmd): - return self.fs_export.list_exports(cluster_id=cmd['clusterid'], detailed=cmd.get('detailed', False)) - - @mgr_cmd_wrap - def _cmd_nfs_export_get(self, inbuf, cmd): - return self.fs_export.get_export(cluster_id=cmd['clusterid'], pseudo_path=cmd['binding']) - - @mgr_cmd_wrap - def _cmd_nfs_export_update(self, inbuf, cmd): - # The export is passed to -i and it's processing is handled by the Ceph CLI. - return self.fs_export.update_export(export_config=inbuf) - - @mgr_cmd_wrap - def _cmd_nfs_cluster_create(self, inbuf, cmd): - return self.nfs.create_nfs_cluster(cluster_id=cmd['clusterid'], - placement=cmd.get('placement', None)) - - @mgr_cmd_wrap - def _cmd_nfs_cluster_update(self, inbuf, cmd): - return self.nfs.update_nfs_cluster(cluster_id=cmd['clusterid'], placement=cmd['placement']) - - @mgr_cmd_wrap - def _cmd_nfs_cluster_delete(self, inbuf, cmd): - return self.nfs.delete_nfs_cluster(cluster_id=cmd['clusterid']) - - @mgr_cmd_wrap - def _cmd_nfs_cluster_ls(self, inbuf, cmd): - return self.nfs.list_nfs_cluster() - - @mgr_cmd_wrap - def _cmd_nfs_cluster_info(self, inbuf, cmd): - return self.nfs.show_nfs_cluster_info(cluster_id=cmd.get('clusterid', None)) - - def _cmd_nfs_cluster_config_set(self, inbuf, cmd): - return self.nfs.set_nfs_cluster_config(cluster_id=cmd['clusterid'], nfs_config=inbuf) - - def _cmd_nfs_cluster_config_reset(self, inbuf, cmd): - return self.nfs.reset_nfs_cluster_config(cluster_id=cmd['clusterid']) -- 2.39.5