]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/volumes/nfs: Add delete cephfs export command
authorVarsha Rao <varao@redhat.com>
Tue, 28 Apr 2020 16:27:20 +0000 (21:57 +0530)
committerVarsha Rao <varao@redhat.com>
Fri, 29 May 2020 09:17:32 +0000 (14:47 +0530)
$ ceph nfs export delete <binding> <clusterid>

binding: It is the pseudo root name
clusterid: It is name of the cluster

Signed-off-by: Varsha Rao <varao@redhat.com>
doc/cephfs/fs-nfs-exports.rst
src/pybind/mgr/volumes/fs/nfs.py
src/pybind/mgr/volumes/module.py

index 82353fb622ac0cae7c81385bcbac941c7d504f1e..067d21b14797660057e0319f0a4d29c939687308 100644 (file)
@@ -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 <binding> <clusterid>
+
+It deletes an export in cluster based on pseudo root name (binding).
+
 Configuring NFS-Ganesha to export CephFS with vstart
 ====================================================
 
index 5dcf9a7673e5534d731beec2d42434f1e2a3c860..a4fc27f80b2b447e78eebb1ea05cd9e98c11c14c 100644 (file)
@@ -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:
index 20a5c66588c50dbd567d27b3e5450fdc8fe1b852..fd23867b88cb76c9d4d49aeeff61c78cc7e26d9b 100644 (file)
@@ -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'],