diff --git a/qa/workunits/cephtool/test.sh b/qa/workunits/cephtool/test.sh index 2d28950d1626d..7dc2f5a891a37 100755 --- a/qa/workunits/cephtool/test.sh +++ b/qa/workunits/cephtool/test.sh @@ -1530,6 +1530,31 @@ function test_mon_osd() ceph osd dump | grep 'osd.0.*in' ceph osd find 0 + ceph osd info 0 + ceph osd info osd.0 + expect_false ceph osd info osd.xyz + expect_false ceph osd info xyz + expect_false ceph osd info 42 + expect_false ceph osd info osd.42 + + ceph osd info + info_json=$(ceph osd info --format=json | jq -cM '.') + dump_json=$(ceph osd dump --format=json | jq -cM '.osds') + [[ "${info_json}" == "${dump_json}" ]] + + info_json=$(ceph osd info 0 --format=json | jq -cM '.') + dump_json=$(ceph osd dump --format=json | \ + jq -cM '.osds[] | select(.osd == 0)') + [[ "${info_json}" == "${dump_json}" ]] + + info_plain="$(ceph osd info)" + dump_plain="$(ceph osd dump | grep '^osd')" + [[ "${info_plain}" == "${dump_plain}" ]] + + info_plain="$(ceph osd info 0)" + dump_plain="$(ceph osd dump | grep '^osd.0')" + [[ "${info_plain}" == "${dump_plain}" ]] + ceph osd add-nodown 0 1 ceph health detail | grep 'NODOWN' ceph osd rm-nodown 0 1 diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index fc86c4d2c36c9..880fa298db4ac 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -494,6 +494,10 @@ COMMAND("osd stat", "print summary of OSD map", "osd", "r") COMMAND("osd dump " \ "name=epoch,type=CephInt,range=0,req=false", "print summary of OSD map", "osd", "r") +COMMAND("osd info " \ + "name=id,type=CephOsdName,req=false", + "print osd's {id} information (instead of all osds from map)", + "osd", "r") COMMAND("osd tree " \ "name=epoch,type=CephInt,range=0,req=false " \ "name=states,type=CephChoices,strings=up|down|in|out|destroyed,n=N,req=false", \ diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 86d9eb486e2c9..3bab021fd104b 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -4822,7 +4822,8 @@ bool OSDMonitor::preprocess_command(MonOpRequestRef op) prefix == "osd ls" || prefix == "osd getmap" || prefix == "osd getcrushmap" || - prefix == "osd ls-tree") { + prefix == "osd ls-tree" || + prefix == "osd info") { string val; epoch_t epoch = 0; @@ -4889,6 +4890,34 @@ bool OSDMonitor::preprocess_command(MonOpRequestRef op) } } rdata.append(ds); + } else if (prefix == "osd info") { + int64_t osd_id; + bool do_single_osd = true; + if (!cmd_getval(cct, cmdmap, "id", osd_id)) { + do_single_osd = false; + } + + if (do_single_osd && !osdmap.exists(osd_id)) { + ss << "osd." << osd_id << " does not exist"; + r = -EINVAL; + goto reply; + } + + if (f) { + if (do_single_osd) { + osdmap.dump_osd(osd_id, f.get()); + } else { + osdmap.dump_osds(f.get()); + } + f->flush(ds); + } else { + if (do_single_osd) { + osdmap.print_osd(osd_id, ds); + } else { + osdmap.print_osds(ds); + } + } + rdata.append(ds); } else if (prefix == "osd tree" || prefix == "osd tree-from") { string bucket; if (prefix == "osd tree-from") {