]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Monitor: import MonCommands.h from original Dumpling and expose it
authorGreg Farnum <greg@inktank.com>
Mon, 9 Dec 2013 06:17:39 +0000 (22:17 -0800)
committerGreg Farnum <greg@inktank.com>
Mon, 9 Dec 2013 19:26:04 +0000 (11:26 -0800)
If the Elector doesn't receive a set of commands from the elected leader, it
assumes the monitor is "classic" and uses the Dumpling command set as
the leader set.

Signed-off-by: Greg Farnum <greg@inktank.com>
src/mon/DumplingMonCommands.h [new file with mode: 0644]
src/mon/Elector.cc
src/mon/Makefile.am
src/mon/Monitor.cc
src/mon/Monitor.h

diff --git a/src/mon/DumplingMonCommands.h b/src/mon/DumplingMonCommands.h
new file mode 100644 (file)
index 0000000..8e9c2bb
--- /dev/null
@@ -0,0 +1,531 @@
+// -*- 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. 
+ *
+ * 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 
+ * Foundation.  See file COPYING.
+ * 
+ */
+
+/* no guard; may be included multiple times */
+
+/*
+ * Define commands that are reported by the monitor's
+ * "get_command_descriptions" command, and parsed by the Python
+ * frontend 'ceph' (and perhaps by other frontends, such as a RESTful
+ * server). The format is:
+ *
+ * COMMAND(signature, helpstring, modulename, req perms, availability)
+ * where:
+ * signature:  describes the command and its parameters (more below)
+ * helpstring: displays in CLI help, API help (nice if it refers to
+ *             parameter names from signature, 40-a few hundred chars)
+ * modulename: the monitor module or daemon this applies to:
+ *             mds, osd, pg (osd), mon, auth, log, config-key
+ * req perms:  required permission in that modulename space to execute command
+ *             this also controls what type of REST command is accepted
+ * availability: cli, rest, or both
+ *
+ * The commands describe themselves completely enough for the separate
+ * frontend(s) to be able to accept user input and validate it against
+ * the command descriptions, and generate a JSON object that contains
+ * key:value mappings of parameter names to validated parameter values.
+ *
+ * 'signature' is a space-separated list of individual command descriptors;
+ * 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.  
+ *
+ * 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 
+ * interpretation.  A few more non-type-specific key=val pairs exist:
+ *
+ *    req=false marks an optional parameter (default for req is 'true')
+ *    n=<n> is a repeat count for how many of this argument must be supplied.
+ *          n=1 is the default.
+ *          n=N is a special case that means "1 or more".
+ *
+ * A perhaps-incomplete list of types:
+ *
+ * CephInt: Optional: range=min[|max]
+ * CephFloat: Optional range
+ * CephString: optional badchars
+ * CephSocketpath: validation involves "is it S_ISSOCK"
+ * CephIPAddr: v4 or v6 addr with optional port, syntax validated
+ * CephEntityAddr: CephIPAddr + '/nonce'
+ * CephPoolname: Plainold string
+ * CephObjectname: Another plainold string
+ * CephPgid: n.xxx where n is an int > 0, xxx is a hex number > 0
+ * CephName: daemon name, '*' or '<type>.<id>' (id must be int for type osd)
+ * CephOsdName: osd name, '*' or '<id> or 'osd.<id>' (id must be int)
+ * CephChoices: strings="foo|bar" means this param can be either
+ * CephFilepath: openable file
+ * CephFragment: cephfs 'fragID': val/bits, val in hex 0xnnn, bits in dec
+ * CephUUID: uuid in text matching Python uuid.UUID()
+ * CephPrefix: special type assigned to literals
+ *
+ * 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 " \
+ *        "if no input given, and/or any caps specified in the command")
+ *
+ * defines a command "auth add" that takes a required argument "entity"
+ * of type "CephString", and from 1 to N arguments named "caps" of type
+ * CephString, at least one of which is required.  The front end will
+ * validate user input against this description.  Let's say the user
+ * 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 
+ *     - string literals are accumulated into 'prefix'
+ *     - n=1 descriptors are given normal string or int object values
+ *     - n=N descriptors are given array values
+ *
+ * NOTE: be careful with spaces.  Each descriptor must be separated by
+ * one space, no other characters, so if you split lines as above, be
+ * sure to close and reopen the quotes, and be careful to include the '
+ * separating spaces in the quoted string.
+ *
+ * The monitor marshals this JSON into a std::map<string, cmd_vartype>
+* where cmd_vartype is a boost::variant type-enforcing discriminated
+* type, so the monitor is expected to know the type of each argument.
+* See cmdparse.cc/h for more details.
+*/
+
+/*
+ * pg commands PgMonitor.cc
+ */
+
+COMMAND("pg stat", "show placement group status.", "pg", "r", "cli,rest")
+COMMAND("pg getmap", "get binary pg map to -o/stdout", "pg", "r", "cli,rest")
+COMMAND("pg send_pg_creates", "trigger pg creates to be issued",\
+       "pg", "rw", "cli,rest")
+COMMAND("pg dump " \
+       "name=dumpcontents,type=CephChoices,strings=all|summary|sum|pools|osds|pgs|pgs_brief,n=N,req=false", \
+       "show human-readable versions of pg map", "pg", "r", "cli,rest")
+COMMAND("pg dump_json " \
+       "name=dumpcontents,type=CephChoices,strings=all|summary|sum|pools|osds|pgs,n=N,req=false", \
+       "show human-readable version of pg map in json only",\
+       "pg", "r", "cli,rest")
+COMMAND("pg dump_pools_json", "show pg pools info in json only",\
+       "pg", "r", "cli,rest")
+COMMAND("pg dump_stuck " \
+       "name=stuckops,type=CephChoices,strings=inactive|unclean|stale,n=N,req=false " \
+       "name=threshold,type=CephInt,req=false",
+       "show information about stuck pgs",\
+       "pg", "r", "cli,rest")
+COMMAND("pg map name=pgid,type=CephPgid", "show mapping of pg to osds", \
+       "pg", "r", "cli,rest")
+COMMAND("pg scrub name=pgid,type=CephPgid", "start scrub on <pgid>", \
+       "pg", "rw", "cli,rest")
+COMMAND("pg deep-scrub name=pgid,type=CephPgid", "start deep-scrub on <pgid>", \
+       "pg", "rw", "cli,rest")
+COMMAND("pg repair name=pgid,type=CephPgid", "start repair on <pgid>", \
+       "pg", "rw", "cli,rest")
+COMMAND("pg debug " \
+       "name=debugop,type=CephChoices,strings=unfound_objects_exist|degraded_pgs_exist", \
+       "show debug info about pgs", "pg", "r", "cli,rest")
+COMMAND("pg force_create_pg name=pgid,type=CephPgid", \
+       "force creation of pg <pgid>", "pg", "rw", "cli,rest")
+COMMAND("pg set_full_ratio name=ratio,type=CephFloat,range=0.0|1.0", \
+       "set ratio at which pgs are considered full", "pg", "rw", "cli,rest")
+COMMAND("pg set_nearfull_ratio name=ratio,type=CephFloat,range=0.0|1.0", \
+       "set ratio at which pgs are considered nearly full", \
+       "pg", "rw", "cli,rest")
+
+/*
+ * auth commands AuthMonitor.cc
+ */
+
+COMMAND("auth export name=entity,type=CephString,req=false", \
+               "write keyring for requested entity, or master keyring if none given", \
+       "auth", "r", "cli,rest")
+COMMAND("auth get name=entity,type=CephString", \
+       "write keyring file with requested key", "auth", "r", "cli,rest")
+COMMAND("auth get-key name=entity,type=CephString", "display requested key", \
+       "auth", "r", "cli,rest")
+COMMAND("auth print-key name=entity,type=CephString", "display requested key", \
+       "auth", "r", "cli,rest")
+COMMAND("auth print_key name=entity,type=CephString", "display requested key", \
+       "auth", "r", "cli,rest")
+COMMAND("auth list", "list authentication state", "auth", "r", "cli,rest")
+COMMAND("auth import", "auth import: read keyring file from -i <file>", \
+       "auth", "rw", "cli,rest")
+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 given, and/or any caps specified in the command",
+       "auth", "rw", "cli,rest")
+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", "rw", "cli,rest")
+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", "rw", "cli,rest")
+COMMAND("auth caps " \
+       "name=entity,type=CephString " \
+       "name=caps,type=CephString,n=N", \
+       "update caps for <name> from caps specified in the command", \
+       "auth", "rw", "cli,rest")
+COMMAND("auth del " \
+       "name=entity,type=CephString", \
+       "delete all caps for <name>", \
+       "auth", "rw", "cli,rest")
+
+/*
+ * Monitor commands (Monitor.cc)
+ */
+COMMAND("compact", "cause compaction of monitor's leveldb storage", \
+       "mon", "rw", "cli,rest")
+COMMAND("scrub", "scrub the monitor stores", "mon", "rw", "cli,rest")
+COMMAND("fsid", "show cluster FSID/UUID", "mon", "r", "cli,rest")
+COMMAND("log name=logtext,type=CephString,n=N", \
+       "log supplied text to the monitor log", "mon", "rw", "cli,rest")
+COMMAND("injectargs " \
+       "name=injected_args,type=CephString,n=N", \
+       "inject config arguments into monitor", "mon", "rw", "cli,rest")
+COMMAND("status", "show cluster status", "mon", "r", "cli,rest")
+COMMAND("health name=detail,type=CephChoices,strings=detail,req=false", \
+       "show cluster health", "mon", "r", "cli,rest")
+COMMAND("df name=detail,type=CephChoices,strings=detail,req=false", \
+       "show cluster free space stats", "mon", "r", "cli,rest")
+COMMAND("report name=tags,type=CephString,n=N,req=false", \
+       "report full status of cluster, optional title tag strings", \
+       "mon", "r", "cli,rest")
+COMMAND("quorum_status", "report status of monitor quorum", \
+       "mon", "r", "cli,rest")
+COMMAND("mon_status", "report status of monitors", "mon", "r", "cli,rest")
+COMMAND("sync force " \
+       "name=validate1,type=CephChoices,strings=--yes-i-really-mean-it " \
+       "name=validate2,type=CephChoices,strings=--i-know-what-i-am-doing", \
+       "force sync of and clear monitor store", "mon", "rw", "cli,rest")
+COMMAND("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", "cli,rest")
+COMMAND("quorum name=quorumcmd,type=CephChoices,strings=enter|exit,n=1", \
+       "enter or exit quorum", "mon", "rw", "cli,rest")
+COMMAND("tell " \
+       "name=target,type=CephName " \
+       "name=args,type=CephString,n=N", \
+       "send a command to a specific daemon", "mon", "rw", "cli,rest")
+
+/*
+ * MDS commands (MDSMonitor.cc)
+ */
+
+COMMAND("mds stat", "show MDS status", "mds", "r", "cli,rest")
+COMMAND("mds dump " 
+       "name=epoch,type=CephInt,req=false,range=0", \
+       "dump info, optionally from epoch", "mds", "r", "cli,rest")
+COMMAND("mds getmap " \
+       "name=epoch,type=CephInt,req=false,range=0", \
+       "get MDS map, optionally from epoch", "mds", "r", "cli,rest")
+COMMAND("mds tell " \
+       "name=who,type=CephString " \
+       "name=args,type=CephString,n=N", \
+       "send command to particular mds", "mds", "rw", "cli,rest")
+COMMAND("mds compat show", "show mds compatibility settings", \
+       "mds", "r", "cli,rest")
+COMMAND("mds stop name=who,type=CephString", "stop mds", \
+       "mds", "rw", "cli,rest")
+COMMAND("mds deactivate name=who,type=CephString", "stop mds", \
+       "mds", "rw", "cli,rest")
+COMMAND("mds set_max_mds " \
+       "name=maxmds,type=CephInt,range=0", \
+       "set max MDS index", "mds", "rw", "cli,rest")
+COMMAND("mds setmap " \
+       "name=epoch,type=CephInt,range=0", \
+       "set mds map; must supply correct epoch number", "mds", "rw", "cli,rest")
+// arbitrary limit 0-20 below; worth standing on head to make it
+// relate to actual state definitions?
+// #include "include/ceph_fs.h"
+COMMAND("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", "cli,rest")
+COMMAND("mds fail name=who,type=CephString", \
+       "force mds to status failed", "mds", "rw", "cli,rest")
+COMMAND("mds rm " \
+       "name=gid,type=CephInt,range=0 " \
+       "name=who,type=CephName", \
+       "remove nonactive mds", "mds", "rw", "cli,rest")
+COMMAND("mds rmfailed name=who,type=CephInt,range=0", "remove failed mds", \
+       "mds", "rw", "cli,rest")
+COMMAND("mds cluster_down", "take MDS cluster down", "mds", "rw", "cli,rest")
+COMMAND("mds cluster_up", "bring MDS cluster up", "mds", "rw", "cli,rest")
+COMMAND("mds compat rm_compat " \
+       "name=feature,type=CephInt,range=0", \
+       "remove compatible feature", "mds", "rw", "cli,rest")
+COMMAND("mds compat rm_incompat " \
+       "name=feature,type=CephInt,range=0", \
+       "remove incompatible feature", "mds", "rw", "cli,rest")
+COMMAND("mds add_data_pool " \
+       "name=poolid,type=CephInt,range=0", \
+       "add data pool <poolid>", "mds", "rw", "cli,rest")
+COMMAND("mds remove_data_pool " \
+       "name=poolid,type=CephInt,range=0", \
+       "remove data pool <poolid>", "mds", "rw", "cli,rest")
+COMMAND("mds newfs " \
+       "name=metadata,type=CephInt,range=0 " \
+       "name=data,type=CephInt,range=0 " \
+       "name=sure,type=CephChoices,strings=--yes-i-really-mean-it", \
+       "make new filesystom using pools <metadata> and <data>", \
+       "mds", "rw", "cli,rest")
+/*
+ * Monmap commands
+ */
+COMMAND("mon dump " \
+       "name=epoch,type=CephInt,req=false", \
+       "dump formatted monmap (optionally from epoch)", \
+       "mon", "r", "cli,rest")
+COMMAND("mon stat", "summarize monitor status", "mon", "r", "cli,rest")
+COMMAND("mon getmap " \
+       "name=epoch,type=CephInt,range=0,req=false", \
+       "get monmap", "mon", "r", "cli,rest")
+COMMAND("mon add " \
+       "name=name,type=CephString " \
+       "name=addr,type=CephIPAddr", \
+       "add new monitor named <name> at <addr>", "mon", "rw", "cli,rest")
+COMMAND("mon remove " \
+       "name=name,type=CephString", \
+       "remove monitor named <name>", "mon", "rw", "cli,rest")
+
+
+/*
+ * OSD commands
+ */
+COMMAND("osd stat", "print summary of OSD map", "osd", "r", "cli,rest")
+COMMAND("osd dump " \
+       "name=epoch,type=CephInt,range=0,req=false",
+       "print summary of OSD map", "osd", "r", "cli,rest")
+COMMAND("osd tree " \
+       "name=epoch,type=CephInt,range=0,req=false", \
+       "print OSD tree", "osd", "r", "cli,rest")
+COMMAND("osd ls " \
+       "name=epoch,type=CephInt,range=0,req=false", \
+       "show all OSD ids", "osd", "r", "cli,rest")
+COMMAND("osd getmap " \
+       "name=epoch,type=CephInt,range=0,req=false", \
+       "get OSD map", "osd", "r", "cli,rest")
+COMMAND("osd getcrushmap " \
+       "name=epoch,type=CephInt,range=0,req=false", \
+       "get CRUSH map", "osd", "r", "cli,rest")
+COMMAND("osd getmaxosd", "show largest OSD id", "osd", "r", "cli,rest")
+COMMAND("osd find " \
+       "name=id,type=CephInt,range=0", \
+       "find osd <id> in the CRUSH map and show its location", \
+       "osd", "r", "cli,rest")
+COMMAND("osd map " \
+       "name=pool,type=CephPoolname " \
+       "name=object,type=CephObjectname", \
+       "find pg for <object> in <pool>", "osd", "r", "cli,rest")
+COMMAND("osd scrub " \
+       "name=who,type=CephString", \
+       "initiate scrub on osd <who>", "osd", "rw", "cli,rest")
+COMMAND("osd deep-scrub " \
+       "name=who,type=CephString", \
+       "initiate deep scrub on osd <who>", "osd", "rw", "cli,rest")
+COMMAND("osd repair " \
+       "name=who,type=CephString", \
+       "initiate repair on osd <who>", "osd", "rw", "cli,rest")
+COMMAND("osd lspools " \
+       "name=auid,type=CephInt,req=false", \
+       "list pools", "osd", "r", "cli,rest")
+COMMAND("osd blacklist ls", "show blacklisted clients", "osd", "r", "cli,rest")
+COMMAND("osd crush rule list", "list crush rules", "osd", "r", "cli,rest")
+COMMAND("osd crush rule ls", "list crush rules", "osd", "r", "cli,rest")
+COMMAND("osd crush rule dump", "dump crush rules", "osd", "r", "cli,rest")
+COMMAND("osd crush dump", "dump crush map", "osd", "r", "cli,rest")
+COMMAND("osd setcrushmap", "set crush map from input file", \
+       "osd", "rw", "cli,rest")
+COMMAND("osd crush set", "set crush map from input file", \
+       "osd", "rw", "cli,rest")
+COMMAND("osd crush add-bucket " \
+       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] " \
+       "name=type,type=CephString", \
+       "add no-parent (probably root) crush bucket <name> of type <type>", \
+       "osd", "rw", "cli,rest")
+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-_.=]", \
+       "set crushmap entry for <name> to <weight> with location <args>", \
+       "osd", "rw", "cli,rest")
+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 crushmap entry for <name> with <weight> and location <args>", \
+       "osd", "rw", "cli,rest")
+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", "cli,rest")
+COMMAND("osd crush move " \
+       "name=id,type=CephOsdName " \
+       "name=args,type=CephString,n=N,goodchars=[A-Za-z0-9-_.=]", \
+       "move existing entry for <name> to location <args>", \
+       "osd", "rw", "cli,rest")
+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", "cli,rest")
+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", "cli,rest")
+COMMAND("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", "cli,rest")
+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", "cli,rest")
+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", "cli,rest")
+COMMAND("osd crush tunables " \
+       "name=profile,type=CephChoices,strings=legacy|argonaut|bobtail|optimal|default", \
+       "set crush tunables values to <profile>", "osd", "rw", "cli,rest")
+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-_.]",
+       "create crush rule <name> in <root> of type <type>", \
+       "osd", "rw", "cli,rest")
+COMMAND("osd crush rule rm " \
+       "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] ",  \
+       "remove crush rule <name>", "osd", "rw", "cli,rest")
+COMMAND("osd setmaxosd " \
+       "name=newmax,type=CephInt,range=0", \
+       "set new maximum osd value", "osd", "rw", "cli,rest")
+COMMAND("osd pause", "pause osd", "osd", "rw", "cli,rest")
+COMMAND("osd unpause", "unpause osd", "osd", "rw", "cli,rest")
+COMMAND("osd set " \
+       "name=key,type=CephChoices,strings=pause|noup|nodown|noout|noin|nobackfill|norecover|noscrub|nodeep-scrub", \
+       "set <key>", "osd", "rw", "cli,rest")
+COMMAND("osd unset " \
+       "name=key,type=CephChoices,strings=pause|noup|nodown|noout|noin|nobackfill|norecover|noscrub|nodeep-scrub", \
+       "unset <key>", "osd", "rw", "cli,rest")
+COMMAND("osd cluster_snap", "take cluster snapshot (disabled)", \
+       "osd", "r", "")
+COMMAND("osd down " \
+       "type=CephString,name=ids,n=N", \
+       "set osd(s) <id> [<id>...] down", "osd", "rw", "cli,rest")
+COMMAND("osd out " \
+       "name=ids,type=CephString,n=N", \
+       "set osd(s) <id> [<id>...] out", "osd", "rw", "cli,rest")
+COMMAND("osd in " \
+       "name=ids,type=CephString,n=N", \
+       "set osd(s) <id> [<id>...] in", "osd", "rw", "cli,rest")
+COMMAND("osd rm " \
+       "name=ids,type=CephString,n=N", \
+       "remove osd(s) <id> [<id>...] in", "osd", "rw", "cli,rest")
+COMMAND("osd reweight " \
+       "name=id,type=CephInt,range=0 " \
+       "type=CephFloat,name=weight,range=0.0|1.0", \
+       "reweight osd to 0.0 < <weight> < 1.0", "osd", "rw", "cli,rest")
+COMMAND("osd lost " \
+       "name=id,type=CephInt,range=0 " \
+       "name=sure,type=CephChoices,strings=--yes-i-really-mean-it", \
+       "mark osd as permanently lost. THIS DESTROYS DATA IF NO MORE REPLICAS EXIST, BE CAREFUL", \
+       "osd", "rw", "cli,rest")
+COMMAND("osd create " \
+       "name=uuid,type=CephUUID,req=false", \
+       "create new osd (with optional UUID)", "osd", "rw", "cli,rest")
+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", "cli,rest")
+COMMAND("osd pool mksnap " \
+       "name=pool,type=CephPoolname " \
+       "name=snap,type=CephString", \
+       "make snapshot <snap> in <pool>", "osd", "rw", "cli,rest")
+COMMAND("osd pool rmsnap " \
+       "name=pool,type=CephPoolname " \
+       "name=snap,type=CephString", \
+       "remove snapshot <snap> from <pool>", "osd", "rw", "cli,rest")
+COMMAND("osd pool create " \
+       "name=pool,type=CephPoolname " \
+       "name=pg_num,type=CephInt,range=0 " \
+       "name=pgp_num,type=CephInt,range=0,req=false", \
+       "create pool", "osd", "rw", "cli,rest")
+COMMAND("osd pool delete " \
+       "name=pool,type=CephPoolname " \
+       "name=pool2,type=CephPoolname " \
+       "name=sure,type=CephChoices,strings=--yes-i-really-really-mean-it", \
+       "delete pool (say pool twice, add --yes-i-really-really-mean-it)", \
+       "osd", "rw", "cli,rest")
+COMMAND("osd pool rename " \
+       "name=srcpool,type=CephPoolname " \
+       "name=destpool,type=CephPoolname", \
+       "rename <srcpool> to <destpool>", "osd", "rw", "cli,rest")
+COMMAND("osd pool get " \
+       "name=pool,type=CephPoolname " \
+       "name=var,type=CephChoices,strings=size|min_size|crash_replay_interval|pg_num|pgp_num|crush_ruleset", \
+       "get pool parameter <var>", "osd", "r", "cli,rest")
+COMMAND("osd pool set " \
+       "name=pool,type=CephPoolname " \
+       "name=var,type=CephChoices,strings=size|min_size|crash_replay_interval|pg_num|pgp_num|crush_ruleset " \
+       "name=val,type=CephInt", \
+       "set pool parameter <var> to <val>", "osd", "rw", "cli,rest")
+// '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 " \
+       "name=val,type=CephString",
+       "set object or byte limit on pool", "osd", "rw", "cli,rest")
+COMMAND("osd reweight-by-utilization " \
+       "name=oload,type=CephInt,range=100,req=false", \
+       "reweight OSDs by utilization [overload-percentage-for-consideration, default 120]", \
+       "osd", "rw", "cli,rest")
+COMMAND("osd thrash " \
+       "name=num_epochs,type=CephInt,range=0", \
+       "thrash OSDs for <num_epochs>", "osd", "rw", "cli,rest")
+
+/*
+ * mon/ConfigKeyService.cc
+ */
+
+COMMAND("config-key get " \
+       "name=key,type=CephString", \
+       "get <key>", "config-key", "r", "cli,rest")
+COMMAND("config-key put " \
+       "name=key,type=CephString " \
+       "name=val,type=CephString,req=false", \
+       "put <key>, value <val>", "config-key", "rw", "cli,rest")
+COMMAND("config-key del " \
+       "name=key,type=CephString", \
+       "delete <key>", "config-key", "rw", "cli,rest")
+COMMAND("config-key exists " \
+       "name=key,type=CephString", \
+       "check for <key>'s existence", "config-key", "r", "cli,rest")
+COMMAND("config-key list ", "list keys", "config-key", "r", "cli,rest")
index 9b32649733fc48a32ebf137f74712dcf103c297c..12c89bbb54f568f82a0cded50c8b2095cb8be2a5 100644 (file)
@@ -311,7 +311,10 @@ void Elector::handle_victory(MMonElection *m)
     MonCommand::decode_array(&new_cmds, &cmdsize, bi);
     set_leader_supported_commands(new_cmds, cmdsize);
   } else { // they are a legacy monitor; use known legacy command set
-    // TODO: actually store legacy command set, and use here!
+    const MonCommand *new_cmds;
+    int cmdsize;
+    get_classic_monitor_commands(&new_cmds, &cmdsize);
+    set_leader_supported_commands(new_cmds, cmdsize);
   }
 
   m->put();
index d9094a81b0e5e9015fcaba228659466252510029..68c65037158f954ac6c448a711e23419ab7ce23c 100644 (file)
@@ -30,6 +30,7 @@ noinst_HEADERS += \
        mon/MonCap.h \
        mon/MonClient.h \
        mon/MonCommands.h \
+       mon/DumplingMonCommands.h \
        mon/MonMap.h \
        mon/Monitor.h \
        mon/MonitorStore.h \
index c9e7fe87fea82bc08262da7a2ca1a1a72f265cca..30c18f4333c56afb2d5aad70a0d1f97b62b158b1 100644 (file)
@@ -1885,6 +1885,9 @@ MonCommand mon_commands[] = {
   {parsesig, helptext, modulename, req_perms, avail},
 #include <mon/MonCommands.h>
 };
+MonCommand classic_mon_commands[] = {
+#include <mon/DumplingMonCommands.h>
+};
 const MonCommand *leader_supported_mon_commands = NULL;
 int leader_supported_mon_commands_size = 0;
 
@@ -1972,9 +1975,15 @@ void get_leader_supported_commands(const MonCommand **cmds, int *count)
   *cmds = leader_supported_mon_commands;
   *count = leader_supported_mon_commands_size;
 }
+void get_classic_monitor_commands(const MonCommand **cmds, int *count)
+{
+  *cmds = classic_mon_commands;
+  *count = ARRAY_SIZE(classic_mon_commands);
+}
 void set_leader_supported_commands(const MonCommand *cmds, int size)
 {
-  if (leader_supported_mon_commands != mon_commands)
+  if (leader_supported_mon_commands != mon_commands &&
+      leader_supported_mon_commands != classic_mon_commands)
     delete[] leader_supported_mon_commands;
   leader_supported_mon_commands = cmds;
   leader_supported_mon_commands_size = size;
index 4e4dbd58df5c7d416a64fc3bcd924e8a95acf665..347b1fbb4b7e95830fe56ee9ffbada7aa8688756 100644 (file)
@@ -918,6 +918,7 @@ void get_command_descriptions(const MonCommand *commands,
                              Formatter *f,
                              bufferlist *rdata);
 void get_locally_supported_monitor_commands(const MonCommand **cmds, int *count);
+void get_classic_monitor_commands(const MonCommand **cmds, int *count);
 void get_leader_supported_commands(const MonCommand **cmds, int *count);
 /// the Monitor owns this pointer once you pass it in
 void set_leader_supported_commands(const MonCommand *cmds, int size);