"find osd <id> in the CRUSH map and show its location", \
"osd", "r", "cli,rest")
COMMAND("osd metadata " \
- "name=id,type=CephInt,range=0", \
- "fetch metadata for osd <id>", \
+ "name=id,type=CephInt,range=0,req=false", \
+ "fetch metadata for osd {id} (default all)", \
"osd", "r", "cli,rest")
COMMAND("osd map " \
"name=pool,type=CephPoolname " \
f->close_section();
f->flush(rdata);
} else if (prefix == "osd metadata") {
- int64_t osd;
- if (!cmd_getval(g_ceph_context, cmdmap, "id", osd)) {
+ int64_t osd = -1;
+ if (cmd_vartype_stringify(cmdmap["id"]).size() &&
+ !cmd_getval(g_ceph_context, cmdmap, "id", osd)) {
ss << "unable to parse osd id value '"
<< cmd_vartype_stringify(cmdmap["id"]) << "'";
r = -EINVAL;
goto reply;
}
- if (!osdmap.exists(osd)) {
+ if (osd >= 0 && !osdmap.exists(osd)) {
ss << "osd." << osd << " does not exist";
r = -ENOENT;
goto reply;
string format;
cmd_getval(g_ceph_context, cmdmap, "format", format);
boost::scoped_ptr<Formatter> f(Formatter::create(format, "json-pretty", "json-pretty"));
- f->open_object_section("osd_metadata");
- r = dump_osd_metadata(osd, f.get(), &ss);
- if (r < 0)
- goto reply;
- f->close_section();
+ if (osd >= 0) {
+ f->open_object_section("osd_metadata");
+ f->dump_unsigned("id", osd);
+ r = dump_osd_metadata(osd, f.get(), &ss);
+ if (r < 0)
+ goto reply;
+ f->close_section();
+ } else {
+ f->open_array_section("osd_metadata");
+ for (int i=0; i<osdmap.get_max_osd(); ++i) {
+ if (osdmap.exists(i)) {
+ f->open_object_section("osd");
+ f->dump_unsigned("id", i);
+ r = dump_osd_metadata(i, f.get(), NULL);
+ if (r < 0)
+ goto reply;
+ f->close_section();
+ }
+ }
+ f->close_section();
+ }
f->flush(rdata);
} else if (prefix == "osd map") {
string poolstr, objstr, namespacestr;