]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/volumes: protection for 'fs volume rm' command
authorJos Collin <jcollin@redhat.com>
Mon, 16 Sep 2019 13:24:24 +0000 (18:54 +0530)
committerJos Collin <jcollin@redhat.com>
Fri, 27 Sep 2019 09:47:27 +0000 (15:17 +0530)
Fixes: https://tracker.ceph.com/issues/41841
Signed-off-by: Jos Collin <jcollin@redhat.com>
src/pybind/mgr/volumes/fs/volume.py
src/pybind/mgr/volumes/module.py

index 791eab5f33236f7defcd131c16f7120ca89ff0d5..04066558d8d1faacd82815db21c77871d8555d20 100644 (file)
@@ -230,11 +230,18 @@ class VolumeClient(object):
                    'data': data_pool}
         return self.mgr.mon_command(command)
 
-    def remove_filesystem(self, fs_name):
+    def remove_filesystem(self, fs_name, confirm):
+        if confirm != "--yes-i-really-mean-it":
+            return -errno.EPERM, "", "WARNING: this will *PERMANENTLY DESTROY* all data " \
+                "stored in the filesystem '{0}'. If you are *ABSOLUTELY CERTAIN* " \
+                "that is what you want, re-issue the command followed by " \
+                "--yes-i-really-mean-it.".format(fs_name)
+
         command = {'prefix': 'fs fail', 'fs_name': fs_name}
         r, outb, outs = self.mgr.mon_command(command)
         if r != 0:
             return r, outb, outs
+
         command = {'prefix': 'fs rm', 'fs_name': fs_name, 'yes_i_really_mean_it': True}
         return self.mgr.mon_command(command)
 
@@ -275,7 +282,7 @@ class VolumeClient(object):
         # create mds
         return self.create_mds(volname)
 
-    def delete_volume(self, volname):
+    def delete_volume(self, volname, confirm):
         """
         delete the given module (tear down mds, remove filesystem)
         """
@@ -297,11 +304,13 @@ class VolumeClient(object):
         # In case orchestrator didn't tear down MDS daemons cleanly, or
         # there was no orchestrator, we force the daemons down.
         if self.volume_exists(volname):
-            r, outb, outs = self.remove_filesystem(volname)
+            r, outb, outs = self.remove_filesystem(volname, confirm)
             if r != 0:
                 return r, outb, outs
         else:
-            log.warning("Filesystem already gone for volume '{0}'".format(volname))
+            err = "Filesystem not found for volume '{0}'".format(volname)
+            log.warning(err)
+            return -errno.ENOENT, "", err
         metadata_pool, data_pool = self.gen_pool_names(volname)
         r, outb, outs = self.remove_pool(metadata_pool)
         if r != 0:
index 3d7260577f5968265776bb25ddc777dffacfbe33..5de353ca6800468df952606bdff74017f835ec87 100644 (file)
@@ -37,8 +37,9 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule):
         },
         {
             'cmd': 'fs volume rm '
-                   'name=vol_name,type=CephString',
-            'desc': "Delete a CephFS volume",
+                   'name=vol_name,type=CephString '
+                   'name=yes-i-really-mean-it,type=CephString,req=false ',
+            'desc': "Delete a FS volume by passing --yes-i-really-mean-it flag",
             'perm': 'rw'
         },
         {
@@ -194,7 +195,8 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule):
 
     def _cmd_fs_volume_rm(self, inbuf, cmd):
         vol_name = cmd['vol_name']
-        return self.vc.delete_volume(vol_name)
+        confirm = cmd.get('yes-i-really-mean-it', None)
+        return self.vc.delete_volume(vol_name, confirm)
 
     def _cmd_fs_volume_ls(self, inbuf, cmd):
         return self.vc.list_volumes()