class_map[i] = c;
return c;
}
-
+ void get_devices_by_class(const string &name, set<int> *devices) const {
+ assert(devices);
+ devices->clear();
+ if (!class_exists(name)) {
+ return;
+ }
+ auto cid = get_class_id(name);
+ for (auto& p : class_map) {
+ if (p.first >= 0 && p.second == cid) {
+ devices->insert(p.first);
+ }
+ }
+ }
int can_rename_item(const string& srcname,
const string& dstname,
ostream *ss) const;
COMMAND("osd crush class ls", \
"list all crush device classes", \
"osd", "r", "cli,rest")
+COMMAND("osd crush class ls-osd " \
+ "name=class,type=CephString,goodchars=[A-Za-z0-9-_]", \
+ "list all osds belonging to the specific <class>", \
+ "osd", "r", "cli,rest")
COMMAND("osd setmaxosd " \
"name=newmax,type=CephInt,range=0", \
"set new maximum osd value", "osd", "rw", "cli,rest")
f->dump_string("class", i.second);
f->close_section();
f->flush(rdata);
+ } else if (prefix == "osd crush class ls-osd") {
+ string name;
+ cmd_getval(g_ceph_context, cmdmap, "class", name);
+ boost::scoped_ptr<Formatter> f(Formatter::create(format, "json-pretty", "json-pretty"));
+ set<int> osds;
+ osdmap.crush->get_devices_by_class(name, &osds);
+ f->open_array_section("osds");
+ for (auto& osd : osds)
+ f->dump_int("osd", osd);
+ f->close_section();
+ f->flush(rdata);
} else if (prefix == "osd erasure-code-profile ls") {
const auto &profiles = osdmap.get_erasure_code_profiles();
if (f)
TEST_classes $dir || return 1
ceph osd crush set-device-class ssd osd.0 || return 1
+ ceph osd crush class ls-osd ssd | grep 0 || return 1
ceph osd crush set-device-class ssd osd.1 || return 1
+ ceph osd crush class ls-osd ssd | grep 1 || return 1
ceph osd crush set-device-class ssd 0 1 || return 1 # should be idempotent
ok=false