From 5b45610549ec7e3f22fbda77164201bcb7396b78 Mon Sep 17 00:00:00 2001 From: Varsha Rao Date: Tue, 28 Apr 2020 21:57:20 +0530 Subject: [PATCH] mgr/volumes/nfs: Add delete cephfs export command $ ceph nfs export delete binding: It is the pseudo root name clusterid: It is name of the cluster Signed-off-by: Varsha Rao --- doc/cephfs/fs-nfs-exports.rst | 9 ++++++++ src/pybind/mgr/volumes/fs/nfs.py | 37 ++++++++++++++++++++++++++------ src/pybind/mgr/volumes/module.py | 9 ++++---- 3 files changed, 45 insertions(+), 10 deletions(-) diff --git a/doc/cephfs/fs-nfs-exports.rst b/doc/cephfs/fs-nfs-exports.rst index 82353fb622ac0..067d21b147976 100644 --- a/doc/cephfs/fs-nfs-exports.rst +++ b/doc/cephfs/fs-nfs-exports.rst @@ -56,6 +56,15 @@ It creates export rados objects containing the export block. Here binding is the pseudo root name and type is export type. Currently only CephFS is supported. +Delete CephFS Export +==================== + +.. code:: bash + + $ ceph nfs export delete + +It deletes an export in cluster based on pseudo root name (binding). + Configuring NFS-Ganesha to export CephFS with vstart ==================================================== diff --git a/src/pybind/mgr/volumes/fs/nfs.py b/src/pybind/mgr/volumes/fs/nfs.py index 5dcf9a7673e55..a4fc27f80b2b4 100644 --- a/src/pybind/mgr/volumes/fs/nfs.py +++ b/src/pybind/mgr/volumes/fs/nfs.py @@ -202,11 +202,10 @@ class FSExport(object): fs_map = self.mgr.get('fs_map') return fs_name in [fs['mdsmap']['fs_name'] for fs in fs_map['filesystems']] - def check_pseudo_path(self, pseudo_path): + def _fetch_export(self, pseudo_path): for ex in self.exports[self.rados_namespace]: if ex.pseudo == pseudo_path: - return True - return False + return ex def _create_user_key(self, entity): osd_cap = 'allow rw pool={} namespace={}, allow rw tag cephfs data=a'.format( @@ -257,6 +256,20 @@ class FSExport(object): "write configuration into rados object %s/%s/%s:\n%s", self.rados_pool, self.rados_namespace, obj, raw_config) + def _delete_export_url(self, obj, ex_id): + export_name = 'export-{}'.format(ex_id) + with self.mgr.rados.open_ioctx(self.rados_pool) as ioctx: + if self.rados_namespace: + ioctx.set_namespace(self.rados_namespace) + + export_urls = ioctx.read(obj) + url = '%url "{}"\n\n'.format(self.make_rados_url(export_name)) + export_urls = export_urls.replace(url.encode('utf-8'), b'') + ioctx.remove_object(export_name) + ioctx.write_full(obj, export_urls) + ioctx.notify(obj) + log.debug("Export deleted: {}".format(url)) + def _update_common_conf(self, cluster_id, ex_id): common_conf = 'conf-nfs.ganesha-{}'.format(cluster_id) conf_blocks = { @@ -280,7 +293,7 @@ class FSExport(object): self.exports[cluster_id] = [] self.rados_namespace = cluster_id - if not self.check_fs(fs_name) or self.check_pseudo_path(pseudo_path): + if not self.check_fs(fs_name) or self._fetch_export(pseudo_path): return -errno.EINVAL,"", "Invalid CephFS name or export already exists" user_id, key = self._create_user_key(cluster_id) @@ -314,8 +327,20 @@ class FSExport(object): return (0, json.dumps(result, indent=4), '') - def delete_export(self, ex_id): - raise NotImplementedError() + def delete_export(self, pseudo_path, cluster_id): + try: + self.rados_namespace = cluster_id + export = self._fetch_export(pseudo_path) + if export: + common_conf = 'conf-nfs.ganesha-{}'.format(cluster_id) + self._delete_export_url(common_conf, export.export_id) + self.exports[cluster_id].remove(export) + else: + log.warn("Export does not exist") + except KeyError: + log.warn("Cluster does not exist") + + return 0, "", "Successfully deleted export" def make_rados_url(self, obj): if self.rados_namespace: diff --git a/src/pybind/mgr/volumes/module.py b/src/pybind/mgr/volumes/module.py index 20a5c66588c50..fd23867b88cb7 100644 --- a/src/pybind/mgr/volumes/module.py +++ b/src/pybind/mgr/volumes/module.py @@ -234,8 +234,9 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule): 'perm': 'rw' }, { - 'cmd': 'fs nfs export delete ' - 'name=export_id,type=CephInt,req=true ', + 'cmd': 'nfs export delete ' + 'name=binding,type=CephString ' + 'name=attach,type=CephString ', 'desc': "Delete a cephfs export", 'perm': 'rw' }, @@ -437,8 +438,8 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule): pseudo_path=cmd['binding'], read_only=cmd.get('readonly', False), path=cmd.get('path', '/'), cluster_id=cmd.get('attach')) - def _cmd_fs_nfs_export_delete(self, inbuf, cmd): - return self.fs_export.delete_export(cmd['export_id']) + def _cmd_nfs_export_delete(self, inbuf, cmd): + return self.fs_export.delete_export(pseudo_path=cmd['binding'], cluster_id=cmd.get('attach')) def _cmd_nfs_cluster_create(self, inbuf, cmd): return self.nfs.create_nfs_cluster(cluster_id=cmd['clusterid'], export_type=cmd['type'], -- 2.39.5