From 4784a687c1c37d1390c1ff59c081014aff257695 Mon Sep 17 00:00:00 2001 From: Loic Dachary Date: Tue, 11 Feb 2014 18:25:51 +0100 Subject: [PATCH] mon: add ruleset name to crush rule dump The crush rule name is made an optional first argument. If not provided, it defaults to dumping all rules. Signed-off-by: Loic Dachary --- src/mon/MonCommands.h | 3 ++- src/mon/OSDMonitor.cc | 18 +++++++++++++++--- src/test/pybind/test_ceph_argparse.py | 6 ++++-- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index 60fa9815524..31478dd6b3d 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -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 (default json-pretty)", \ + "dump crush rule (default all) formatted as (default json-pretty)", \ "osd", "r", "cli,rest") COMMAND("osd crush dump " \ "name=format,type=CephChoices,strings=json|json-pretty|xml|xml-pretty,req=false", \ diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 93ebc2bc28c..b0e86bae72c 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -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 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"; diff --git a/src/test/pybind/test_ceph_argparse.py b/src/test/pybind/test_ceph_argparse.py index 822a430ee38..c1362aea838 100755 --- a/src/test/pybind/test_ceph_argparse.py +++ b/src/test/pybind/test_ceph_argparse.py @@ -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):