]> git.proxmox.com Git - ceph.git/blob - ceph/src/tools/rbd/ArgumentTypes.h
update ceph source to reef 18.1.2
[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
163 void add_pool_options(boost::program_options::options_description *pos,
164 boost::program_options::options_description *opt,
165 bool namespaces_supported);
166
167 void add_image_spec_options(boost::program_options::options_description *pos,
168 boost::program_options::options_description *opt,
169 ArgumentModifier modifier);
170
171 void add_snap_spec_options(boost::program_options::options_description *pos,
172 boost::program_options::options_description *opt,
173 ArgumentModifier modifier);
174
175 void add_image_or_snap_spec_options(
176 boost::program_options::options_description *pos,
177 boost::program_options::options_description *opt,
178 ArgumentModifier modifier);
179
180 void add_create_image_options(boost::program_options::options_description *opt,
181 bool include_format);
182
183 void add_create_journal_options(
184 boost::program_options::options_description *opt);
185
186 void add_size_option(boost::program_options::options_description *opt);
187
188 void add_sparse_size_option(boost::program_options::options_description *opt);
189
190 void add_path_options(boost::program_options::options_description *pos,
191 boost::program_options::options_description *opt,
192 const std::string &description);
193
194 void add_limit_option(boost::program_options::options_description *opt);
195
196 void add_no_progress_option(boost::program_options::options_description *opt);
197
198 void add_format_options(boost::program_options::options_description *opt);
199
200 void add_verbose_option(boost::program_options::options_description *opt);
201
202 void add_no_error_option(boost::program_options::options_description *opt);
203
204 void add_flatten_option(boost::program_options::options_description *opt);
205
206 void add_snap_create_options(boost::program_options::options_description *opt);
207
208 void add_encryption_options(boost::program_options::options_description *opt);
209
210 std::string get_short_features_help(bool append_suffix);
211 std::string get_long_features_help();
212
213 void validate(boost::any& v, const std::vector<std::string>& values,
214 ExportFormat *target_type, int);
215 void validate(boost::any& v, const std::vector<std::string>& values,
216 ImageSize *target_type, int);
217 void validate(boost::any& v, const std::vector<std::string>& values,
218 ImageOrder *target_type, int);
219 void validate(boost::any& v, const std::vector<std::string>& values,
220 ImageObjectSize *target_type, int);
221 void validate(boost::any& v, const std::vector<std::string>& values,
222 ImageFormat *target_type, int);
223 void validate(boost::any& v, const std::vector<std::string>& values,
224 ImageNewFormat *target_type, int);
225 void validate(boost::any& v, const std::vector<std::string>& values,
226 ImageFeatures *target_type, int);
227 void validate(boost::any& v, const std::vector<std::string>& values,
228 Format *target_type, int);
229 void validate(boost::any& v, const std::vector<std::string>& values,
230 JournalObjectSize *target_type, int);
231 void validate(boost::any& v, const std::vector<std::string>& values,
232 EncryptionAlgorithm *target_type, int);
233 void validate(boost::any& v, const std::vector<std::string>& values,
234 EncryptionFormat *target_type, int);
235 void validate(boost::any& v, const std::vector<std::string>& values,
236 Secret *target_type, int);
237
238
239 std::ostream &operator<<(std::ostream &os, const ImageFeatures &features);
240
241 } // namespace argument_types
242 } // namespace rbd
243
244 #endif // CEPH_RBD_ARGUMENT_TYPES_H