]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/mon/MonCommands.h
import 15.2.4
[ceph.git] / ceph / src / mon / MonCommands.h
index af0352cecf4bdbf36efee4b60669f35b13168b29..21635974c606836df105c284e13a3ebd103afc43 100644 (file)
@@ -1,18 +1,18 @@
-// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- 
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
 // vim: ts=8 sw=2 smarttab
 /*
  * Ceph - scalable distributed file system
  *
- * Copyright (C) 2013 Inktank Storage, Inc. 
+ * Copyright (C) 2013 Inktank Storage, Inc.
  * Copyright (C) 2013,2014 Cloudwatt <libre.licensing@cloudwatt.com>
  *
  * Author: Loic Dachary <loic@dachary.org>
  *
  * This is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
- * License version 2.1, as published by the Free Software 
+ * License version 2.1, as published by the Free Software
  * Foundation.  See file COPYING.
- * 
+ *
  */
 
 /* no guard; may be included multiple times */
  * each descriptor is either a literal string, which can contain no spaces or
  * '=' signs (for instance, in "pg stat", both "pg" and "stat" are literal
  * strings representing one descriptor each), or a list of key=val[,key=val...]
- * which also includes no spaces.  
+ * which also includes no spaces.
  *
  * The key=val form describes a non-literal parameter.  Each will have at
  * least a name= and type=, and each type can have its own type-specific
- * parameters.  The parser is the arbiter of these types and their 
+ * parameters.  The parser is the arbiter of these types and their
  * interpretation.  A few more non-type-specific key=val pairs exist:
  *
  *    req=false marks an optional parameter (default for req is 'true')
  *
  * Example:
  *
- * COMMAND("auth add " \
- *        "name=entity,type=CephString " \
- *        "name=caps,type=CephString,n=N,req=false", \
- *        "add auth info for <name> from input file, or random key " \
+ * COMMAND("auth add "
+ *        "name=entity,type=CephString "
+ *        "name=caps,type=CephString,n=N,req=false",
+ *        "add auth info for <name> from input file, or random key "
  *        "if no input given, and/or any caps specified in the command")
  *
  * defines a command "auth add" that takes a required argument "entity"
@@ -88,7 +88,7 @@
  * enters auth add client.admin 'mon rwx' 'osd *'.  The result will be a
  * JSON object like {"prefix":"auth add", "entity":"client.admin",
  * "caps":["mon rwx", "osd *"]}.
- * Note that 
+ * Note that
  *     - string literals are accumulated into 'prefix'
  *     - n=1 descriptors are given normal string or int object values
  *     - n=N descriptors are given array values
  *  POLL      - command is intended to be called periodically by the
  *              client (see iostat)
  *  HIDDEN    - command is hidden (no reported by help etc)
+ *  TELL      - tell/asok command. it's an alias of (NOFORWARD | HIDDEN)
  *
  * A command should always be first considered DEPRECATED before being
  * considered OBSOLETE, giving due consideration to users and conforming
@@ -146,135 +147,115 @@ COMMAND("auth print_key name=entity,type=CephString", "display requested key", \
 COMMAND_WITH_FLAG("auth list", "list authentication state", "auth", "rx",
                  FLAG(DEPRECATED))
 COMMAND("auth ls", "list authentication state", "auth", "rx")
-COMMAND("auth import", "auth import: read keyring file from -i <file>", \
+COMMAND("auth import", "auth import: read keyring file from -i <file>",
        "auth", "rwx")
-COMMAND("auth add " \
-       "name=entity,type=CephString " \
-       "name=caps,type=CephString,n=N,req=false", \
-       "add auth info for <entity> from input file, or random key if no " \
+COMMAND("auth add "
+       "name=entity,type=CephString "
+       "name=caps,type=CephString,n=N,req=false",
+       "add auth info for <entity> from input file, or random key if no "
         "input is given, and/or any caps specified in the command",
        "auth", "rwx")
-COMMAND("auth get-or-create-key " \
-       "name=entity,type=CephString " \
-       "name=caps,type=CephString,n=N,req=false", \
-       "get, or add, key for <name> from system/caps pairs specified in the command.  If key already exists, any given caps must match the existing caps for that key.", \
+COMMAND("auth get-or-create-key "
+       "name=entity,type=CephString "
+       "name=caps,type=CephString,n=N,req=false",
+       "get, or add, key for <name> from system/caps pairs specified in the command.  If key already exists, any given caps must match the existing caps for that key.",
        "auth", "rwx")
-COMMAND("auth get-or-create " \
-       "name=entity,type=CephString " \
-       "name=caps,type=CephString,n=N,req=false", \
-       "add auth info for <entity> from input file, or random key if no input given, and/or any caps specified in the command", \
+COMMAND("auth get-or-create "
+       "name=entity,type=CephString "
+       "name=caps,type=CephString,n=N,req=false",
+       "add auth info for <entity> from input file, or random key if no input given, and/or any caps specified in the command",
        "auth", "rwx")
-COMMAND("fs authorize " \
-   "name=filesystem,type=CephString " \
-   "name=entity,type=CephString " \
-       "name=caps,type=CephString,n=N", \
-       "add auth for <entity> to access file system <filesystem> based on following directory and permissions pairs", \
+COMMAND("fs authorize "
+   "name=filesystem,type=CephString "
+   "name=entity,type=CephString "
+       "name=caps,type=CephString,n=N",
+       "add auth for <entity> to access file system <filesystem> based on following directory and permissions pairs",
        "auth", "rwx")
-COMMAND("auth caps " \
-       "name=entity,type=CephString " \
-       "name=caps,type=CephString,n=N", \
-       "update caps for <name> from caps specified in the command", \
+COMMAND("auth caps "
+       "name=entity,type=CephString "
+       "name=caps,type=CephString,n=N",
+       "update caps for <name> from caps specified in the command",
        "auth", "rwx")
-COMMAND_WITH_FLAG("auth del " \
-       "name=entity,type=CephString", \
-       "delete all caps for <name>", \
-       "auth", "rwx", \
+COMMAND_WITH_FLAG("auth del "
+       "name=entity,type=CephString",
+       "delete all caps for <name>",
+       "auth", "rwx",
     FLAG(DEPRECATED))
-COMMAND("auth rm " \
-       "name=entity,type=CephString", \
-       "remove all caps for <name>", \
+COMMAND("auth rm "
+       "name=entity,type=CephString",
+       "remove all caps for <name>",
        "auth", "rwx")
 
 /*
  * Monitor commands (Monitor.cc)
  */
-COMMAND_WITH_FLAG("compact", "cause compaction of monitor's leveldb/rocksdb storage", \
-            "mon", "rw", \
-             FLAG(NOFORWARD)|FLAG(DEPRECATED))
-COMMAND_WITH_FLAG("scrub", "scrub the monitor stores", \
-             "mon", "rw", \
-             FLAG(DEPRECATED))
+COMMAND_WITH_FLAG("compact", "cause compaction of monitor's leveldb/rocksdb storage",
+            "mon", "rw",
+             FLAG(TELL))
+COMMAND_WITH_FLAG("scrub", "scrub the monitor stores",
+             "mon", "rw",
+             FLAG(OBSOLETE))
 COMMAND("fsid", "show cluster FSID/UUID", "mon", "r")
-COMMAND("log name=logtext,type=CephString,n=N", \
+COMMAND("log name=logtext,type=CephString,n=N",
        "log supplied text to the monitor log", "mon", "rw")
 COMMAND("log last "
         "name=num,type=CephInt,range=1,req=false "
         "name=level,type=CephChoices,strings=debug|info|sec|warn|error,req=false "
-        "name=channel,type=CephChoices,strings=*|cluster|audit,req=false", \
-       "print last few lines of the cluster log", \
+        "name=channel,type=CephChoices,strings=*|cluster|audit|cephadm,req=false",
+       "print last few lines of the cluster log",
        "mon", "r")
-COMMAND_WITH_FLAG("injectargs " \
-            "name=injected_args,type=CephString,n=N",                  \
-            "inject config arguments into monitor", "mon", "rw",
-            FLAG(NOFORWARD))
 
 COMMAND("status", "show cluster status", "mon", "r")
-COMMAND("health name=detail,type=CephChoices,strings=detail,req=false", \
+COMMAND("health name=detail,type=CephChoices,strings=detail,req=false",
        "show cluster health", "mon", "r")
+COMMAND("health mute "\
+       "name=code,type=CephString "
+       "name=ttl,type=CephString,req=false "
+       "name=sticky,type=CephBool,req=false",
+       "mute health alert", "mon", "w")
+COMMAND("health unmute "\
+       "name=code,type=CephString,req=false",
+       "unmute existing health alert mute(s)", "mon", "w")
 COMMAND("time-sync-status", "show time sync status", "mon", "r")
-COMMAND("df name=detail,type=CephChoices,strings=detail,req=false", \
+COMMAND("df name=detail,type=CephChoices,strings=detail,req=false",
        "show cluster free space stats", "mon", "r")
-COMMAND("report name=tags,type=CephString,n=N,req=false", \
-       "report full status of cluster, optional title tag strings", \
+COMMAND("report name=tags,type=CephString,n=N,req=false",
+       "report full status of cluster, optional title tag strings",
        "mon", "r")
-COMMAND("features", "report of connected features", \
+COMMAND("features", "report of connected features",
         "mon", "r")
-COMMAND("quorum_status", "report status of monitor quorum", \
+COMMAND("quorum_status", "report status of monitor quorum",
        "mon", "r")
-COMMAND("mon ok-to-stop " \
+COMMAND("mon ok-to-stop "
        "name=ids,type=CephString,n=N",
-       "check whether mon(s) can be safely stopped without reducing immediate " \
+       "check whether mon(s) can be safely stopped without reducing immediate "
        "availability",
        "mon", "r")
 COMMAND("mon ok-to-add-offline",
        "check whether adding a mon and not starting it would break quorum",
        "mon", "r")
-COMMAND("mon ok-to-rm " \
+COMMAND("mon ok-to-rm "
        "name=id,type=CephString",
        "check whether removing the specified mon would break quorum",
        "mon", "r")
 
-COMMAND_WITH_FLAG("mon_status", "report status of monitors", "mon", "r",
-            FLAG(NOFORWARD))
-COMMAND_WITH_FLAG("sync force " \
-       "name=yes_i_really_mean_it,type=CephBool,req=false " \
-       "name=i_know_what_i_am_doing,type=CephBool,req=false", \
-       "force sync of and clear monitor store", \
-        "mon", "rw", \
-        FLAG(NOFORWARD)|FLAG(DEPRECATED))
-COMMAND_WITH_FLAG("heap " \
-            "name=heapcmd,type=CephChoices,strings=dump|start_profiler|stop_profiler|release|stats", \
-            "show heap usage info (available only if compiled with tcmalloc)", \
-            "mon", "rw", FLAG(NOFORWARD))
-COMMAND("quorum name=quorumcmd,type=CephChoices,strings=enter|exit,n=1", \
-       "enter or exit quorum", "mon", "rw")
-COMMAND("tell " \
-       "name=target,type=CephName " \
-       "name=args,type=CephString,n=N", \
+COMMAND("tell "
+       "name=target,type=CephName "
+       "name=args,type=CephString,n=N",
        "send a command to a specific daemon", "mon", "rw")
 COMMAND_WITH_FLAG("version", "show mon daemon version", "mon", "r",
-                  FLAG(NOFORWARD))
+                  FLAG(TELL))
 
-COMMAND("node ls " \
+COMMAND("node ls "
        "name=type,type=CephChoices,strings=all|osd|mon|mds|mgr,req=false",
        "list all nodes in cluster [type]", "mon", "r")
 /*
  * Monitor-specific commands under module 'mon'
  */
-COMMAND_WITH_FLAG("mon compact", \
-    "cause compaction of monitor's leveldb/rocksdb storage", \
-    "mon", "rw", \
-    FLAG(NOFORWARD))
 COMMAND_WITH_FLAG("mon scrub",
-    "scrub the monitor stores", \
-    "mon", "rw", \
+    "scrub the monitor stores",
+    "mon", "rw",
     FLAG(NONE))
-COMMAND_WITH_FLAG("mon sync force " \
-    "name=yes_i_really_mean_it,type=CephBool,req=false " \
-    "name=i_know_what_i_am_doing,type=CephBool,req=false", \
-    "force sync of and clear monitor store", \
-    "mon", "rw", \
-    FLAG(NOFORWARD))
 COMMAND("mon metadata name=id,type=CephString,req=false",
        "fetch metadata for mon <id>",
        "mon", "r")
@@ -296,14 +277,14 @@ COMMAND("versions",
 
 COMMAND_WITH_FLAG("mds stat", "show MDS status", "mds", "r", FLAG(HIDDEN))
 COMMAND_WITH_FLAG("mds dump "
-       "name=epoch,type=CephInt,req=false,range=0", \
+       "name=epoch,type=CephInt,req=false,range=0",
        "dump legacy MDS cluster info, optionally from epoch",
         "mds", "r", FLAG(OBSOLETE))
 COMMAND("fs dump "
-       "name=epoch,type=CephInt,req=false,range=0", \
+       "name=epoch,type=CephInt,req=false,range=0",
        "dump all CephFS status, optionally from epoch", "mds", "r")
-COMMAND_WITH_FLAG("mds getmap " \
-       "name=epoch,type=CephInt,req=false,range=0", \
+COMMAND_WITH_FLAG("mds getmap "
+       "name=epoch,type=CephInt,req=false,range=0",
        "get MDS map, optionally from epoch", "mds", "r", FLAG(OBSOLETE))
 COMMAND("mds metadata name=who,type=CephString,req=false",
        "fetch metadata for mds <role>",
@@ -314,28 +295,28 @@ COMMAND("mds count-metadata name=property,type=CephString",
 COMMAND("mds versions",
        "check running versions of MDSs",
        "mds", "r")
-COMMAND_WITH_FLAG("mds tell " \
-       "name=who,type=CephString " \
-       "name=args,type=CephString,n=N", \
+COMMAND_WITH_FLAG("mds tell "
+       "name=who,type=CephString "
+       "name=args,type=CephString,n=N",
        "send command to particular mds", "mds", "rw", FLAG(OBSOLETE))
-COMMAND("mds compat show", "show mds compatibility settings", \
+COMMAND("mds compat show", "show mds compatibility settings",
        "mds", "r")
-COMMAND_WITH_FLAG("mds stop name=role,type=CephString", "stop mds", \
+COMMAND_WITH_FLAG("mds stop name=role,type=CephString", "stop mds",
        "mds", "rw", FLAG(OBSOLETE))
 COMMAND_WITH_FLAG("mds deactivate name=role,type=CephString",
-        "clean up specified MDS rank (use with `set max_mds` to shrink cluster)", \
+        "clean up specified MDS rank (use with `set max_mds` to shrink cluster)",
        "mds", "rw", FLAG(OBSOLETE))
 COMMAND("mds ok-to-stop name=ids,type=CephString,n=N",
        "check whether stopping the specified MDS would reduce immediate availability",
        "mds", "r")
-COMMAND_WITH_FLAG("mds set_max_mds " \
-       "name=maxmds,type=CephInt,range=0", \
+COMMAND_WITH_FLAG("mds set_max_mds "
+       "name=maxmds,type=CephInt,range=0",
        "set max MDS index", "mds", "rw", FLAG(OBSOLETE))
-COMMAND_WITH_FLAG("mds set " \
+COMMAND_WITH_FLAG("mds set "
        "name=var,type=CephChoices,strings=max_mds|max_file_size|inline_data|"
-       "allow_new_snaps|allow_multimds|allow_multimds_snaps|allow_dirfrags " \
-       "name=val,type=CephString "                                     \
-       "name=yes_i_really_mean_it,type=CephBool,req=false",                    \
+       "allow_new_snaps|allow_multimds|allow_multimds_snaps|allow_dirfrags "
+       "name=val,type=CephString "
+       "name=yes_i_really_mean_it,type=CephBool,req=false",
        "set mds parameter <var> to <val>", "mds", "rw", FLAG(OBSOLETE))
 COMMAND_WITH_FLAG("mds freeze name=role_or_gid,type=CephString"
        " name=val,type=CephString",
@@ -343,141 +324,147 @@ COMMAND_WITH_FLAG("mds freeze name=role_or_gid,type=CephString"
 // arbitrary limit 0-20 below; worth standing on head to make it
 // relate to actual state definitions?
 // #include "include/ceph_fs.h"
-COMMAND_WITH_FLAG("mds set_state " \
-       "name=gid,type=CephInt,range=0 " \
-       "name=state,type=CephInt,range=0|20", \
+COMMAND_WITH_FLAG("mds set_state "
+       "name=gid,type=CephInt,range=0 "
+       "name=state,type=CephInt,range=0|20",
        "set mds state of <gid> to <numeric-state>", "mds", "rw", FLAG(HIDDEN))
-COMMAND("mds fail name=role_or_gid,type=CephString", \
+COMMAND("mds fail name=role_or_gid,type=CephString",
        "Mark MDS failed: trigger a failover if a standby is available",
         "mds", "rw")
-COMMAND("mds repaired name=role,type=CephString", \
+COMMAND("mds repaired name=role,type=CephString",
        "mark a damaged MDS rank as no longer damaged", "mds", "rw")
-COMMAND("mds rm " \
-       "name=gid,type=CephInt,range=0", \
+COMMAND("mds rm "
+       "name=gid,type=CephInt,range=0",
        "remove nonactive mds", "mds", "rw")
-COMMAND_WITH_FLAG("mds rmfailed name=role,type=CephString " \
-        "name=yes_i_really_mean_it,type=CephBool,req=false", \
+COMMAND_WITH_FLAG("mds rmfailed name=role,type=CephString "
+        "name=yes_i_really_mean_it,type=CephBool,req=false",
        "remove failed rank", "mds", "rw", FLAG(HIDDEN))
 COMMAND_WITH_FLAG("mds cluster_down", "take MDS cluster down", "mds", "rw", FLAG(OBSOLETE))
 COMMAND_WITH_FLAG("mds cluster_up", "bring MDS cluster up", "mds", "rw", FLAG(OBSOLETE))
-COMMAND("mds compat rm_compat " \
-       "name=feature,type=CephInt,range=0", \
+COMMAND("mds compat rm_compat "
+       "name=feature,type=CephInt,range=0",
        "remove compatible feature", "mds", "rw")
-COMMAND("mds compat rm_incompat " \
-       "name=feature,type=CephInt,range=0", \
+COMMAND("mds compat rm_incompat "
+       "name=feature,type=CephInt,range=0",
        "remove incompatible feature", "mds", "rw")
-COMMAND_WITH_FLAG("mds add_data_pool " \
-       "name=pool,type=CephString", \
+COMMAND_WITH_FLAG("mds add_data_pool "
+       "name=pool,type=CephString",
        "add data pool <pool>", "mds", "rw", FLAG(OBSOLETE))
-COMMAND_WITH_FLAG("mds rm_data_pool " \
-       "name=pool,type=CephString", \
+COMMAND_WITH_FLAG("mds rm_data_pool "
+       "name=pool,type=CephString",
        "remove data pool <pool>", "mds", "rw", FLAG(OBSOLETE))
-COMMAND_WITH_FLAG("mds remove_data_pool " \
-       "name=pool,type=CephString", \
+COMMAND_WITH_FLAG("mds remove_data_pool "
+       "name=pool,type=CephString",
        "remove data pool <pool>", "mds", "rw", FLAG(OBSOLETE))
-COMMAND_WITH_FLAG("mds newfs " \
-       "name=metadata,type=CephInt,range=0 " \
-       "name=data,type=CephInt,range=0 " \
-       "name=yes_i_really_mean_it,type=CephBool,req=false", \
-       "make new filesystem using pools <metadata> and <data>", \
+COMMAND_WITH_FLAG("mds newfs "
+       "name=metadata,type=CephInt,range=0 "
+       "name=data,type=CephInt,range=0 "
+       "name=yes_i_really_mean_it,type=CephBool,req=false",
+       "make new filesystem using pools <metadata> and <data>",
        "mds", "rw", FLAG(OBSOLETE))
-COMMAND("fs new " \
-       "name=fs_name,type=CephString " \
-       "name=metadata,type=CephString " \
-       "name=data,type=CephString " \
-       "name=force,type=CephBool,req=false " \
-       "name=allow_dangerous_metadata_overlay,type=CephBool,req=false", \
-       "make new filesystem using named pools <metadata> and <data>", \
+COMMAND("fs new "
+       "name=fs_name,type=CephString "
+       "name=metadata,type=CephString "
+       "name=data,type=CephString "
+       "name=force,type=CephBool,req=false "
+       "name=allow_dangerous_metadata_overlay,type=CephBool,req=false",
+       "make new filesystem using named pools <metadata> and <data>",
        "fs", "rw")
-COMMAND("fs fail " \
-       "name=fs_name,type=CephString ", \
-       "bring the file system down and all of its ranks", \
+COMMAND("fs fail "
+       "name=fs_name,type=CephString ",
+       "bring the file system down and all of its ranks",
        "fs", "rw")
-COMMAND("fs rm " \
-       "name=fs_name,type=CephString " \
-       "name=yes_i_really_mean_it,type=CephBool,req=false", \
-       "disable the named filesystem", \
+COMMAND("fs rm "
+       "name=fs_name,type=CephString "
+       "name=yes_i_really_mean_it,type=CephBool,req=false",
+       "disable the named filesystem",
        "fs", "rw")
-COMMAND("fs reset " \
-       "name=fs_name,type=CephString " \
-       "name=yes_i_really_mean_it,type=CephBool,req=false", \
-       "disaster recovery only: reset to a single-MDS map", \
+COMMAND("fs reset "
+       "name=fs_name,type=CephString "
+       "name=yes_i_really_mean_it,type=CephBool,req=false",
+       "disaster recovery only: reset to a single-MDS map",
        "fs", "rw")
-COMMAND("fs ls ", \
-       "list filesystems", \
+COMMAND("fs ls ",
+       "list filesystems",
        "fs", "r")
-COMMAND("fs get name=fs_name,type=CephString", \
-       "get info about one filesystem", \
+COMMAND("fs get name=fs_name,type=CephString",
+       "get info about one filesystem",
        "fs", "r")
-COMMAND("fs set " \
-       "name=fs_name,type=CephString " \
+COMMAND("fs set "
+       "name=fs_name,type=CephString "
        "name=var,type=CephChoices,strings=max_mds|max_file_size"
-        "|allow_new_snaps|inline_data|cluster_down|allow_dirfrags|balancer" \
-        "|standby_count_wanted|session_timeout|session_autoclose" \
-        "|allow_standby_replay|down|joinable|min_compat_client " \
-       "name=val,type=CephString "                                     \
-       "name=yes_i_really_mean_it,type=CephBool,req=false",                    \
+        "|allow_new_snaps|inline_data|cluster_down|allow_dirfrags|balancer"
+        "|standby_count_wanted|session_timeout|session_autoclose"
+        "|allow_standby_replay|down|joinable|min_compat_client "
+       "name=val,type=CephString "
+       "name=yes_i_really_mean_it,type=CephBool,req=false "
+       "name=yes_i_really_really_mean_it,type=CephBool,req=false",
        "set fs parameter <var> to <val>", "mds", "rw")
 COMMAND("fs flag set name=flag_name,type=CephChoices,strings=enable_multiple "
-        "name=val,type=CephString " \
-       "name=yes_i_really_mean_it,type=CephBool,req=false", \
-       "Set a global CephFS flag", \
+        "name=val,type=CephString "
+       "name=yes_i_really_mean_it,type=CephBool,req=false",
+       "Set a global CephFS flag",
        "fs", "rw")
-COMMAND("fs add_data_pool name=fs_name,type=CephString " \
-       "name=pool,type=CephString", \
+COMMAND("fs add_data_pool name=fs_name,type=CephString "
+       "name=pool,type=CephString",
        "add data pool <pool>", "mds", "rw")
-COMMAND("fs rm_data_pool name=fs_name,type=CephString " \
-       "name=pool,type=CephString", \
+COMMAND("fs rm_data_pool name=fs_name,type=CephString "
+       "name=pool,type=CephString",
        "remove data pool <pool>", "mds", "rw")
-COMMAND_WITH_FLAG("fs set_default name=fs_name,type=CephString",       \
-                 "set the default to the named filesystem",            \
-                 "fs", "rw",                           \
+COMMAND_WITH_FLAG("fs set_default name=fs_name,type=CephString",
+                 "set the default to the named filesystem",
+                 "fs", "rw",
                  FLAG(DEPRECATED))
-COMMAND("fs set-default name=fs_name,type=CephString", \
-       "set the default to the named filesystem", \
+COMMAND("fs set-default name=fs_name,type=CephString",
+       "set the default to the named filesystem",
        "fs", "rw")
 
 /*
  * Monmap commands
  */
-COMMAND("mon dump " \
-       "name=epoch,type=CephInt,range=0,req=false", \
-       "dump formatted monmap (optionally from epoch)", \
+COMMAND("mon dump "
+       "name=epoch,type=CephInt,range=0,req=false",
+       "dump formatted monmap (optionally from epoch)",
        "mon", "r")
 COMMAND("mon stat", "summarize monitor status", "mon", "r")
-COMMAND("mon getmap " \
-       "name=epoch,type=CephInt,range=0,req=false", \
+COMMAND("mon getmap "
+       "name=epoch,type=CephInt,range=0,req=false",
        "get monmap", "mon", "r")
-COMMAND("mon add " \
-       "name=name,type=CephString " \
-       "name=addr,type=CephIPAddr", \
+COMMAND("mon add "
+       "name=name,type=CephString "
+       "name=addr,type=CephIPAddr",
        "add new monitor named <name> at <addr>", "mon", "rw")
-COMMAND("mon rm " \
-       "name=name,type=CephString", \
+COMMAND("mon rm "
+       "name=name,type=CephString",
        "remove monitor named <name>", "mon", "rw")
-COMMAND_WITH_FLAG("mon remove " \
-       "name=name,type=CephString", \
-       "remove monitor named <name>", "mon", "rw", \
+COMMAND_WITH_FLAG("mon remove "
+       "name=name,type=CephString",
+       "remove monitor named <name>", "mon", "rw",
     FLAG(DEPRECATED))
-COMMAND("mon feature ls " \
-        "name=with_value,type=CephChoices,strings=--with-value,req=false", \
-        "list available mon map features to be set/unset", \
+COMMAND("mon feature ls "
+        "name=with_value,type=CephChoices,strings=--with-value,req=false",
+        "list available mon map features to be set/unset",
         "mon", "r")
-COMMAND("mon feature set " \
-        "name=feature_name,type=CephString " \
-       "name=yes_i_really_mean_it,type=CephBool,req=false", \
-        "set provided feature on mon map", \
+COMMAND("mon feature set "
+        "name=feature_name,type=CephString "
+       "name=yes_i_really_mean_it,type=CephBool,req=false",
+        "set provided feature on mon map",
         "mon", "rw")
-COMMAND("mon set-rank " \
-       "name=name,type=CephString " \
+COMMAND("mon set-rank "
+       "name=name,type=CephString "
        "name=rank,type=CephInt",
        "set the rank for the specified mon",
        "mon", "rw")
-COMMAND("mon set-addrs " \
-       "name=name,type=CephString " \
+COMMAND("mon set-addrs "
+       "name=name,type=CephString "
        "name=addrs,type=CephString",
        "set the addrs (IPs and ports) a specific monitor binds to",
        "mon", "rw")
+COMMAND("mon set-weight "
+        "name=name,type=CephString "
+        "name=weight,type=CephInt,range=0|65535",
+        "set the weight for the specified mon",
+        "mon", "rw")
 COMMAND("mon enable-msgr2",
        "enable the msgr2 protocol on port 3300",
        "mon", "rw")
@@ -486,237 +473,241 @@ COMMAND("mon enable-msgr2",
  * OSD commands
  */
 COMMAND("osd stat", "print summary of OSD map", "osd", "r")
-COMMAND("osd dump " \
+COMMAND("osd dump "
        "name=epoch,type=CephInt,range=0,req=false",
        "print summary of OSD 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", \
+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",
        "print OSD tree", "osd", "r")
-COMMAND("osd tree-from " \
-       "name=epoch,type=CephInt,range=0,req=false " \
-       "name=bucket,type=CephString " \
-       "name=states,type=CephChoices,strings=up|down|in|out|destroyed,n=N,req=false", \
+COMMAND("osd tree-from "
+       "name=epoch,type=CephInt,range=0,req=false "
+       "name=bucket,type=CephString "
+       "name=states,type=CephChoices,strings=up|down|in|out|destroyed,n=N,req=false",
        "print OSD tree in bucket", "osd", "r")
-COMMAND("osd ls " \
-       "name=epoch,type=CephInt,range=0,req=false", \
+COMMAND("osd ls "
+       "name=epoch,type=CephInt,range=0,req=false",
        "show all OSD ids", "osd", "r")
-COMMAND("osd getmap " \
-       "name=epoch,type=CephInt,range=0,req=false", \
+COMMAND("osd getmap "
+       "name=epoch,type=CephInt,range=0,req=false",
        "get OSD map", "osd", "r")
-COMMAND("osd getcrushmap " \
-       "name=epoch,type=CephInt,range=0,req=false", \
+COMMAND("osd getcrushmap "
+       "name=epoch,type=CephInt,range=0,req=false",
        "get CRUSH map", "osd", "r")
 COMMAND("osd getmaxosd", "show largest OSD id", "osd", "r")
-COMMAND("osd ls-tree " \
+COMMAND("osd ls-tree "
         "name=epoch,type=CephInt,range=0,req=false "
-        "name=name,type=CephString,req=true", \
-        "show OSD ids under bucket <name> in the CRUSH map", \
+        "name=name,type=CephString,req=true",
+        "show OSD ids under bucket <name> in the CRUSH map",
         "osd", "r")
-COMMAND("osd find " \
-       "name=id,type=CephOsdName", \
-       "find osd <id> in the CRUSH map and show its location", \
+COMMAND("osd find "
+       "name=id,type=CephOsdName",
+       "find osd <id> in the CRUSH map and show its location",
        "osd", "r")
-COMMAND("osd metadata " \
-       "name=id,type=CephOsdName,req=false", \
-       "fetch metadata for osd {id} (default all)", \
+COMMAND("osd metadata "
+       "name=id,type=CephOsdName,req=false",
+       "fetch metadata for osd {id} (default all)",
        "osd", "r")
 COMMAND("osd count-metadata name=property,type=CephString",
        "count OSDs by metadata field property",
        "osd", "r")
-COMMAND("osd versions", \
+COMMAND("osd versions",
        "check running versions of OSDs",
        "osd", "r")
 COMMAND("osd numa-status",
        "show NUMA status of OSDs",
        "osd", "r")
-COMMAND("osd map " \
-       "name=pool,type=CephPoolname " \
-       "name=object,type=CephObjectname " \
-       "name=nspace,type=CephString,req=false", \
+COMMAND("osd map "
+       "name=pool,type=CephPoolname "
+       "name=object,type=CephObjectname "
+       "name=nspace,type=CephString,req=false",
        "find pg for <object> in <pool> with [namespace]", "osd", "r")
-COMMAND_WITH_FLAG("osd lspools",               \
+COMMAND_WITH_FLAG("osd lspools",
                  "list pools", "osd", "r", FLAG(DEPRECATED))
 COMMAND_WITH_FLAG("osd crush rule list", "list crush rules", "osd", "r",
                  FLAG(DEPRECATED))
 COMMAND("osd crush rule ls", "list crush rules", "osd", "r")
-COMMAND("osd crush rule ls-by-class " \
-        "name=class,type=CephString,goodchars=[A-Za-z0-9-_.]", \
-        "list all crush rules that reference the same <class>", \
+COMMAND("osd crush rule ls-by-class "
+        "name=class,type=CephString,goodchars=[A-Za-z0-9-_.]",
+        "list all crush rules that reference the same <class>",
         "osd", "r")
-COMMAND("osd crush rule dump " \
-       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.],req=false", \
-       "dump crush rule <name> (default all)", \
+COMMAND("osd crush rule dump "
+       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.],req=false",
+       "dump crush rule <name> (default all)",
        "osd", "r")
-COMMAND("osd crush dump", \
-       "dump crush map", \
+COMMAND("osd crush dump",
+       "dump crush map",
        "osd", "r")
-COMMAND("osd setcrushmap name=prior_version,type=CephInt,req=false", \
-       "set crush map from input file",        \
+COMMAND("osd setcrushmap name=prior_version,type=CephInt,req=false",
+       "set crush map from input file",
        "osd", "rw")
-COMMAND("osd crush set name=prior_version,type=CephInt,req=false", \
-       "set crush map from input file",        \
+COMMAND("osd crush set name=prior_version,type=CephInt,req=false",
+       "set crush map from input file",
        "osd", "rw")
-COMMAND("osd crush add-bucket " \
-       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] " \
-        "name=type,type=CephString " \
-        "name=args,type=CephString,n=N,goodchars=[A-Za-z0-9-_.=],req=false", \
-       "add no-parent (probably root) crush bucket <name> of type <type> " \
-        "to location <args>", \
+COMMAND("osd crush add-bucket "
+       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] "
+        "name=type,type=CephString "
+        "name=args,type=CephString,n=N,goodchars=[A-Za-z0-9-_.=],req=false",
+       "add no-parent (probably root) crush bucket <name> of type <type> "
+        "to location <args>",
        "osd", "rw")
-COMMAND("osd crush rename-bucket " \
-       "name=srcname,type=CephString,goodchars=[A-Za-z0-9-_.] " \
-       "name=dstname,type=CephString,goodchars=[A-Za-z0-9-_.]", \
-       "rename bucket <srcname> to <dstname>", \
+COMMAND("osd crush rename-bucket "
+       "name=srcname,type=CephString,goodchars=[A-Za-z0-9-_.] "
+       "name=dstname,type=CephString,goodchars=[A-Za-z0-9-_.]",
+       "rename bucket <srcname> to <dstname>",
        "osd", "rw")
-COMMAND("osd crush set " \
-       "name=id,type=CephOsdName " \
-       "name=weight,type=CephFloat,range=0.0 " \
-       "name=args,type=CephString,n=N,goodchars=[A-Za-z0-9-_.=]", \
-       "update crushmap position and weight for <name> to <weight> with location <args>", \
+COMMAND("osd crush set "
+       "name=id,type=CephOsdName "
+       "name=weight,type=CephFloat,range=0.0 "
+       "name=args,type=CephString,n=N,goodchars=[A-Za-z0-9-_.=]",
+       "update crushmap position and weight for <name> to <weight> with location <args>",
        "osd", "rw")
-COMMAND("osd crush add " \
-       "name=id,type=CephOsdName " \
-       "name=weight,type=CephFloat,range=0.0 " \
-       "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>", \
+COMMAND("osd crush add "
+       "name=id,type=CephOsdName "
+       "name=weight,type=CephFloat,range=0.0 "
+       "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")
 COMMAND("osd crush set-all-straw-buckets-to-straw2",
         "convert all CRUSH current straw buckets to use the straw2 algorithm",
        "osd", "rw")
-COMMAND("osd crush class create " \
-        "name=class,type=CephString,goodchars=[A-Za-z0-9-_]", \
-        "create crush device class <class>", \
+COMMAND("osd crush class create "
+        "name=class,type=CephString,goodchars=[A-Za-z0-9-_]",
+        "create crush device class <class>",
         "osd", "rw")
-COMMAND("osd crush class rm " \
-        "name=class,type=CephString,goodchars=[A-Za-z0-9-_]", \
-        "remove crush device class <class>", \
+COMMAND("osd crush class rm "
+        "name=class,type=CephString,goodchars=[A-Za-z0-9-_]",
+        "remove crush device class <class>",
         "osd", "rw")
-COMMAND("osd crush set-device-class " \
-        "name=class,type=CephString " \
-       "name=ids,type=CephString,n=N", \
-       "set the <class> of the osd(s) <id> [<id>...]," \
-        "or use <all|any> to set all.", \
+COMMAND("osd crush set-device-class "
+        "name=class,type=CephString "
+       "name=ids,type=CephString,n=N",
+       "set the <class> of the osd(s) <id> [<id>...],"
+        "or use <all|any> to set all.",
        "osd", "rw")
-COMMAND("osd crush rm-device-class " \
-        "name=ids,type=CephString,n=N", \
-        "remove class of the osd(s) <id> [<id>...]," \
-        "or use <all|any> to remove all.", \
+COMMAND("osd crush rm-device-class "
+        "name=ids,type=CephString,n=N",
+        "remove class of the osd(s) <id> [<id>...],"
+        "or use <all|any> to remove all.",
         "osd", "rw")
-COMMAND("osd crush class rename " \
-        "name=srcname,type=CephString,goodchars=[A-Za-z0-9-_] " \
-        "name=dstname,type=CephString,goodchars=[A-Za-z0-9-_]", \
-        "rename crush device class <srcname> to <dstname>", \
+COMMAND("osd crush class rename "
+        "name=srcname,type=CephString,goodchars=[A-Za-z0-9-_] "
+        "name=dstname,type=CephString,goodchars=[A-Za-z0-9-_]",
+        "rename crush device class <srcname> to <dstname>",
         "osd", "rw")
-COMMAND("osd crush create-or-move " \
-       "name=id,type=CephOsdName " \
-       "name=weight,type=CephFloat,range=0.0 " \
-       "name=args,type=CephString,n=N,goodchars=[A-Za-z0-9-_.=]", \
-       "create entry or move existing entry for <name> <weight> at/to location <args>", \
+COMMAND("osd crush create-or-move "
+       "name=id,type=CephOsdName "
+       "name=weight,type=CephFloat,range=0.0 "
+       "name=args,type=CephString,n=N,goodchars=[A-Za-z0-9-_.=]",
+       "create entry or move existing entry for <name> <weight> at/to location <args>",
        "osd", "rw")
-COMMAND("osd crush move " \
-       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] " \
-       "name=args,type=CephString,n=N,goodchars=[A-Za-z0-9-_.=]", \
-       "move existing entry for <name> to location <args>", \
+COMMAND("osd crush move "
+       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] "
+       "name=args,type=CephString,n=N,goodchars=[A-Za-z0-9-_.=]",
+       "move existing entry for <name> to location <args>",
        "osd", "rw")
-COMMAND("osd crush swap-bucket " \
-       "name=source,type=CephString,goodchars=[A-Za-z0-9-_.] " \
-       "name=dest,type=CephString,goodchars=[A-Za-z0-9-_.] " \
-       "name=yes_i_really_mean_it,type=CephBool,req=false", \
-       "swap existing bucket contents from (orphan) bucket <source> and <target>", \
+COMMAND("osd crush swap-bucket "
+       "name=source,type=CephString,goodchars=[A-Za-z0-9-_.] "
+       "name=dest,type=CephString,goodchars=[A-Za-z0-9-_.] "
+       "name=yes_i_really_mean_it,type=CephBool,req=false",
+       "swap existing bucket contents from (orphan) bucket <source> and <target>",
        "osd", "rw")
-COMMAND("osd crush link " \
-       "name=name,type=CephString " \
-       "name=args,type=CephString,n=N,goodchars=[A-Za-z0-9-_.=]", \
-       "link existing entry for <name> under location <args>", \
+COMMAND("osd crush link "
+       "name=name,type=CephString "
+       "name=args,type=CephString,n=N,goodchars=[A-Za-z0-9-_.=]",
+       "link existing entry for <name> under location <args>",
        "osd", "rw")
-COMMAND("osd crush rm " \
-       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] " \
-       "name=ancestor,type=CephString,req=false,goodchars=[A-Za-z0-9-_.]", \
+COMMAND("osd crush rm "
+       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] "
+       "name=ancestor,type=CephString,req=false,goodchars=[A-Za-z0-9-_.]",
        "remove <name> from crush map (everywhere, or just at <ancestor>)",\
        "osd", "rw")
-COMMAND_WITH_FLAG("osd crush remove " \
-       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] " \
-       "name=ancestor,type=CephString,req=false,goodchars=[A-Za-z0-9-_.]", \
-       "remove <name> from crush map (everywhere, or just at <ancestor>)", \
-       "osd", "rw", \
+COMMAND_WITH_FLAG("osd crush remove "
+       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] "
+       "name=ancestor,type=CephString,req=false,goodchars=[A-Za-z0-9-_.]",
+       "remove <name> from crush map (everywhere, or just at <ancestor>)",
+       "osd", "rw",
     FLAG(DEPRECATED))
-COMMAND("osd crush unlink " \
-       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] " \
-       "name=ancestor,type=CephString,req=false,goodchars=[A-Za-z0-9-_.]", \
-       "unlink <name> from crush map (everywhere, or just at <ancestor>)", \
+COMMAND("osd crush unlink "
+       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] "
+       "name=ancestor,type=CephString,req=false,goodchars=[A-Za-z0-9-_.]",
+       "unlink <name> from crush map (everywhere, or just at <ancestor>)",
        "osd", "rw")
 COMMAND("osd crush reweight-all",
        "recalculate the weights for the tree to ensure they sum correctly",
        "osd", "rw")
-COMMAND("osd crush reweight " \
-       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] " \
-       "name=weight,type=CephFloat,range=0.0", \
-       "change <name>'s weight to <weight> in crush map", \
+COMMAND("osd crush reweight "
+       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] "
+       "name=weight,type=CephFloat,range=0.0",
+       "change <name>'s weight to <weight> in crush map",
        "osd", "rw")
-COMMAND("osd crush reweight-subtree " \
-       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] " \
-       "name=weight,type=CephFloat,range=0.0", \
-       "change all leaf items beneath <name> to <weight> in crush map", \
+COMMAND("osd crush reweight-subtree "
+       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] "
+       "name=weight,type=CephFloat,range=0.0",
+       "change all leaf items beneath <name> to <weight> in crush map",
        "osd", "rw")
-COMMAND("osd crush tunables " \
-       "name=profile,type=CephChoices,strings=legacy|argonaut|bobtail|firefly|hammer|jewel|optimal|default", \
+COMMAND("osd crush tunables "
+       "name=profile,type=CephChoices,strings=legacy|argonaut|bobtail|firefly|hammer|jewel|optimal|default",
        "set crush tunables values to <profile>", "osd", "rw")
-COMMAND("osd crush set-tunable "                                   \
-       "name=tunable,type=CephChoices,strings=straw_calc_version " \
+COMMAND("osd crush set-tunable "
+       "name=tunable,type=CephChoices,strings=straw_calc_version "
        "name=value,type=CephInt",
        "set crush tunable <tunable> to <value>",
        "osd", "rw")
-COMMAND("osd crush get-tunable "                             \
+COMMAND("osd crush get-tunable "
        "name=tunable,type=CephChoices,strings=straw_calc_version",
        "get crush tunable <tunable>",
        "osd", "r")
-COMMAND("osd crush show-tunables", \
+COMMAND("osd crush show-tunables",
        "show current crush tunables", "osd", "r")
-COMMAND("osd crush rule create-simple " \
-       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] " \
-       "name=root,type=CephString,goodchars=[A-Za-z0-9-_.] " \
-       "name=type,type=CephString,goodchars=[A-Za-z0-9-_.] " \
+COMMAND("osd crush rule create-simple "
+       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] "
+       "name=root,type=CephString,goodchars=[A-Za-z0-9-_.] "
+       "name=type,type=CephString,goodchars=[A-Za-z0-9-_.] "
        "name=mode,type=CephChoices,strings=firstn|indep,req=false",
-       "create crush rule <name> to start from <root>, replicate across buckets of type <type>, using a choose mode of <firstn|indep> (default firstn; indep best for erasure pools)", \
+       "create crush rule <name> to start from <root>, replicate across buckets of type <type>, using a choose mode of <firstn|indep> (default firstn; indep best for erasure pools)",
        "osd", "rw")
-COMMAND("osd crush rule create-replicated " \
-       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] " \
-       "name=root,type=CephString,goodchars=[A-Za-z0-9-_.] " \
-       "name=type,type=CephString,goodchars=[A-Za-z0-9-_.] " \
+COMMAND("osd crush rule create-replicated "
+       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] "
+       "name=root,type=CephString,goodchars=[A-Za-z0-9-_.] "
+       "name=type,type=CephString,goodchars=[A-Za-z0-9-_.] "
        "name=class,type=CephString,goodchars=[A-Za-z0-9-_.],req=false",
-       "create crush rule <name> for replicated pool to start from <root>, replicate across buckets of type <type>, use devices of type <class> (ssd or hdd)", \
+       "create crush rule <name> for replicated pool to start from <root>, replicate across buckets of type <type>, use devices of type <class> (ssd or hdd)",
        "osd", "rw")
-COMMAND("osd crush rule create-erasure " \
-       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] " \
-       "name=profile,type=CephString,req=false,goodchars=[A-Za-z0-9-_.=]", \
-       "create crush rule <name> for erasure coded pool created with <profile> (default default)", \
+COMMAND("osd crush rule create-erasure "
+       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] "
+       "name=profile,type=CephString,req=false,goodchars=[A-Za-z0-9-_.=]",
+       "create crush rule <name> for erasure coded pool created with <profile> (default default)",
        "osd", "rw")
-COMMAND("osd crush rule rm " \
-       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] ",  \
+COMMAND("osd crush rule rm "
+       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] ",
        "remove crush rule <name>", "osd", "rw")
-COMMAND("osd crush rule rename " \
-        "name=srcname,type=CephString,goodchars=[A-Za-z0-9-_.] "  \
-        "name=dstname,type=CephString,goodchars=[A-Za-z0-9-_.]",  \
+COMMAND("osd crush rule rename "
+        "name=srcname,type=CephString,goodchars=[A-Za-z0-9-_.] "
+        "name=dstname,type=CephString,goodchars=[A-Za-z0-9-_.]",
         "rename crush rule <srcname> to <dstname>",
         "osd", "rw")
 COMMAND("osd crush tree "
-        "name=shadow,type=CephChoices,strings=--show-shadow,req=false", \
+        "name=shadow,type=CephChoices,strings=--show-shadow,req=false",
        "dump crush buckets and items in a tree view",
        "osd", "r")
 COMMAND("osd crush ls name=node,type=CephString,goodchars=[A-Za-z0-9-_.]",
        "list items beneath a node in the CRUSH tree",
        "osd", "r")
-COMMAND("osd crush class ls", \
-       "list all crush device classes", \
+COMMAND("osd crush class ls",
+       "list all crush device classes",
        "osd", "r")
-COMMAND("osd crush class ls-osd " \
-        "name=class,type=CephString,goodchars=[A-Za-z0-9-_]", \
-        "list all osds belonging to the specific <class>", \
+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")
-COMMAND("osd crush get-device-class " \
-        "name=ids,type=CephString,n=N", \
-        "get classes of specified osd(s) <id> [<id>...]", \
+COMMAND("osd crush get-device-class "
+        "name=ids,type=CephString,n=N",
+        "get classes of specified osd(s) <id> [<id>...]",
         "osd", "r")
 COMMAND("osd crush weight-set ls",
        "list crush weight sets",
@@ -727,7 +718,7 @@ COMMAND("osd crush weight-set dump",
 COMMAND("osd crush weight-set create-compat",
        "create a default backward-compatible weight-set",
        "osd", "rw")
-COMMAND("osd crush weight-set create "         \
+COMMAND("osd crush weight-set create "
         "name=pool,type=CephPoolname "\
         "name=mode,type=CephChoices,strings=flat|positional",
        "create a weight-set for a given pool",
@@ -738,323 +729,349 @@ COMMAND("osd crush weight-set rm name=pool,type=CephPoolname",
 COMMAND("osd crush weight-set rm-compat",
        "remove the backward-compatible weight-set",
        "osd", "rw")
-COMMAND("osd crush weight-set reweight "               \
-        "name=pool,type=CephPoolname "                 \
-       "name=item,type=CephString "                    \
+COMMAND("osd crush weight-set reweight "
+        "name=pool,type=CephPoolname "
+       "name=item,type=CephString "
         "name=weight,type=CephFloat,range=0.0,n=N",
        "set weight for an item (bucket or osd) in a pool's weight-set",
        "osd", "rw")
-COMMAND("osd crush weight-set reweight-compat "                \
-       "name=item,type=CephString "                    \
+COMMAND("osd crush weight-set reweight-compat "
+       "name=item,type=CephString "
         "name=weight,type=CephFloat,range=0.0,n=N",
        "set weight for an item (bucket or osd) in the backward-compatible weight-set",
        "osd", "rw")
-COMMAND("osd setmaxosd " \
-       "name=newmax,type=CephInt,range=0", \
+COMMAND("osd setmaxosd "
+       "name=newmax,type=CephInt,range=0",
        "set new maximum osd value", "osd", "rw")
-COMMAND("osd set-full-ratio " \
-       "name=ratio,type=CephFloat,range=0.0|1.0", \
+COMMAND("osd set-full-ratio "
+       "name=ratio,type=CephFloat,range=0.0|1.0",
        "set usage ratio at which OSDs are marked full",
        "osd", "rw")
-COMMAND("osd set-backfillfull-ratio " \
-       "name=ratio,type=CephFloat,range=0.0|1.0", \
+COMMAND("osd set-backfillfull-ratio "
+       "name=ratio,type=CephFloat,range=0.0|1.0",
        "set usage ratio at which OSDs are marked too full to backfill",
        "osd", "rw")
-COMMAND("osd set-nearfull-ratio " \
-       "name=ratio,type=CephFloat,range=0.0|1.0", \
+COMMAND("osd set-nearfull-ratio "
+       "name=ratio,type=CephFloat,range=0.0|1.0",
        "set usage ratio at which OSDs are marked near-full",
        "osd", "rw")
 COMMAND("osd get-require-min-compat-client",
         "get the minimum client version we will maintain compatibility with",
         "osd", "r")
-COMMAND("osd set-require-min-compat-client " \
-       "name=version,type=CephString " \
-        "name=yes_i_really_mean_it,type=CephBool,req=false", \
+COMMAND("osd set-require-min-compat-client "
+       "name=version,type=CephString "
+        "name=yes_i_really_mean_it,type=CephBool,req=false",
        "set the minimum client version we will maintain compatibility with",
        "osd", "rw")
 COMMAND("osd pause", "pause osd", "osd", "rw")
 COMMAND("osd unpause", "unpause osd", "osd", "rw")
-COMMAND("osd erasure-code-profile set " \
-       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] " \
-       "name=profile,type=CephString,n=N,req=false " \
-       "name=force,type=CephBool,req=false", \
-       "create erasure code profile <name> with [<key[=value]> ...] pairs. Add a --force at the end to override an existing profile (VERY DANGEROUS)", \
+COMMAND("osd erasure-code-profile set "
+       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] "
+       "name=profile,type=CephString,n=N,req=false "
+       "name=force,type=CephBool,req=false",
+       "create erasure code profile <name> with [<key[=value]> ...] pairs. Add a --force at the end to override an existing profile (VERY DANGEROUS)",
        "osd", "rw")
-COMMAND("osd erasure-code-profile get " \
-       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.]", \
-       "get erasure code profile <name>", \
+COMMAND("osd erasure-code-profile get "
+       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.]",
+       "get erasure code profile <name>",
        "osd", "r")
-COMMAND("osd erasure-code-profile rm " \
-       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.]", \
-       "remove erasure code profile <name>", \
+COMMAND("osd erasure-code-profile rm "
+       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.]",
+       "remove erasure code profile <name>",
        "osd", "rw")
-COMMAND("osd erasure-code-profile ls", \
-       "list all erasure code profiles", \
+COMMAND("osd erasure-code-profile ls",
+       "list all erasure code profiles",
        "osd", "r")
-COMMAND("osd set " \
-       "name=key,type=CephChoices,strings=full|pause|noup|nodown|" \
-       "noout|noin|nobackfill|norebalance|norecover|noscrub|nodeep-scrub|" \
-       "notieragent|nosnaptrim|pglog_hardlimit " \
-        "name=yes_i_really_mean_it,type=CephBool,req=false", \
+COMMAND("osd set "
+       "name=key,type=CephChoices,strings=full|pause|noup|nodown|"
+       "noout|noin|nobackfill|norebalance|norecover|noscrub|nodeep-scrub|"
+       "notieragent|nosnaptrim|pglog_hardlimit "
+        "name=yes_i_really_mean_it,type=CephBool,req=false",
        "set <key>", "osd", "rw")
-COMMAND("osd unset " \
+COMMAND("osd unset "
        "name=key,type=CephChoices,strings=full|pause|noup|nodown|"\
-       "noout|noin|nobackfill|norebalance|norecover|noscrub|nodeep-scrub|" \
-       "notieragent|nosnaptrim", \
+       "noout|noin|nobackfill|norebalance|norecover|noscrub|nodeep-scrub|"
+       "notieragent|nosnaptrim",
        "unset <key>", "osd", "rw")
 COMMAND("osd require-osd-release "\
-       "name=release,type=CephChoices,strings=luminous|mimic|nautilus " \
-        "name=yes_i_really_mean_it,type=CephBool,req=false", \
+       "name=release,type=CephChoices,strings=luminous|mimic|nautilus|octopus "
+        "name=yes_i_really_mean_it,type=CephBool,req=false",
        "set the minimum allowed OSD release to participate in the cluster",
        "osd", "rw")
-COMMAND("osd down " \
-       "type=CephString,name=ids,n=N", \
-       "set osd(s) <id> [<id>...] down, " \
-        "or use <any|all> to set all osds down", \
+COMMAND("osd down "
+       "name=ids,type=CephString,n=N "
+       "name=definitely_dead,type=CephBool,req=false",
+       "set osd(s) <id> [<id>...] down, "
+        "or use <any|all> to set all osds down",
         "osd", "rw")
-COMMAND("osd out " \
-       "name=ids,type=CephString,n=N", \
-       "set osd(s) <id> [<id>...] out, " \
-        "or use <any|all> to set all osds out", \
+COMMAND("osd stop "
+        "type=CephString,name=ids,n=N",
+        "stop the corresponding osd daemons and mark them as down",
+        "osd", "rw")
+COMMAND("osd out "
+       "name=ids,type=CephString,n=N",
+       "set osd(s) <id> [<id>...] out, "
+        "or use <any|all> to set all osds out",
         "osd", "rw")
-COMMAND("osd in " \
-       "name=ids,type=CephString,n=N", \
+COMMAND("osd in "
+       "name=ids,type=CephString,n=N",
        "set osd(s) <id> [<id>...] in, "
-        "can use <any|all> to automatically set all previously out osds in", \
+        "can use <any|all> to automatically set all previously out osds in",
         "osd", "rw")
-COMMAND_WITH_FLAG("osd rm " \
-       "name=ids,type=CephString,n=N", \
+COMMAND_WITH_FLAG("osd rm "
+       "name=ids,type=CephString,n=N",
        "remove osd(s) <id> [<id>...], "
-        "or use <any|all> to remove all osds", \
+        "or use <any|all> to remove all osds",
        "osd", "rw",
        FLAG(DEPRECATED))
-COMMAND("osd add-noup " \
-        "name=ids,type=CephString,n=N", \
-        "mark osd(s) <id> [<id>...] as noup, " \
-        "or use <all|any> to mark all osds as noup", \
-        "osd", "rw")
-COMMAND("osd add-nodown " \
-        "name=ids,type=CephString,n=N", \
-        "mark osd(s) <id> [<id>...] as nodown, " \
-        "or use <all|any> to mark all osds as nodown", \
-        "osd", "rw")
-COMMAND("osd add-noin " \
-        "name=ids,type=CephString,n=N", \
-        "mark osd(s) <id> [<id>...] as noin, " \
-        "or use <all|any> to mark all osds as noin", \
+COMMAND_WITH_FLAG("osd add-noup "
+        "name=ids,type=CephString,n=N",
+        "mark osd(s) <id> [<id>...] as noup, "
+        "or use <all|any> to mark all osds as noup",
+        "osd", "rw",
+        FLAG(DEPRECATED))
+COMMAND_WITH_FLAG("osd add-nodown "
+        "name=ids,type=CephString,n=N",
+        "mark osd(s) <id> [<id>...] as nodown, "
+        "or use <all|any> to mark all osds as nodown",
+        "osd", "rw",
+        FLAG(DEPRECATED))
+COMMAND_WITH_FLAG("osd add-noin "
+        "name=ids,type=CephString,n=N",
+        "mark osd(s) <id> [<id>...] as noin, "
+        "or use <all|any> to mark all osds as noin",
+        "osd", "rw",
+        FLAG(DEPRECATED))
+COMMAND_WITH_FLAG("osd add-noout "
+        "name=ids,type=CephString,n=N",
+        "mark osd(s) <id> [<id>...] as noout, "
+        "or use <all|any> to mark all osds as noout",
+        "osd", "rw",
+        FLAG(DEPRECATED))
+COMMAND_WITH_FLAG("osd rm-noup "
+        "name=ids,type=CephString,n=N",
+        "allow osd(s) <id> [<id>...] to be marked up "
+        "(if they are currently marked as noup), "
+        "can use <all|any> to automatically filter out all noup osds",
+        "osd", "rw",
+        FLAG(DEPRECATED))
+COMMAND_WITH_FLAG("osd rm-nodown "
+        "name=ids,type=CephString,n=N",
+        "allow osd(s) <id> [<id>...] to be marked down "
+        "(if they are currently marked as nodown), "
+        "can use <all|any> to automatically filter out all nodown osds",
+        "osd", "rw",
+        FLAG(DEPRECATED))
+COMMAND_WITH_FLAG("osd rm-noin "
+        "name=ids,type=CephString,n=N",
+        "allow osd(s) <id> [<id>...] to be marked in "
+        "(if they are currently marked as noin), "
+        "can use <all|any> to automatically filter out all noin osds",
+        "osd", "rw",
+        FLAG(DEPRECATED))
+COMMAND_WITH_FLAG("osd rm-noout "
+        "name=ids,type=CephString,n=N",
+        "allow osd(s) <id> [<id>...] to be marked out "
+        "(if they are currently marked as noout), "
+        "can use <all|any> to automatically filter out all noout osds",
+        "osd", "rw",
+        FLAG(DEPRECATED))
+COMMAND("osd set-group "
+        "name=flags,type=CephString "
+        "name=who,type=CephString,n=N",
+        "set <flags> for batch osds or crush nodes, "
+        "<flags> must be a comma-separated subset of {noup,nodown,noin,noout}",
         "osd", "rw")
-COMMAND("osd add-noout " \
-        "name=ids,type=CephString,n=N", \
-        "mark osd(s) <id> [<id>...] as noout, " \
-        "or use <all|any> to mark all osds as noout", \
+COMMAND("osd unset-group "
+        "name=flags,type=CephString "
+        "name=who,type=CephString,n=N",
+        "unset <flags> for batch osds or crush nodes, "
+        "<flags> must be a comma-separated subset of {noup,nodown,noin,noout}",
         "osd", "rw")
-COMMAND("osd rm-noup " \
-        "name=ids,type=CephString,n=N", \
-        "allow osd(s) <id> [<id>...] to be marked up " \
-        "(if they are currently marked as noup), " \
-        "can use <all|any> to automatically filter out all noup osds", \
-        "osd", "rw")
-COMMAND("osd rm-nodown " \
-        "name=ids,type=CephString,n=N", \
-        "allow osd(s) <id> [<id>...] to be marked down " \
-        "(if they are currently marked as nodown), " \
-        "can use <all|any> to automatically filter out all nodown osds", \
-        "osd", "rw")
-COMMAND("osd rm-noin " \
-        "name=ids,type=CephString,n=N", \
-        "allow osd(s) <id> [<id>...] to be marked in " \
-        "(if they are currently marked as noin), " \
-        "can use <all|any> to automatically filter out all noin osds", \
-        "osd", "rw")
-COMMAND("osd rm-noout " \
-        "name=ids,type=CephString,n=N", \
-        "allow osd(s) <id> [<id>...] to be marked out " \
-        "(if they are currently marked as noout), " \
-        "can use <all|any> to automatically filter out all noout osds", \
-        "osd", "rw")
-COMMAND("osd reweight " \
-       "name=id,type=CephOsdName " \
-       "type=CephFloat,name=weight,range=0.0|1.0", \
+COMMAND("osd reweight "
+       "name=id,type=CephOsdName "
+       "type=CephFloat,name=weight,range=0.0|1.0",
        "reweight osd to 0.0 < <weight> < 1.0", "osd", "rw")
-COMMAND("osd reweightn " \
+COMMAND("osd reweightn "
        "name=weights,type=CephString",
        "reweight osds with {<id>: <weight>,...})",
        "osd", "rw")
-COMMAND("osd force-create-pg " \
+COMMAND("osd force-create-pg "
        "name=pgid,type=CephPgid "\
-       "name=yes_i_really_mean_it,type=CephBool,req=false", \
+       "name=yes_i_really_mean_it,type=CephBool,req=false",
        "force creation of pg <pgid>",
         "osd", "rw")
-COMMAND("osd pg-temp " \
-       "name=pgid,type=CephPgid " \
-       "name=id,type=CephOsdName,n=N,req=false", \
-       "set pg_temp mapping pgid:[<id> [<id>...]] (developers only)", \
+COMMAND("osd pg-temp "
+       "name=pgid,type=CephPgid "
+       "name=id,type=CephOsdName,n=N,req=false",
+       "set pg_temp mapping pgid:[<id> [<id>...]] (developers only)",
         "osd", "rw")
-COMMAND("osd pg-upmap " \
-       "name=pgid,type=CephPgid " \
-       "name=id,type=CephOsdName,n=N", \
-       "set pg_upmap mapping <pgid>:[<id> [<id>...]] (developers only)", \
+COMMAND("osd pg-upmap "
+       "name=pgid,type=CephPgid "
+       "name=id,type=CephOsdName,n=N",
+       "set pg_upmap mapping <pgid>:[<id> [<id>...]] (developers only)",
         "osd", "rw")
-COMMAND("osd rm-pg-upmap " \
-       "name=pgid,type=CephPgid",                                      \
-       "clear pg_upmap mapping for <pgid> (developers only)", \
+COMMAND("osd rm-pg-upmap "
+       "name=pgid,type=CephPgid",
+       "clear pg_upmap mapping for <pgid> (developers only)",
         "osd", "rw")
-COMMAND("osd pg-upmap-items " \
-       "name=pgid,type=CephPgid " \
-       "name=id,type=CephOsdName,n=N", \
-       "set pg_upmap_items mapping <pgid>:{<id> to <id>, [...]} (developers only)", \
+COMMAND("osd pg-upmap-items "
+       "name=pgid,type=CephPgid "
+       "name=id,type=CephOsdName,n=N",
+       "set pg_upmap_items mapping <pgid>:{<id> to <id>, [...]} (developers only)",
         "osd", "rw")
-COMMAND("osd rm-pg-upmap-items " \
-       "name=pgid,type=CephPgid",                \
-       "clear pg_upmap_items mapping for <pgid> (developers only)", \
+COMMAND("osd rm-pg-upmap-items "
+       "name=pgid,type=CephPgid",
+       "clear pg_upmap_items mapping for <pgid> (developers only)",
         "osd", "rw")
-COMMAND("osd primary-temp " \
-       "name=pgid,type=CephPgid " \
-       "name=id,type=CephOsdName", \
-        "set primary_temp mapping pgid:<id>|-1 (developers only)", \
+COMMAND("osd primary-temp "
+       "name=pgid,type=CephPgid "
+       "name=id,type=CephOsdName",
+        "set primary_temp mapping pgid:<id>|-1 (developers only)",
         "osd", "rw")
-COMMAND("osd primary-affinity " \
-       "name=id,type=CephOsdName " \
-       "type=CephFloat,name=weight,range=0.0|1.0", \
-       "adjust osd primary-affinity from 0.0 <= <weight> <= 1.0", \
+COMMAND("osd primary-affinity "
+       "name=id,type=CephOsdName "
+       "type=CephFloat,name=weight,range=0.0|1.0",
+       "adjust osd primary-affinity from 0.0 <= <weight> <= 1.0",
        "osd", "rw")
-COMMAND_WITH_FLAG("osd destroy-actual "            \
-        "name=id,type=CephOsdName " \
-        "name=yes_i_really_mean_it,type=CephBool,req=false", \
-        "mark osd as being destroyed. Keeps the ID intact (allowing reuse), " \
+COMMAND_WITH_FLAG("osd destroy-actual "
+        "name=id,type=CephOsdName "
+        "name=yes_i_really_mean_it,type=CephBool,req=false",
+        "mark osd as being destroyed. Keeps the ID intact (allowing reuse), "
         "but removes cephx keys, config-key data and lockbox keys, "\
-        "rendering data permanently unreadable.", \
+        "rendering data permanently unreadable.",
                  "osd", "rw", FLAG(HIDDEN))
-COMMAND("osd purge-new " \
-        "name=id,type=CephOsdName " \
-        "name=yes_i_really_mean_it,type=CephBool,req=false", \
-        "purge all traces of an OSD that was partially created but never " \
-       "started", \
+COMMAND("osd purge-new "
+        "name=id,type=CephOsdName "
+        "name=yes_i_really_mean_it,type=CephBool,req=false",
+        "purge all traces of an OSD that was partially created but never "
+       "started",
         "osd", "rw")
-COMMAND_WITH_FLAG("osd purge-actual " \
-        "name=id,type=CephOsdName " \
-        "name=yes_i_really_mean_it,type=CephBool,req=false", \
-        "purge all osd data from the monitors. Combines `osd destroy`, " \
-        "`osd rm`, and `osd crush rm`.", \
+COMMAND_WITH_FLAG("osd purge-actual "
+        "name=id,type=CephOsdName "
+        "name=yes_i_really_mean_it,type=CephBool,req=false",
+        "purge all osd data from the monitors. Combines `osd destroy`, "
+        "`osd rm`, and `osd crush rm`.",
                  "osd", "rw", FLAG(HIDDEN))
-COMMAND("osd lost " \
-       "name=id,type=CephOsdName " \
-       "name=yes_i_really_mean_it,type=CephBool,req=false", \
-       "mark osd as permanently lost. THIS DESTROYS DATA IF NO MORE REPLICAS EXIST, BE CAREFUL", \
+COMMAND("osd lost "
+       "name=id,type=CephOsdName "
+       "name=yes_i_really_mean_it,type=CephBool,req=false",
+       "mark osd as permanently lost. THIS DESTROYS DATA IF NO MORE REPLICAS EXIST, BE CAREFUL",
        "osd", "rw")
-COMMAND_WITH_FLAG("osd create " \
-       "name=uuid,type=CephUUID,req=false " \
-       "name=id,type=CephOsdName,req=false", \
+COMMAND_WITH_FLAG("osd create "
+       "name=uuid,type=CephUUID,req=false "
+       "name=id,type=CephOsdName,req=false",
        "create new osd (with optional UUID and ID)", "osd", "rw",
        FLAG(DEPRECATED))
-COMMAND("osd new " \
-        "name=uuid,type=CephUUID,req=true " \
-        "name=id,type=CephOsdName,req=false", \
-        "Create a new OSD. If supplied, the `id` to be replaced needs to " \
-        "exist and have been previously destroyed. " \
-        "Reads secrets from JSON file via `-i <file>` (see man page).", \
+COMMAND("osd new "
+        "name=uuid,type=CephUUID,req=true "
+        "name=id,type=CephOsdName,req=false",
+        "Create a new OSD. If supplied, the `id` to be replaced needs to "
+        "exist and have been previously destroyed. "
+        "Reads secrets from JSON file via `-i <file>` (see man page).",
         "osd", "rw")
-COMMAND("osd blacklist " \
-       "name=blacklistop,type=CephChoices,strings=add|rm " \
-       "name=addr,type=CephEntityAddr " \
-       "name=expire,type=CephFloat,range=0.0,req=false", \
-       "add (optionally until <expire> seconds from now) or remove <addr> from blacklist", \
+COMMAND("osd blacklist "
+       "name=blacklistop,type=CephChoices,strings=add|rm "
+       "name=addr,type=CephEntityAddr "
+       "name=expire,type=CephFloat,range=0.0,req=false",
+       "add (optionally until <expire> seconds from now) or remove <addr> from blacklist",
        "osd", "rw")
 COMMAND("osd blacklist ls", "show blacklisted clients", "osd", "r")
 COMMAND("osd blacklist clear", "clear all blacklisted clients", "osd", "rw")
-COMMAND("osd pool mksnap " \
-       "name=pool,type=CephPoolname " \
-       "name=snap,type=CephString", \
+COMMAND("osd pool mksnap "
+       "name=pool,type=CephPoolname "
+       "name=snap,type=CephString",
        "make snapshot <snap> in <pool>", "osd", "rw")
-COMMAND("osd pool rmsnap " \
-       "name=pool,type=CephPoolname " \
-       "name=snap,type=CephString", \
+COMMAND("osd pool rmsnap "
+       "name=pool,type=CephPoolname "
+       "name=snap,type=CephString",
        "remove snapshot <snap> from <pool>", "osd", "rw")
-COMMAND("osd pool ls " \
-       "name=detail,type=CephChoices,strings=detail,req=false", \
+COMMAND("osd pool ls "
+       "name=detail,type=CephChoices,strings=detail,req=false",
        "list pools", "osd", "r")
-COMMAND("osd pool create " \
-       "name=pool,type=CephPoolname " \
-       "name=pg_num,type=CephInt,range=0 " \
-       "name=pgp_num,type=CephInt,range=0,req=false " \
-        "name=pool_type,type=CephChoices,strings=replicated|erasure,req=false " \
-       "name=erasure_code_profile,type=CephString,req=false,goodchars=[A-Za-z0-9-_.] " \
-       "name=rule,type=CephString,req=false " \
-        "name=expected_num_objects,type=CephInt,req=false " \
-        "name=size,type=CephInt,req=false " \
-       "name=pg_num_min,type=CephInt,range=0,req=false " \
-       "name=target_size_bytes,type=CephInt,range=0,req=false " \
+COMMAND("osd pool create "
+       "name=pool,type=CephPoolname "
+       "name=pg_num,type=CephInt,range=0,req=false "
+       "name=pgp_num,type=CephInt,range=0,req=false "
+        "name=pool_type,type=CephChoices,strings=replicated|erasure,req=false "
+       "name=erasure_code_profile,type=CephString,req=false,goodchars=[A-Za-z0-9-_.] "
+       "name=rule,type=CephString,req=false "
+        "name=expected_num_objects,type=CephInt,range=0,req=false "
+        "name=size,type=CephInt,range=0,req=false "
+       "name=pg_num_min,type=CephInt,range=0,req=false "
+       "name=autoscale_mode,type=CephChoices,strings=on|off|warn,req=false "
+       "name=target_size_bytes,type=CephInt,range=0,req=false "
        "name=target_size_ratio,type=CephFloat,range=0|1,req=false",\
        "create pool", "osd", "rw")
-COMMAND_WITH_FLAG("osd pool delete " \
-       "name=pool,type=CephPoolname " \
-       "name=pool2,type=CephPoolname,req=false " \
+COMMAND_WITH_FLAG("osd pool delete "
+       "name=pool,type=CephPoolname "
+       "name=pool2,type=CephPoolname,req=false "
        "name=yes_i_really_really_mean_it,type=CephBool,req=false "
-       "name=yes_i_really_really_mean_it_not_faking,type=CephBool,req=false ", \
-       "delete pool", \
-       "osd", "rw", \
+       "name=yes_i_really_really_mean_it_not_faking,type=CephBool,req=false ",
+       "delete pool",
+       "osd", "rw",
     FLAG(DEPRECATED))
-COMMAND("osd pool rm " \
-       "name=pool,type=CephPoolname " \
-       "name=pool2,type=CephPoolname,req=false " \
+COMMAND("osd pool rm "
+       "name=pool,type=CephPoolname "
+       "name=pool2,type=CephPoolname,req=false "
        "name=yes_i_really_really_mean_it,type=CephBool,req=false "
-       "name=yes_i_really_really_mean_it_not_faking,type=CephBool,req=false ", \
-       "remove pool", \
+       "name=yes_i_really_really_mean_it_not_faking,type=CephBool,req=false ",
+       "remove pool",
        "osd", "rw")
-COMMAND("osd pool rename " \
-       "name=srcpool,type=CephPoolname " \
-       "name=destpool,type=CephPoolname", \
+COMMAND("osd pool rename "
+       "name=srcpool,type=CephPoolname "
+       "name=destpool,type=CephPoolname",
        "rename <srcpool> to <destpool>", "osd", "rw")
-COMMAND("osd pool get " \
-       "name=pool,type=CephPoolname " \
-       "name=var,type=CephChoices,strings=size|min_size|pg_num|pgp_num|crush_rule|hashpspool|nodelete|nopgchange|nosizechange|write_fadvise_dontneed|noscrub|nodeep-scrub|hit_set_type|hit_set_period|hit_set_count|hit_set_fpp|use_gmt_hitset|target_max_objects|target_max_bytes|cache_target_dirty_ratio|cache_target_dirty_high_ratio|cache_target_full_ratio|cache_min_flush_age|cache_min_evict_age|erasure_code_profile|min_read_recency_for_promote|all|min_write_recency_for_promote|fast_read|hit_set_grade_decay_rate|hit_set_search_last_n|scrub_min_interval|scrub_max_interval|deep_scrub_interval|recovery_priority|recovery_op_priority|scrub_priority|compression_mode|compression_algorithm|compression_required_ratio|compression_max_blob_size|compression_min_blob_size|csum_type|csum_min_block|csum_max_block|allow_ec_overwrites|fingerprint_algorithm|pg_autoscale_mode|pg_autoscale_bias|pg_num_min|target_size_bytes|target_size_ratio", \
+COMMAND("osd pool get "
+       "name=pool,type=CephPoolname "
+       "name=var,type=CephChoices,strings=size|min_size|pg_num|pgp_num|crush_rule|hashpspool|nodelete|nopgchange|nosizechange|write_fadvise_dontneed|noscrub|nodeep-scrub|hit_set_type|hit_set_period|hit_set_count|hit_set_fpp|use_gmt_hitset|target_max_objects|target_max_bytes|cache_target_dirty_ratio|cache_target_dirty_high_ratio|cache_target_full_ratio|cache_min_flush_age|cache_min_evict_age|erasure_code_profile|min_read_recency_for_promote|all|min_write_recency_for_promote|fast_read|hit_set_grade_decay_rate|hit_set_search_last_n|scrub_min_interval|scrub_max_interval|deep_scrub_interval|recovery_priority|recovery_op_priority|scrub_priority|compression_mode|compression_algorithm|compression_required_ratio|compression_max_blob_size|compression_min_blob_size|csum_type|csum_min_block|csum_max_block|allow_ec_overwrites|fingerprint_algorithm|pg_autoscale_mode|pg_autoscale_bias|pg_num_min|target_size_bytes|target_size_ratio",
        "get pool parameter <var>", "osd", "r")
-COMMAND("osd pool set " \
-       "name=pool,type=CephPoolname " \
-       "name=var,type=CephChoices,strings=size|min_size|pg_num|pgp_num|pgp_num_actual|crush_rule|hashpspool|nodelete|nopgchange|nosizechange|write_fadvise_dontneed|noscrub|nodeep-scrub|hit_set_type|hit_set_period|hit_set_count|hit_set_fpp|use_gmt_hitset|target_max_bytes|target_max_objects|cache_target_dirty_ratio|cache_target_dirty_high_ratio|cache_target_full_ratio|cache_min_flush_age|cache_min_evict_age|min_read_recency_for_promote|min_write_recency_for_promote|fast_read|hit_set_grade_decay_rate|hit_set_search_last_n|scrub_min_interval|scrub_max_interval|deep_scrub_interval|recovery_priority|recovery_op_priority|scrub_priority|compression_mode|compression_algorithm|compression_required_ratio|compression_max_blob_size|compression_min_blob_size|csum_type|csum_min_block|csum_max_block|allow_ec_overwrites|fingerprint_algorithm|pg_autoscale_mode|pg_autoscale_bias|pg_num_min|target_size_bytes|target_size_ratio " \
-       "name=val,type=CephString " \
-       "name=yes_i_really_mean_it,type=CephBool,req=false", \
+COMMAND("osd pool set "
+       "name=pool,type=CephPoolname "
+       "name=var,type=CephChoices,strings=size|min_size|pg_num|pgp_num|pgp_num_actual|crush_rule|hashpspool|nodelete|nopgchange|nosizechange|write_fadvise_dontneed|noscrub|nodeep-scrub|hit_set_type|hit_set_period|hit_set_count|hit_set_fpp|use_gmt_hitset|target_max_bytes|target_max_objects|cache_target_dirty_ratio|cache_target_dirty_high_ratio|cache_target_full_ratio|cache_min_flush_age|cache_min_evict_age|min_read_recency_for_promote|min_write_recency_for_promote|fast_read|hit_set_grade_decay_rate|hit_set_search_last_n|scrub_min_interval|scrub_max_interval|deep_scrub_interval|recovery_priority|recovery_op_priority|scrub_priority|compression_mode|compression_algorithm|compression_required_ratio|compression_max_blob_size|compression_min_blob_size|csum_type|csum_min_block|csum_max_block|allow_ec_overwrites|fingerprint_algorithm|pg_autoscale_mode|pg_autoscale_bias|pg_num_min|target_size_bytes|target_size_ratio "
+       "name=val,type=CephString "
+       "name=yes_i_really_mean_it,type=CephBool,req=false",
        "set pool parameter <var> to <val>", "osd", "rw")
 // 'val' is a CephString because it can include a unit.  Perhaps
 // there should be a Python type for validation/conversion of strings
 // with units.
-COMMAND("osd pool set-quota " \
-       "name=pool,type=CephPoolname " \
-       "name=field,type=CephChoices,strings=max_objects|max_bytes " \
+COMMAND("osd pool set-quota "
+       "name=pool,type=CephPoolname "
+       "name=field,type=CephChoices,strings=max_objects|max_bytes "
        "name=val,type=CephString",
        "set object or byte limit on pool", "osd", "rw")
-COMMAND("osd pool get-quota " \
+COMMAND("osd pool get-quota "
         "name=pool,type=CephPoolname ",
         "obtain object or byte limits for pool",
         "osd", "r")
-COMMAND("osd pool application enable " \
-        "name=pool,type=CephPoolname " \
-        "name=app,type=CephString,goodchars=[A-Za-z0-9-_.] " \
-       "name=yes_i_really_mean_it,type=CephBool,req=false", \
+COMMAND("osd pool application enable "
+        "name=pool,type=CephPoolname "
+        "name=app,type=CephString,goodchars=[A-Za-z0-9-_.] "
+       "name=yes_i_really_mean_it,type=CephBool,req=false",
         "enable use of an application <app> [cephfs,rbd,rgw] on pool <poolname>",
         "osd", "rw")
-COMMAND("osd pool application disable " \
-        "name=pool,type=CephPoolname " \
-        "name=app,type=CephString " \
-       "name=yes_i_really_mean_it,type=CephBool,req=false", \
+COMMAND("osd pool application disable "
+        "name=pool,type=CephPoolname "
+        "name=app,type=CephString "
+       "name=yes_i_really_mean_it,type=CephBool,req=false",
         "disables use of an application <app> on pool <poolname>",
         "osd", "rw")
-COMMAND("osd pool application set " \
-        "name=pool,type=CephPoolname " \
-        "name=app,type=CephString " \
-        "name=key,type=CephString,goodchars=[A-Za-z0-9-_.] " \
+COMMAND("osd pool application set "
+        "name=pool,type=CephPoolname "
+        "name=app,type=CephString "
+        "name=key,type=CephString,goodchars=[A-Za-z0-9-_.] "
         "name=value,type=CephString,goodchars=[A-Za-z0-9-_.=]",
         "sets application <app> metadata key <key> to <value> on pool <poolname>",
         "osd", "rw")
-COMMAND("osd pool application rm " \
-        "name=pool,type=CephPoolname " \
-        "name=app,type=CephString " \
+COMMAND("osd pool application rm "
+        "name=pool,type=CephPoolname "
+        "name=app,type=CephString "
         "name=key,type=CephString",
         "removes application <app> metadata key <key> on pool <poolname>",
         "osd", "rw")
-COMMAND("osd pool application get " \
-        "name=pool,type=CephPoolname,req=fasle " \
-        "name=app,type=CephString,req=false " \
+COMMAND("osd pool application get "
+        "name=pool,type=CephPoolname,req=fasle "
+        "name=app,type=CephString,req=false "
         "name=key,type=CephString,req=false",
         "get value of key <key> of application <app> on pool <poolname>",
         "osd", "r")
@@ -1063,99 +1080,99 @@ COMMAND("osd utilization",
        "osd", "r")
 
 // tiering
-COMMAND("osd tier add " \
-       "name=pool,type=CephPoolname " \
-       "name=tierpool,type=CephPoolname " \
+COMMAND("osd tier add "
+       "name=pool,type=CephPoolname "
+       "name=tierpool,type=CephPoolname "
        "name=force_nonempty,type=CephChoices,strings=--force-nonempty,req=false",
-       "add the tier <tierpool> (the second one) to base pool <pool> (the first one)", \
+       "add the tier <tierpool> (the second one) to base pool <pool> (the first one)",
        "osd", "rw")
-COMMAND("osd tier rm " \
-       "name=pool,type=CephPoolname " \
+COMMAND("osd tier rm "
+       "name=pool,type=CephPoolname "
        "name=tierpool,type=CephPoolname",
-       "remove the tier <tierpool> (the second one) from base pool <pool> (the first one)", \
+       "remove the tier <tierpool> (the second one) from base pool <pool> (the first one)",
        "osd", "rw")
-COMMAND_WITH_FLAG("osd tier remove " \
-       "name=pool,type=CephPoolname " \
+COMMAND_WITH_FLAG("osd tier remove "
+       "name=pool,type=CephPoolname "
        "name=tierpool,type=CephPoolname",
-       "remove the tier <tierpool> (the second one) from base pool <pool> (the first one)", \
-       "osd", "rw", \
+       "remove the tier <tierpool> (the second one) from base pool <pool> (the first one)",
+       "osd", "rw",
     FLAG(DEPRECATED))
-COMMAND("osd tier cache-mode " \
-       "name=pool,type=CephPoolname " \
-       "name=mode,type=CephChoices,strings=none|writeback|forward|readonly|readforward|proxy|readproxy " \
-       "name=yes_i_really_mean_it,type=CephBool,req=false", \
+COMMAND("osd tier cache-mode "
+       "name=pool,type=CephPoolname "
+       "name=mode,type=CephChoices,strings=writeback|readproxy|readonly|none "
+       "name=yes_i_really_mean_it,type=CephBool,req=false",
        "specify the caching mode for cache tier <pool>", "osd", "rw")
-COMMAND("osd tier set-overlay " \
-       "name=pool,type=CephPoolname " \
-       "name=overlaypool,type=CephPoolname", \
+COMMAND("osd tier set-overlay "
+       "name=pool,type=CephPoolname "
+       "name=overlaypool,type=CephPoolname",
        "set the overlay pool for base pool <pool> to be <overlaypool>", "osd", "rw")
-COMMAND("osd tier rm-overlay " \
-       "name=pool,type=CephPoolname ", \
+COMMAND("osd tier rm-overlay "
+       "name=pool,type=CephPoolname ",
        "remove the overlay pool for base pool <pool>", "osd", "rw")
-COMMAND_WITH_FLAG("osd tier remove-overlay " \
-       "name=pool,type=CephPoolname ", \
-       "remove the overlay pool for base pool <pool>", "osd", "rw", \
+COMMAND_WITH_FLAG("osd tier remove-overlay "
+       "name=pool,type=CephPoolname ",
+       "remove the overlay pool for base pool <pool>", "osd", "rw",
     FLAG(DEPRECATED))
 
-COMMAND("osd tier add-cache " \
-       "name=pool,type=CephPoolname " \
-       "name=tierpool,type=CephPoolname " \
-       "name=size,type=CephInt,range=0", \
-       "add a cache <tierpool> (the second one) of size <size> to existing pool <pool> (the first one)", \
+COMMAND("osd tier add-cache "
+       "name=pool,type=CephPoolname "
+       "name=tierpool,type=CephPoolname "
+       "name=size,type=CephInt,range=0",
+       "add a cache <tierpool> (the second one) of size <size> to existing pool <pool> (the first one)",
        "osd", "rw")
 
 /*
  * mon/ConfigKeyService.cc
  */
 
-COMMAND("config-key get " \
-       "name=key,type=CephString", \
+COMMAND("config-key get "
+       "name=key,type=CephString",
        "get <key>", "config-key", "r")
-COMMAND("config-key set " \
-       "name=key,type=CephString " \
-       "name=val,type=CephString,req=false", \
+COMMAND("config-key set "
+       "name=key,type=CephString "
+       "name=val,type=CephString,req=false",
        "set <key> to value <val>", "config-key", "rw")
-COMMAND_WITH_FLAG("config-key put " \
-                 "name=key,type=CephString " \
-                 "name=val,type=CephString,req=false",                 \
+COMMAND_WITH_FLAG("config-key put "
+                 "name=key,type=CephString "
+                 "name=val,type=CephString,req=false",
                  "put <key>, value <val>", "config-key", "rw",
                  FLAG(DEPRECATED))
-COMMAND_WITH_FLAG("config-key del " \
-       "name=key,type=CephString", \
-       "delete <key>", "config-key", "rw", \
+COMMAND_WITH_FLAG("config-key del "
+       "name=key,type=CephString",
+       "delete <key>", "config-key", "rw",
     FLAG(DEPRECATED))
-COMMAND("config-key rm " \
-       "name=key,type=CephString", \
+COMMAND("config-key rm "
+       "name=key,type=CephString",
        "rm <key>", "config-key", "rw")
-COMMAND("config-key exists " \
-       "name=key,type=CephString", \
+COMMAND("config-key exists "
+       "name=key,type=CephString",
        "check for <key>'s existence", "config-key", "r")
 COMMAND_WITH_FLAG("config-key list ", "list keys", "config-key", "r",
                  FLAG(DEPRECATED))
 COMMAND("config-key ls ", "list keys", "config-key", "r")
-COMMAND("config-key dump " \
+COMMAND("config-key dump "
        "name=key,type=CephString,req=false", "dump keys and values (with optional prefix)", "config-key", "r")
 
 
 /*
  * mon/MgrMonitor.cc
  */
-COMMAND("mgr dump "                                 \
-       "name=epoch,type=CephInt,range=0,req=false", \
-       "dump the latest MgrMap",                    \
+COMMAND("mgr dump "
+       "name=epoch,type=CephInt,range=0,req=false",
+       "dump the latest MgrMap",
        "mgr", "r")
-COMMAND("mgr fail name=who,type=CephString", \
+COMMAND("mgr fail name=who,type=CephString,req=false",
        "treat the named manager daemon as failed", "mgr", "rw")
 COMMAND("mgr module ls",
        "list active mgr modules", "mgr", "r")
 COMMAND("mgr services",
        "list service endpoints provided by mgr modules",
         "mgr", "r")
-COMMAND("mgr module enable "                                           \
-       "name=module,type=CephString "                                  \
+COMMAND("mgr module enable "
+       "name=module,type=CephString "
        "name=force,type=CephChoices,strings=--force,req=false",
        "enable mgr module", "mgr", "rw")
-COMMAND("mgr module disable "                                          \
+COMMAND("mgr module disable "
        "name=module,type=CephString",
        "disable mgr module", "mgr", "rw")
 COMMAND("mgr metadata name=who,type=CephString,req=false",
@@ -1164,32 +1181,32 @@ COMMAND("mgr metadata name=who,type=CephString,req=false",
 COMMAND("mgr count-metadata name=property,type=CephString",
        "count ceph-mgr daemons by metadata field property",
        "mgr", "r")
-COMMAND("mgr versions", \
+COMMAND("mgr versions",
        "check running versions of ceph-mgr daemons",
        "mgr", "r")
 
 // ConfigMonitor
-COMMAND("config set" \
-       " name=who,type=CephString" \
-       " name=name,type=CephString" \
-       " name=value,type=CephString" \
+COMMAND("config set"
+       " name=who,type=CephString"
+       " name=name,type=CephString"
+       " name=value,type=CephString"
        " name=force,type=CephBool,req=false",
        "Set a configuration option for one or more entities",
        "config", "rw")
-COMMAND("config rm"                                            \
-       " name=who,type=CephString" \
+COMMAND("config rm"
+       " name=who,type=CephString"
        " name=name,type=CephString",
        "Clear a configuration option for one or more entities",
        "config", "rw")
-COMMAND("config get " \
-       "name=who,type=CephString " \
+COMMAND("config get "
+       "name=who,type=CephString "
        "name=key,type=CephString,req=False",
        "Show configuration option(s) for an entity",
        "config", "r")
 COMMAND("config dump",
        "Show all configuration option(s)",
        "mon", "r")
-COMMAND("config help " \
+COMMAND("config help "
        "name=key,type=CephString",
        "Describe a configuration option",
        "config", "r")
@@ -1202,14 +1219,78 @@ COMMAND("config assimilate-conf",
 COMMAND("config log name=num,type=CephInt,req=False",
        "Show recent history of config changes",
        "config", "r")
-COMMAND("config reset" \
-       " name=num,type=CephInt",
-       "Revert configuration to previous state",
+COMMAND("config reset "
+       "name=num,type=CephInt,range=0",
+       "Revert configuration to a historical version specified by <num>",
        "config", "rw")
 COMMAND("config generate-minimal-conf",
        "Generate a minimal ceph.conf file",
        "config", "r")
 
+
+
+
+// these are tell commands that were implemented as CLI commands in
+// the broken pre-octopus way that we want to allow to work when a
+// monitor has upgraded to octopus+ but the monmap min_mon_release is
+// still < octopus.  we exclude things that weren't well supported
+// before and that aren't implemented by the octopus mon anymore.
+//
+// the command set below matches the kludge in Monitor::handle_command
+// that shunts these off to the asok machinery.
+
+COMMAND_WITH_FLAG("injectargs "
+           "name=injected_args,type=CephString,n=N",
+           "inject config arguments into monitor", "mon", "rw",
+            FLAG(TELL))
 COMMAND_WITH_FLAG("smart name=devid,type=CephString,req=false",
-                 "Query health metrics for underlying device",
-                 "mon", "rw", FLAG(HIDDEN))
+            "Query health metrics for underlying device",
+           "mon", "rw",
+            FLAG(TELL))
+COMMAND_WITH_FLAG("mon_status",
+           "report status of monitors",
+           "mon", "r",
+            FLAG(TELL))
+COMMAND_WITH_FLAG("heap "
+            "name=heapcmd,type=CephChoices,strings=dump|start_profiler|stop_profiler|release|stats "
+            "name=value,type=CephString,req=false",
+            "show heap usage info (available only if compiled with tcmalloc)",
+           "mon", "rw",
+            FLAG(TELL))
+COMMAND_WITH_FLAG("sync_force "
+            "name=validate,type=CephChoices,strings=--yes-i-really-mean-it,req=false",
+            "force sync of and clear monitor store",
+            "mon", "rw",
+            FLAG(TELL))
+COMMAND_WITH_FLAG("add_bootstrap_peer_hint "
+            "name=addr,type=CephIPAddr",
+            "add peer address as potential bootstrap "
+            "peer for cluster bringup",
+            "mon", "rw",
+            FLAG(TELL))
+COMMAND_WITH_FLAG("add_bootstrap_peer_hintv "
+            "name=addrv,type=CephString",
+            "add peer address vector as potential bootstrap "
+            "peer for cluster bringup",
+            "mon", "rw",
+            FLAG(TELL))
+COMMAND_WITH_FLAG("quorum enter ",
+            "force monitor back into quorum",
+            "mon", "rw",
+            FLAG(TELL))
+COMMAND_WITH_FLAG("quorum exit",
+            "force monitor out of the quorum",
+            "mon", "rw",
+            FLAG(TELL))
+COMMAND_WITH_FLAG("ops",
+            "show the ops currently in flight",
+            "mon", "r",
+            FLAG(TELL))
+COMMAND_WITH_FLAG("sessions",
+            "list existing sessions",
+            "mon", "r",
+            FLAG(TELL))
+COMMAND_WITH_FLAG("dump_historic_ops",
+            "dump_historic_ops",
+            "mon", "r",
+            FLAG(TELL))