diff options
author | Loic Dachary <loic@dachary.org> | 2013-09-11 18:26:21 +0200 |
---|---|---|
committer | Loic Dachary <loic@dachary.org> | 2013-09-23 23:46:43 +0200 |
commit | c16b54fd53521934cb9a30fc1d8fb823bc343309 (patch) | |
tree | 98a261db14bff40c64144fac6ff84cc02c871faa | |
parent | e0b5697387362d2221c4a8c9e81d6d2b8b934667 (diff) | |
download | ceph-c16b54fd53521934cb9a30fc1d8fb823bc343309.tar.gz |
mon: get_command_descriptions support program
The get_command_descriptions function is not designed to be tested in
C++ because all the validation happens in pybind/ceph_argparse.py. The
get_command_descriptions program is designed to be used by python unit
tests as a mean to get a JSON dump of the content of mon/MonCommands.h
get_command_descriptions --all
{"cmd000":{"sig":["pg","stat"],"help": ... "avail":"cli,rest"}}
It also provides a way to reproduce and keep track of past errors
( typos etc. ) to ensure the python validation keeps catching it.
get_command_descriptions --pull585
Add /get_command_descriptions to .gitignore so that
git ls-files --exclude-standard --others
does not see it which is required for
https://github.com/ceph/autobuild-ceph/blob/f018d220f2622a9fc8c86a31e1fa13263790c399/build-ceph.sh#L73
http://tracker.ceph.com/issues/6274 refs #6274
Reviewed-by: Joao Eduardo Luis <joao.luis@inktank.com>
Reviewed-by: Dan Mick <dan.mick@inktank.com>
Signed-off-by: Loic Dachary <loic@dachary.org>
-rw-r--r-- | src/.gitignore | 1 | ||||
-rw-r--r-- | src/test/Makefile.am | 5 | ||||
-rw-r--r-- | src/test/common/get_command_descriptions.cc | 116 |
3 files changed, 122 insertions, 0 deletions
diff --git a/src/.gitignore b/src/.gitignore index 4c98529bd87..6efe8dc6bc4 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -68,6 +68,7 @@ Makefile /test_* /cls_test_* /unittest_* +/get_command_descriptions # old dir, may in use by older branches /leveldb diff --git a/src/test/Makefile.am b/src/test/Makefile.am index e0ac1369568..6c127615b42 100644 --- a/src/test/Makefile.am +++ b/src/test/Makefile.am @@ -65,6 +65,11 @@ endif bin_PROGRAMS += ceph-dencoder +get_command_descriptions_SOURCES = test/common/get_command_descriptions.cc +get_command_descriptions_CXXFLAGS = $(UNITTEST_CXXFLAGS) +get_command_descriptions_LDADD = $(LIBMON) $(LIBCOMMON) $(UNITTEST_LDADD) $(CEPH_GLOBAL) +noinst_PROGRAMS += get_command_descriptions + ## Build tests # These should all use explicit _CXXFLAGS so avoid basename conflicts diff --git a/src/test/common/get_command_descriptions.cc b/src/test/common/get_command_descriptions.cc new file mode 100644 index 00000000000..afca8254c42 --- /dev/null +++ b/src/test/common/get_command_descriptions.cc @@ -0,0 +1,116 @@ +// -*- 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 Cloudwatt <libre.licensing@cloudwatt.com> + * + * Author: Loic Dachary <loic@dachary.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library Public License for more details. + * + */ + +#include <stdio.h> +#include <signal.h> +#include "mon/Monitor.h" +#include "common/ceph_argparse.h" +#include "global/global_init.h" +#include "common/debug.h" + +#define dout_subsys ceph_subsys_mon + +static void usage(ostream &out) +{ + out << "usage: get_command_descriptions [options ...]" << std::endl; + out << "print on stdout the result of JSON formatted options\n"; + out << "found in mon/MonCommands.h as produced by the\n"; + out << "Monitor.cc::get_command_descriptions function.\n"; + out << "Designed as a helper for ceph_argparse.py unit tests.\n"; + out << "\n"; + out << " --all all of mon/MonCommands.h \n"; + out << " --pull585 reproduce the bug fixed by #585\n"; + out << "\n"; + out << "Examples:\n"; + out << " get_command_descriptions --all\n"; + out << " get_command_descriptions --pull585\n"; +} + +static void json_print(const MonCommand *mon_commands, int size) +{ + bufferlist rdata; + Formatter *f = new_formatter("json"); + get_command_descriptions(mon_commands, size, f, &rdata); + delete f; + string data(rdata.c_str()); + dout(0) << data << dendl; +} + +static void all() +{ +#undef COMMAND + MonCommand mon_commands[] = { +#define COMMAND(parsesig, helptext, modulename, req_perms, avail) \ + {parsesig, helptext, modulename, req_perms, avail}, +#include <mon/MonCommands.h> + }; + + json_print(mon_commands, ARRAY_SIZE(mon_commands)); +} + +// syntax error https://github.com/ceph/ceph/pull/585 +static void pull585() +{ + MonCommand mon_commands[] = { + { "osd pool create " + "name=pool,type=CephPoolname " + "name=pg_num,type=CephInt,range=0 " + "name=pgp_num,type=CephInt,range=0,req=false" // !!! missing trailing space + "name=properties,type=CephString,n=N,req=false,goodchars=[A-Za-z0-9-_.=]", + "create pool", "osd", "rw", "cli,rest" } + }; + + json_print(mon_commands, ARRAY_SIZE(mon_commands)); +} + +int main(int argc, char **argv) { + vector<const char*> args; + argv_to_vec(argc, (const char **)argv, args); + + global_init(NULL, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0); + common_init_finish(g_ceph_context); + + if (args.empty()) { + usage(cerr); + exit(1); + } + for (std::vector<const char*>::iterator i = args.begin(); i != args.end(); ++i) { + string err; + + if (*i == string("help") || *i == string("-h") || *i == string("--help")) { + usage(cout); + exit(0); + } else if (*i == string("--all")) { + all(); + } else if (*i == string("--pull585")) { + pull585(); + } + } +} + +/* + * Local Variables: + * compile-command: "cd ../.. ; + * make get_command_descriptions && + * ./get_command_descriptions --all --pull585" + * End: + */ + |