]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: add ruleset name to crush rule dump
authorLoic Dachary <loic@dachary.org>
Tue, 11 Feb 2014 17:25:51 +0000 (18:25 +0100)
committerLoic Dachary <loic@dachary.org>
Thu, 13 Feb 2014 11:27:40 +0000 (12:27 +0100)
The crush rule name is made an optional first argument. If not provided, it
defaults to dumping all rules.

Signed-off-by: Loic Dachary <loic@dachary.org>
src/mon/MonCommands.h
src/mon/OSDMonitor.cc
src/test/pybind/test_ceph_argparse.py

index 60fa9815524e83082123baa32f4060ce9cab4b06..31478dd6b3d5fa0c5645c584b5009b9367223389 100644 (file)
@@ -364,8 +364,9 @@ COMMAND("osd blacklist ls", "show blacklisted clients", "osd", "r", "cli,rest")
 COMMAND("osd crush rule list", "list crush rules", "osd", "r", "cli,rest")
 COMMAND("osd crush rule ls", "list crush rules", "osd", "r", "cli,rest")
 COMMAND("osd crush rule dump " \
+       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.],req=false " \
        "name=format,type=CephChoices,strings=json|json-pretty|xml|xml-pretty,req=false", \
-       "dump crush rules formatted as <format> (default json-pretty)", \
+       "dump crush rule <name> (default all) formatted as <format> (default json-pretty)", \
        "osd", "r", "cli,rest")
 COMMAND("osd crush dump " \
        "name=format,type=CephChoices,strings=json|json-pretty|xml|xml-pretty,req=false", \
index 93ebc2bc28c406d61dd4426953e600b2070eb717..b0e86bae72cb1a3e788977719520c5363fa103dc 100644 (file)
@@ -2529,15 +2529,27 @@ stats_out:
     rs << "\n";
     rdata.append(rs.str());
   } else if (prefix == "osd crush rule dump") {
+    string name;
+    cmd_getval(g_ceph_context, cmdmap, "name", name);
     string format;
     cmd_getval(g_ceph_context, cmdmap, "format", format, string("json-pretty"));
     Formatter *fp = new_formatter(format);
     if (!fp)
       fp = new_formatter("json-pretty");
     boost::scoped_ptr<Formatter> f(fp);
-    f->open_array_section("rules");
-    osdmap.crush->dump_rules(f.get());
-    f->close_section();
+    if (name == "") {
+      f->open_array_section("rules");
+      osdmap.crush->dump_rules(f.get());
+      f->close_section();
+    } else {
+      int ruleset = osdmap.crush->get_rule_id(name);
+      if (ruleset < 0) {
+       ss << "unknown crush ruleset '" << name << "'";
+       r = ruleset;
+       goto reply;
+      }
+      osdmap.crush->dump_rule(ruleset, f.get());
+    }
     ostringstream rs;
     f->flush(rs);
     rs << "\n";
index 822a430ee389550d5623c59cddc07369dd800dc4..c1362aea8388344059350d6f75086b66a298dc14 100755 (executable)
@@ -576,11 +576,13 @@ class TestOSD(TestArgparse):
 
     def test_crush_rule_dump(self):
         self.assert_valid_command(['osd', 'crush', 'rule', 'dump'])
+        self.assert_valid_command(['osd', 'crush', 'rule', 'dump', 'RULE'])
         for format in ('json', 'json-pretty', 'xml', 'xml-pretty'):
-            self.assert_valid_command(['osd', 'crush', 'rule', 'dump', format])
+            self.assert_valid_command(['osd', 'crush', 'rule',
+                                       'dump', 'RULE', format])
         assert_equal({}, validate_command(sigdict, ['osd', 'crush',
                                                     'rule', 'dump',
-                                                    'json',
+                                                    'RULE', 'json',
                                                     'toomany']))
 
     def test_crush_dump(self):