Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / src / common / cmdparse.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- 
2 // vim: ts=8 sw=2 smarttab
3 #ifndef CEPH_COMMON_CMDPARSE_H
4 #define CEPH_COMMON_CMDPARSE_H
5
6 #include <vector>
7 #include <stdexcept>
8 #include <ostream>
9 #include <boost/variant.hpp>
10 #include "include/assert.h"     // boost clobbers this
11 #include "common/Formatter.h"
12 #include "common/BackTrace.h"
13
14 class CephContext;
15
16 /* this is handy; can't believe it's not standard */
17 #define ARRAY_SIZE(a)   (sizeof(a) / sizeof(*a))
18
19 typedef boost::variant<std::string,
20                        bool,
21                        int64_t,
22                        double,
23                        std::vector<std::string>,
24                        std::vector<int64_t>,
25                        std::vector<double>>  cmd_vartype;
26 typedef std::map<std::string, cmd_vartype> cmdmap_t;
27
28 std::string cmddesc_get_prefix(const std::string &cmddesc);
29 void dump_cmd_to_json(ceph::Formatter *f, const std::string& cmd);
30 void dump_cmd_and_help_to_json(ceph::Formatter *f,
31                                const std::string& secname,
32                                const std::string& cmd,
33                                const std::string& helptext);
34 void dump_cmddesc_to_json(ceph::Formatter *jf,
35                           const std::string& secname,
36                           const std::string& cmdsig,
37                           const std::string& helptext,
38                           const std::string& module,
39                           const std::string& perm,
40                           const std::string& avail,
41                           uint64_t flags);
42 bool cmdmap_from_json(std::vector<std::string> cmd, cmdmap_t *mapp,
43                       std::stringstream &ss);
44 void cmdmap_dump(const cmdmap_t &cmdmap, ceph::Formatter *f);
45 void handle_bad_get(CephContext *cct, const std::string& k, const char *name);
46
47 std::string cmd_vartype_stringify(const cmd_vartype& v);
48
49 template <typename T>
50 bool
51 cmd_getval(CephContext *cct, const cmdmap_t& cmdmap, const std::string& k, T& val)
52 {
53   if (cmdmap.count(k)) {
54     try {
55       val = boost::get<T>(cmdmap.find(k)->second);
56       return true;
57     } catch (boost::bad_get) {
58       handle_bad_get(cct, k, typeid(T).name());
59     }
60   }
61   return false;
62 }
63
64 // with default
65
66 template <typename T>
67 void
68 cmd_getval(CephContext *cct, const cmdmap_t& cmdmap, const std::string& k, T& val, const T& defval)
69 {
70   if (!cmd_getval(cct, cmdmap, k, val))
71     val = defval;
72 }
73
74 template <typename T>
75 void
76 cmd_putval(CephContext *cct, cmdmap_t& cmdmap, const std::string& k, const T& val)
77 {
78   cmdmap[k] = val;
79 }
80
81 extern int parse_osd_id(const char *s, std::ostream *pss);
82 extern long parse_pos_long(const char *s, std::ostream *pss = NULL);
83
84 #endif