]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/MDSMonitor: Add confirmation to "ceph mds rmfailed" 7248/head
authorYan, Zheng <zyan@redhat.com>
Fri, 15 Jan 2016 13:04:21 +0000 (21:04 +0800)
committerYan, Zheng <zyan@redhat.com>
Wed, 20 Jan 2016 02:47:13 +0000 (10:47 +0800)
Fixes: #14379
Signed-off-by: Yan, Zheng <zyan@redhat.com>
qa/workunits/cephtool/test.sh
src/mon/MDSMonitor.cc
src/mon/MonCommands.h
src/test/pybind/test_ceph_argparse.py

index 5b6fbf25c7f88f287ba1196b2cc5d705d846847f..a811faab922705daad2652d94924eb5461052260 100755 (executable)
@@ -836,6 +836,12 @@ function test_mon_mds()
 
   fail_all_mds
 
+  set +e
+  # Check that rmfailed requires confirmation
+  expect_false ceph mds rmfailed 0
+  ceph mds rmfailed 0 --yes-i-really-mean-it
+  set -e
+
   # Check that 'fs reset' runs
   ceph fs reset cephfs --yes-i-really-mean-it
 
index 664af7b03e752aa87d2a7686db944274e1da75ce..17d2ac405e88e413292a886cceb12c297a6f0dd0 100644 (file)
@@ -1647,6 +1647,13 @@ int MDSMonitor::filesystem_command(
     }
   } else if (prefix == "mds rmfailed") {
     mds_rank_t who;
+    string confirm;
+    if (!cmd_getval(g_ceph_context, cmdmap, "confirm", confirm) ||
+       confirm != "--yes-i-really-mean-it") {
+         ss << "WARNING: this can make your filesystem inaccessible! "
+               "Add --yes-i-really-mean-it if you are sure you wish to continue.";
+         return -EPERM;
+    }
     if (!cmd_getval(g_ceph_context, cmdmap, "who", who)) {
       ss << "error parsing 'who' value '"
          << cmd_vartype_stringify(cmdmap["who"]) << "'";
index 8d09f91fba040b1501270520cb89e04dfc53ac63..600b1f2ef11df20f3be162ca1fe617d78fe27811 100644 (file)
@@ -342,8 +342,8 @@ COMMAND("mds repaired name=rank,type=CephInt", \
 COMMAND("mds rm " \
        "name=gid,type=CephInt,range=0", \
        "remove nonactive mds", "mds", "rw", "cli,rest")
-COMMAND("mds rmfailed name=who,type=CephInt,range=0", "remove failed mds", \
-       "mds", "rw", "cli,rest")
+COMMAND("mds rmfailed name=who,type=CephInt,range=0 name=confirm,type=CephString,req=false", \
+       "remove failed mds", "mds", "rw", "cli,rest")
 COMMAND("mds cluster_down", "take MDS cluster down", "mds", "rw", "cli,rest")
 COMMAND("mds cluster_up", "bring MDS cluster up", "mds", "rw", "cli,rest")
 COMMAND("mds compat rm_compat " \
index 53d420f8f87099704f7f428a253fa7e91e20e29f..9f22af660839d5b70b124f2acb908699f83ce0cc 100755 (executable)
@@ -405,7 +405,15 @@ class TestMDS(TestArgparse):
         assert_equal({}, validate_command(sigdict, ['mds', 'rm', '1', 'mds.42']))
 
     def test_rmfailed(self):
-        self.check_1_natural_arg('mds', 'rmfailed')
+        self.assert_valid_command(['mds', 'rmfailed', '0'])
+        self.assert_valid_command(['mds', 'rmfailed', '0', '--yes-i-really-mean-it'])
+        assert_equal({}, validate_command(sigdict, ['mds', 'rmfailed',
+                                                    '--yes-i-really-mean-it']))
+        assert_equal({}, validate_command(sigdict, ['mds', 'rmfailed', '-1',
+                                                    '--yes-i-really-mean-it']))
+        assert_equal({}, validate_command(sigdict, ['mds', 'rmfailed', '0',
+                                                    '--yes-i-really-mean-it',
+                                                    'toomany']))
 
     def test_cluster_down(self):
         self.check_no_arg('mds', 'cluster_down')