]> git.proxmox.com Git - ceph.git/blob - ceph/src/tools/rbd/ArgumentTypes.h
cc7c4813636930a7f9e89b844cca2a1da6bc2488
[ceph.git] / ceph / src / tools / rbd / ArgumentTypes.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3
4 #ifndef CEPH_RBD_ARGUMENT_TYPES_H
5 #define CEPH_RBD_ARGUMENT_TYPES_H
6
7 #include "include/int_types.h"
8 #include <set>
9 #include <string>
10 #include <vector>
11 #include <boost/any.hpp>
12 #include <boost/program_options.hpp>
13 #include <boost/shared_ptr.hpp>
14
15 namespace ceph { class Formatter; }
16
17 namespace rbd {
18 namespace argument_types {
19
20 enum ArgumentModifier {
21 ARGUMENT_MODIFIER_NONE,
22 ARGUMENT_MODIFIER_SOURCE,
23 ARGUMENT_MODIFIER_DEST
24 };
25
26 enum SpecFormat {
27 SPEC_FORMAT_IMAGE,
28 SPEC_FORMAT_SNAPSHOT,
29 SPEC_FORMAT_IMAGE_OR_SNAPSHOT
30 };
31
32 static const std::string SOURCE_PREFIX("source-");
33 static const std::string DEST_PREFIX("dest-");
34
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 SNAPSHOT_SPEC("snap-spec");
40 static const std::string IMAGE_OR_SNAPSHOT_SPEC("image-or-snap-spec");
41 static const std::string PATH_NAME("path-name");
42 static const std::string IMAGE_ID("image-id");
43
44 // optional arguments
45 static const std::string CONFIG_PATH("conf");
46 static const std::string POOL_NAME("pool");
47 static const std::string DEST_POOL_NAME("dest-pool");
48 static const std::string NAMESPACE_NAME("namespace");
49 static const std::string DEST_NAMESPACE_NAME("dest-namespace");
50 static const std::string IMAGE_NAME("image");
51 static const std::string DEST_IMAGE_NAME("dest");
52 static const std::string SNAPSHOT_NAME("snap");
53 static const std::string SNAPSHOT_ID("snap-id");
54 static const std::string DEST_SNAPSHOT_NAME("dest-snap");
55 static const std::string PATH("path");
56 static const std::string FROM_SNAPSHOT_NAME("from-snap");
57 static const std::string WHOLE_OBJECT("whole-object");
58
59 // encryption arguments
60 static const std::string ENCRYPTION_FORMAT("encryption-format");
61 static const std::string ENCRYPTION_PASSPHRASE_FILE("encryption-passphrase-file");
62
63 static const std::string IMAGE_FORMAT("image-format");
64 static const std::string IMAGE_NEW_FORMAT("new-format");
65 static const std::string IMAGE_ORDER("order");
66 static const std::string IMAGE_OBJECT_SIZE("object-size");
67 static const std::string IMAGE_FEATURES("image-feature");
68 static const std::string IMAGE_SHARED("image-shared");
69 static const std::string IMAGE_SIZE("size");
70 static const std::string IMAGE_STRIPE_UNIT("stripe-unit");
71 static const std::string IMAGE_STRIPE_COUNT("stripe-count");
72 static const std::string IMAGE_DATA_POOL("data-pool");
73 static const std::string IMAGE_SPARSE_SIZE("sparse-size");
74 static const std::string IMAGE_THICK_PROVISION("thick-provision");
75 static const std::string IMAGE_FLATTEN("flatten");
76 static const std::string IMAGE_MIRROR_IMAGE_MODE("mirror-image-mode");
77
78 static const std::string JOURNAL_OBJECT_SIZE("journal-object-size");
79 static const std::string JOURNAL_SPLAY_WIDTH("journal-splay-width");
80 static const std::string JOURNAL_POOL("journal-pool");
81
82 static const std::string NO_PROGRESS("no-progress");
83 static const std::string FORMAT("format");
84 static const std::string PRETTY_FORMAT("pretty-format");
85 static const std::string VERBOSE("verbose");
86 static const std::string NO_ERR("no-error");
87
88 static const std::string LIMIT("limit");
89
90 static const std::string SKIP_QUIESCE("skip-quiesce");
91 static const std::string IGNORE_QUIESCE_ERROR("ignore-quiesce-error");
92
93 static const std::set<std::string> SWITCH_ARGUMENTS = {
94 WHOLE_OBJECT, IMAGE_SHARED, IMAGE_THICK_PROVISION, IMAGE_FLATTEN,
95 NO_PROGRESS, PRETTY_FORMAT, VERBOSE, NO_ERR, SKIP_QUIESCE,
96 IGNORE_QUIESCE_ERROR
97 };
98
99 struct ImageSize {};
100 struct ImageOrder {};
101 struct ImageObjectSize {};
102 struct ImageFormat {};
103 struct ImageNewFormat {};
104
105 struct ImageFeatures {
106 static const std::map<uint64_t, std::string> FEATURE_MAPPING;
107
108 uint64_t features;
109 };
110
111 struct MirrorImageMode {};
112
113 template <typename T>
114 struct TypedValue {
115 T value;
116 TypedValue(const T& t) : value(t) {}
117 };
118
119 struct Format : public TypedValue<std::string> {
120 typedef boost::shared_ptr<ceph::Formatter> Formatter;
121
122 Format(const std::string &format) : TypedValue<std::string>(format) {}
123
124 Formatter create_formatter(bool pretty) const;
125 };
126
127 struct JournalObjectSize {};
128
129 struct ExportFormat {};
130
131 struct Secret {};
132
133 struct EncryptionAlgorithm {};
134 struct EncryptionFormat {
135 uint64_t format;
136 };
137
138 void add_export_format_option(boost::program_options::options_description *opt);
139
140 std::string get_name_prefix(ArgumentModifier modifier);
141 std::string get_description_prefix(ArgumentModifier modifier);
142
143 void add_all_option(boost::program_options::options_description *opt,
144 std::string description);
145
146 void add_pool_option(boost::program_options::options_description *opt,
147 ArgumentModifier modifier,
148 const std::string &desc_suffix = "");
149 void add_namespace_option(boost::program_options::options_description *opt,
150 ArgumentModifier modifier);
151
152 void add_image_option(boost::program_options::options_description *opt,
153 ArgumentModifier modifier,
154 const std::string &desc_suffix = "");
155
156 void add_image_id_option(boost::program_options::options_description *opt,
157 const std::string &desc_suffix = "");
158
159 void add_snap_option(boost::program_options::options_description *opt,
160 ArgumentModifier modifier);
161 void add_snap_id_option(boost::program_options::options_description *opt,
162 ArgumentModifier modifier);
163
164 void add_pool_options(boost::program_options::options_description *pos,
165 boost::program_options::options_description *opt,
166 bool namespaces_supported);
167
168 void add_image_spec_options(boost::program_options::options_description *pos,
169 boost::program_options::options_description *opt,
170 ArgumentModifier modifier);
171
172 void add_snap_spec_options(boost::program_options::options_description *pos,
173 boost::program_options::options_description *opt,
174 ArgumentModifier modifier);
175
176 void add_image_or_snap_spec_options(
177 boost::program_options::options_description *pos,
178 boost::program_options::options_description *opt,
179 ArgumentModifier modifier);
180
181 void add_create_image_options(boost::program_options::options_description *opt,
182 bool include_format);
183
184 void add_create_journal_options(
185 boost::program_options::options_description *opt);
186
187 void add_size_option(boost::program_options::options_description *opt);
188
189 void add_sparse_size_option(boost::program_options::options_description *opt);
190
191 void add_path_options(boost::program_options::options_description *pos,
192 boost::program_options::options_description *opt,
193 const std::string &description);
194
195 void add_limit_option(boost::program_options::options_description *opt);
196
197 void add_no_progress_option(boost::program_options::options_description *opt);
198
199 void add_format_options(boost::program_options::options_description *opt);
200
201 void add_verbose_option(boost::program_options::options_description *opt);
202
203 void add_no_error_option(boost::program_options::options_description *opt);
204
205 void add_flatten_option(boost::program_options::options_description *opt);
206
207 void add_snap_create_options(boost::program_options::options_description *opt);
208
209 void add_encryption_options(boost::program_options::options_description *opt);
210
211 std::string get_short_features_help(bool append_suffix);
212 std::string get_long_features_help();
213
214 void validate(boost::any& v, const std::vector<std::string>& values,
215 ExportFormat *target_type, int);
216 void validate(boost::any& v, const std::vector<std::string>& values,
217 ImageSize *target_type, int);
218 void validate(boost::any& v, const std::vector<std::string>& values,
219 ImageOrder *target_type, int);
220 void validate(boost::any& v, const std::vector<std::string>& values,
221 ImageObjectSize *target_type, int);
222 void validate(boost::any& v, const std::vector<std::string>& values,
223 ImageFormat *target_type, int);
224 void validate(boost::any& v, const std::vector<std::string>& values,
225 ImageNewFormat *target_type, int);
226 void validate(boost::any& v, const std::vector<std::string>& values,
227 ImageFeatures *target_type, int);
228 void validate(boost::any& v, const std::vector<std::string>& values,
229 Format *target_type, int);
230 void validate(boost::any& v, const std::vector<std::string>& values,
231 JournalObjectSize *target_type, int);
232 void validate(boost::any& v, const std::vector<std::string>& values,
233 EncryptionAlgorithm *target_type, int);
234 void validate(boost::any& v, const std::vector<std::string>& values,
235 EncryptionFormat *target_type, int);
236 void validate(boost::any& v, const std::vector<std::string>& values,
237 Secret *target_type, int);
238
239
240 std::ostream &operator<<(std::ostream &os, const ImageFeatures &features);
241
242 } // namespace argument_types
243 } // namespace rbd
244
245 #endif // CEPH_RBD_ARGUMENT_TYPES_H