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
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");
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");
59 // encryption arguments
60 static const std::string
ENCRYPTION_FORMAT("encryption-format");
61 static const std::string
ENCRYPTION_PASSPHRASE_FILE("encryption-passphrase-file");
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");
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");
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");
88 static const std::string
LIMIT("limit");
90 static const std::string
SKIP_QUIESCE("skip-quiesce");
91 static const std::string
IGNORE_QUIESCE_ERROR("ignore-quiesce-error");
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
,
100 struct ImageOrder
{};
101 struct ImageObjectSize
{};
102 struct ImageFormat
{};
103 struct ImageNewFormat
{};
105 struct ImageFeatures
{
106 static const std::map
<uint64_t, std::string
> FEATURE_MAPPING
;
111 struct MirrorImageMode
{};
113 template <typename T
>
116 TypedValue(const T
& t
) : value(t
) {}
119 struct Format
: public TypedValue
<std::string
> {
120 typedef boost::shared_ptr
<ceph::Formatter
> Formatter
;
122 Format(const std::string
&format
) : TypedValue
<std::string
>(format
) {}
124 Formatter
create_formatter(bool pretty
) const;
127 struct JournalObjectSize
{};
129 struct ExportFormat
{};
133 struct EncryptionAlgorithm
{};
134 struct EncryptionFormat
{
138 void add_export_format_option(boost::program_options::options_description
*opt
);
140 std::string
get_name_prefix(ArgumentModifier modifier
);
141 std::string
get_description_prefix(ArgumentModifier modifier
);
143 void add_all_option(boost::program_options::options_description
*opt
,
144 std::string description
);
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
);
152 void add_image_option(boost::program_options::options_description
*opt
,
153 ArgumentModifier modifier
,
154 const std::string
&desc_suffix
= "");
156 void add_image_id_option(boost::program_options::options_description
*opt
,
157 const std::string
&desc_suffix
= "");
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
);
164 void add_pool_options(boost::program_options::options_description
*pos
,
165 boost::program_options::options_description
*opt
,
166 bool namespaces_supported
);
168 void add_image_spec_options(boost::program_options::options_description
*pos
,
169 boost::program_options::options_description
*opt
,
170 ArgumentModifier modifier
);
172 void add_snap_spec_options(boost::program_options::options_description
*pos
,
173 boost::program_options::options_description
*opt
,
174 ArgumentModifier modifier
);
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
);
181 void add_create_image_options(boost::program_options::options_description
*opt
,
182 bool include_format
);
184 void add_create_journal_options(
185 boost::program_options::options_description
*opt
);
187 void add_size_option(boost::program_options::options_description
*opt
);
189 void add_sparse_size_option(boost::program_options::options_description
*opt
);
191 void add_path_options(boost::program_options::options_description
*pos
,
192 boost::program_options::options_description
*opt
,
193 const std::string
&description
);
195 void add_limit_option(boost::program_options::options_description
*opt
);
197 void add_no_progress_option(boost::program_options::options_description
*opt
);
199 void add_format_options(boost::program_options::options_description
*opt
);
201 void add_verbose_option(boost::program_options::options_description
*opt
);
203 void add_no_error_option(boost::program_options::options_description
*opt
);
205 void add_flatten_option(boost::program_options::options_description
*opt
);
207 void add_snap_create_options(boost::program_options::options_description
*opt
);
209 void add_encryption_options(boost::program_options::options_description
*opt
);
211 std::string
get_short_features_help(bool append_suffix
);
212 std::string
get_long_features_help();
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);
240 std::ostream
&operator<<(std::ostream
&os
, const ImageFeatures
&features
);
242 } // namespace argument_types
245 #endif // CEPH_RBD_ARGUMENT_TYPES_H