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", \
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";
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):