"name=args,type=CephString,n=N,goodchars=[A-Za-z0-9-_.=]", \
"add or update crushmap position and weight for <name> with <weight> and location <args>", \
"osd", "rw", "cli,rest")
+COMMAND("osd crush set-device-class " \
+ "name=id,type=CephOsdName " \
+ "name=class,type=CephString ", \
+ "set the <class> of the device <name>", \
+ "osd", "rw", "cli,rest")
COMMAND("osd crush create-or-move " \
"name=id,type=CephOsdName " \
"name=weight,type=CephFloat,range=0.0 " \
pending_inc.crush = data;
ss << "set crush map";
goto update;
+
+ } else if (prefix == "osd crush set-device-class") {
+ if (!osdmap.exists(osdid)) {
+ err = -ENOENT;
+ ss << name << " does not exist. create it before updating the crush map";
+ goto reply;
+ }
+
+ string device_class;
+ if (!cmd_getval(g_ceph_context, cmdmap, "class", device_class)) {
+ err = -EINVAL; // no value!
+ goto reply;
+ }
+
+ if (!_get_stable_crush().item_exists(osdid)) {
+ err = -ENOENT;
+ ss << "unable to set-device-class for item id " << osdid << " name '" << name
+ << "' device_class " << device_class << ": does not exist";
+ goto reply;
+ }
+
+ dout(5) << "updating crush item id " << osdid << " name '"
+ << name << "' device_class " << device_class << dendl;
+ CrushWrapper newcrush;
+ _get_pending_crush(newcrush);
+
+ err = newcrush.update_device_class(g_ceph_context, osdid, device_class, name);
+
+ if (err < 0)
+ goto reply;
+
+ if (err == 0 && !_have_pending_crush()) {
+ ss << "set-device-class item id " << osdid << " name '" << name << "' device_class "
+ << device_class << " : no change";
+ goto reply;
+ }
+
+ pending_inc.crush.clear();
+ newcrush.encode(pending_inc.crush, mon->get_quorum_con_features());
+ ss << "set-device-class item id " << osdid << " name '" << name << "' device_class "
+ << device_class;
+ getline(ss, rs);
+ wait_for_finished_proposal(op, new Monitor::C_Command(mon, op, 0, rs,
+ get_last_committed() + 1));
+ return true;
+
} else if (prefix == "osd crush add-bucket") {
// os crush add-bucket <name> <type>
string name, typestr;
ceph osd crush dump | grep -q '~ssd' || return 1
}
+function TEST_set_device_class() {
+ local dir=$1
+
+ TEST_classes $dir || return 1
+
+ ceph osd crush set-device-class osd.0 ssd || return 1
+ ceph osd crush set-device-class osd.1 ssd || return 1
+
+ ok=false
+ for delay in 2 4 8 16 32 64 128 256 ; do
+ if test "$(get_osds_up rbd SOMETHING_ELSE)" == "0 1" ; then
+ ok=true
+ break
+ fi
+ sleep $delay
+ ceph osd crush dump
+ ceph osd dump # for debugging purposes
+ ceph pg dump # for debugging purposes
+ done
+ $ok || return 1
+}
+
main crush-classes "$@"
# Local Variables: