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 60fa9815524e8..31478dd6b3d5f 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 93ebc2bc28c40..b0e86bae72cb1 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 822a430ee3895..c1362aea83883 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): -- 2.39.5