1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #ifndef CEPH_RBD_ARGUMENT_TYPES_H
5 #define CEPH_RBD_ARGUMENT_TYPES_H
7 #include "include/int_types.h"
11 #include <boost/any.hpp>
12 #include <boost/program_options.hpp>
13 #include <boost/shared_ptr.hpp>
15 namespace ceph { class Formatter; }
18 namespace argument_types {
20 enum ArgumentModifier {
21 ARGUMENT_MODIFIER_NONE,
22 ARGUMENT_MODIFIER_SOURCE,
23 ARGUMENT_MODIFIER_DEST
29 SPEC_FORMAT_IMAGE_OR_SNAPSHOT
32 static const std::string SOURCE_PREFIX("source-");
33 static const std::string DEST_PREFIX("dest-");
35 // positional arguments
36 static const std::string POSITIONAL_COMMAND_SPEC("positional-command-spec");
37 static const std::string POSITIONAL_ARGUMENTS("positional-arguments");
38 static const std::string IMAGE_SPEC("image-spec");
39 static const std::string GROUP_SPEC("group-spec");
40 static const std::string SNAPSHOT_SPEC("snap-spec");
41 static const std::string IMAGE_OR_SNAPSHOT_SPEC("image-or-snap-spec");
42 static const std::string JOURNAL_SPEC("journal-spec");
43 static const std::string PATH_NAME("path-name");
44 static const std::string IMAGE_ID("image-id");
47 static const std::string CONFIG_PATH("conf");
48 static const std::string POOL_NAME("pool");
49 static const std::string DEST_POOL_NAME("dest-pool");
50 static const std::string IMAGE_NAME("image");
51 static const std::string DEST_IMAGE_NAME("dest");
52 static const std::string GROUP_NAME("group");
53 static const std::string DEST_GROUP_NAME("dest-group");
54 static const std::string SNAPSHOT_NAME("snap");
55 static const std::string DEST_SNAPSHOT_NAME("dest-snap");
56 static const std::string JOURNAL_NAME("journal");
57 static const std::string DEST_JOURNAL_NAME("dest-journal");
58 static const std::string PATH("path");
59 static const std::string FROM_SNAPSHOT_NAME("from-snap");
60 static const std::string WHOLE_OBJECT("whole-object");
62 static const std::string IMAGE_FORMAT("image-format");
63 static const std::string IMAGE_NEW_FORMAT("new-format");
64 static const std::string IMAGE_ORDER("order");
65 static const std::string IMAGE_OBJECT_SIZE("object-size");
66 static const std::string IMAGE_FEATURES("image-feature");
67 static const std::string IMAGE_SHARED("image-shared");
68 static const std::string IMAGE_SIZE("size");
69 static const std::string IMAGE_STRIPE_UNIT("stripe-unit");
70 static const std::string IMAGE_STRIPE_COUNT("stripe-count");
71 static const std::string IMAGE_DATA_POOL("data-pool");
72 static const std::string IMAGE_SPARSE_SIZE("sparse-size");
74 static const std::string JOURNAL_OBJECT_SIZE("journal-object-size");
75 static const std::string JOURNAL_SPLAY_WIDTH("journal-splay-width");
76 static const std::string JOURNAL_POOL("journal-pool");
78 static const std::string NO_PROGRESS("no-progress");
79 static const std::string FORMAT("format");
80 static const std::string PRETTY_FORMAT("pretty-format");
81 static const std::string VERBOSE("verbose");
82 static const std::string NO_ERROR("no-error");
84 static const std::string DELAY("delay");
86 static const std::string LIMIT("limit");
88 static const std::set<std::string> SWITCH_ARGUMENTS = {
89 WHOLE_OBJECT, NO_PROGRESS, PRETTY_FORMAT, VERBOSE, NO_ERROR};
93 struct ImageObjectSize {};
94 struct ImageFormat {};
95 struct ImageNewFormat {};
97 struct ImageFeatures {
98 static const std::map<uint64_t, std::string> FEATURE_MAPPING;
103 template <typename T>
106 TypedValue(const T& t) : value(t) {}
109 struct Format : public TypedValue<std::string> {
110 typedef boost::shared_ptr<ceph::Formatter> Formatter;
112 Format(const std::string &format) : TypedValue<std::string>(format) {}
114 Formatter create_formatter(bool pretty) const;
117 struct JournalObjectSize {};
119 struct ExportFormat {};
123 void add_export_format_option(boost::program_options::options_description *opt);
125 std::string get_name_prefix(ArgumentModifier modifier);
126 std::string get_description_prefix(ArgumentModifier modifier);
129 void add_special_pool_option(boost::program_options::options_description *opt,
132 void add_pool_option(boost::program_options::options_description *opt,
133 ArgumentModifier modifier,
134 const std::string &desc_suffix = "");
136 void add_image_option(boost::program_options::options_description *opt,
137 ArgumentModifier modifier,
138 const std::string &desc_suffix = "");
140 void add_image_id_option(boost::program_options::options_description *opt,
141 const std::string &desc_suffix = "");
143 void add_group_option(boost::program_options::options_description *opt,
144 ArgumentModifier modifier,
145 const std::string &desc_suffix = "");
147 void add_snap_option(boost::program_options::options_description *opt,
148 ArgumentModifier modifier);
150 void add_journal_option(boost::program_options::options_description *opt,
151 ArgumentModifier modifier,
152 const std::string &desc_suffix = "");
154 void add_pool_options(boost::program_options::options_description *pos,
155 boost::program_options::options_description *opt);
157 void add_image_spec_options(boost::program_options::options_description *pos,
158 boost::program_options::options_description *opt,
159 ArgumentModifier modifier);
161 void add_group_spec_options(boost::program_options::options_description *pos,
162 boost::program_options::options_description *opt,
163 ArgumentModifier modifier);
165 void add_snap_spec_options(boost::program_options::options_description *pos,
166 boost::program_options::options_description *opt,
167 ArgumentModifier modifier);
169 void add_image_or_snap_spec_options(
170 boost::program_options::options_description *pos,
171 boost::program_options::options_description *opt,
172 ArgumentModifier modifier);
174 void add_journal_spec_options(
175 boost::program_options::options_description *pos,
176 boost::program_options::options_description *opt,
177 ArgumentModifier modifier);
179 void add_create_image_options(boost::program_options::options_description *opt,
180 bool include_format);
182 void add_create_journal_options(
183 boost::program_options::options_description *opt);
185 void add_size_option(boost::program_options::options_description *opt);
187 void add_sparse_size_option(boost::program_options::options_description *opt);
189 void add_path_options(boost::program_options::options_description *pos,
190 boost::program_options::options_description *opt,
191 const std::string &description);
193 void add_limit_option(boost::program_options::options_description *opt);
195 void add_no_progress_option(boost::program_options::options_description *opt);
197 void add_format_options(boost::program_options::options_description *opt);
199 void add_verbose_option(boost::program_options::options_description *opt);
201 void add_no_error_option(boost::program_options::options_description *opt);
203 std::string get_short_features_help(bool append_suffix);
204 std::string get_long_features_help();
206 void validate(boost::any& v, const std::vector<std::string>& values,
207 ExportFormat *target_type, int);
208 void validate(boost::any& v, const std::vector<std::string>& values,
209 ImageSize *target_type, int);
210 void validate(boost::any& v, const std::vector<std::string>& values,
211 ImageOrder *target_type, int);
212 void validate(boost::any& v, const std::vector<std::string>& values,
213 ImageObjectSize *target_type, int);
214 void validate(boost::any& v, const std::vector<std::string>& values,
215 ImageFormat *target_type, int);
216 void validate(boost::any& v, const std::vector<std::string>& values,
217 ImageNewFormat *target_type, int);
218 void validate(boost::any& v, const std::vector<std::string>& values,
219 ImageFeatures *target_type, int);
220 void validate(boost::any& v, const std::vector<std::string>& values,
221 Format *target_type, int);
222 void validate(boost::any& v, const std::vector<std::string>& values,
223 JournalObjectSize *target_type, int);
224 void validate(boost::any& v, const std::vector<std::string>& values,
225 Secret *target_type, int);
228 std::ostream &operator<<(std::ostream &os, const ImageFeatures &features);
230 } // namespace argument_types
233 #endif // CEPH_RBD_ARGUMENT_TYPES_H