void add_group_spec_options(po::options_description *pos,
po::options_description *opt,
- ArgumentModifier modifier) {
- pos->add_options()
- ((get_name_prefix(modifier) + GROUP_SPEC).c_str(),
- (get_description_prefix(modifier) + "group specification\n" +
- "(example: [<pool-name>/]<group-name>)").c_str());
+ ArgumentModifier modifier,
+ bool snap) {
add_pool_option(opt, modifier);
add_group_option(opt, modifier);
+ if (!snap) {
+ pos->add_options()
+ ((get_name_prefix(modifier) + GROUP_SPEC).c_str(),
+ (get_description_prefix(modifier) + "group specification\n" +
+ "(example: [<pool-name>/]<group-name>)").c_str());
+ } else {
+ add_snap_option(opt, modifier);
+ pos->add_options()
+ ((get_name_prefix(modifier) + GROUP_SPEC).c_str(),
+ (get_description_prefix(modifier) + "group specification\n" +
+ "(example: [<pool-name>/]<group-name>@<snap-name>)").c_str());
+ }
}
void add_snap_spec_options(po::options_description *pos,
int extract_group_spec(const std::string &spec,
std::string *pool_name,
- std::string *group_name) {
+ std::string *group_name,
+ std::string *snap_name) {
std::regex pattern;
- pattern = "^(?:([^/]+)/)?(.+)?$";
+ if (snap_name == nullptr) {
+ pattern = "^(?:([^/@]+)/)?([^/@]+)?$";
+ } else {
+ pattern = "^(?:([^/@]+)/)?([^/@]+)(?:@([^/@]+))?$";
+ }
std::smatch match;
if (!std::regex_match(spec, match, pattern)) {
if (group_name != nullptr) {
*group_name = match[2];
}
+ if (snap_name != nullptr && match[3].matched) {
+ *snap_name = match[3];
+ }
return 0;
}
if (group_name->empty()) {
std::string spec = utils::get_positional_argument(vm, (*arg_index)++);
if (!spec.empty()) {
- r = utils::extract_group_spec(spec, group_pool_name, group_name);
+ r = extract_group_spec(spec, group_pool_name, group_name, nullptr);
if (r < 0) {
return r;
}
at::ArgumentModifier mod,
size_t *spec_arg_index,
std::string *pool_name,
- std::string *group_name) {
+ std::string *group_name,
+ std::string *snap_name) {
std::string pool_key = (mod == at::ARGUMENT_MODIFIER_DEST ?
at::DEST_POOL_NAME : at::POOL_NAME);
std::string group_key = (mod == at::ARGUMENT_MODIFIER_DEST ?
*group_name = vm[group_key].as<std::string>();
}
+ if (vm.count(at::SNAPSHOT_NAME) && snap_name != nullptr) {
+ *snap_name = vm[at::SNAPSHOT_NAME].as<std::string>();
+ }
+
int r;
if (group_name != nullptr && spec_arg_index != nullptr &&
group_name->empty()) {
std::string spec = get_positional_argument(vm, (*spec_arg_index)++);
if (!spec.empty()) {
- r = extract_group_spec(spec, pool_name, group_name);
+ r = extract_group_spec(spec, pool_name, group_name, snap_name);
if (r < 0) {
return r;
}
return -EINVAL;
}
+ if (snap_name != nullptr && snap_name->empty()) {
+ std::cerr << "rbd: snapshot name was not specified" << std::endl;
+ return -EINVAL;
+ }
+
return 0;
}
std::string pool_name;
int r = utils::get_pool_group_names(vm, at::ARGUMENT_MODIFIER_NONE,
- &arg_index, &pool_name, &group_name);
+ &arg_index, &pool_name, &group_name,
+ nullptr);
if (r < 0) {
return r;
}
std::string pool_name;
int r = utils::get_pool_group_names(vm, at::ARGUMENT_MODIFIER_NONE,
- &arg_index, &pool_name, &group_name);
+ &arg_index, &pool_name, &group_name,
+ nullptr);
if (r < 0) {
return r;
}
std::string pool_name;
int r = utils::get_pool_group_names(vm, at::ARGUMENT_MODIFIER_NONE,
- &arg_index, &pool_name, &group_name);
+ &arg_index, &pool_name, &group_name,
+ nullptr);
if (r < 0) {
return r;
}
std::string snap_name;
int r = utils::get_pool_group_names(vm, at::ARGUMENT_MODIFIER_NONE,
- &arg_index, &pool_name, &group_name);
+ &arg_index, &pool_name, &group_name,
+ &snap_name);
if (r < 0) {
return r;
}
- if (vm.count(at::SNAPSHOT_NAME)) {
- snap_name = vm[at::SNAPSHOT_NAME].as<std::string>();
- }
-
- if (snap_name.empty()) {
- snap_name = utils::get_positional_argument(vm, arg_index++);
- }
-
- if (snap_name.empty()) {
- std::cerr << "rbd: "
- << "snapshot name was not specified" << std::endl;
- return -EINVAL;
- }
-
librados::IoCtx io_ctx;
librados::Rados rados;
std::string snap_name;
int r = utils::get_pool_group_names(vm, at::ARGUMENT_MODIFIER_NONE,
- &arg_index, &pool_name, &group_name);
+ &arg_index, &pool_name, &group_name,
+ &snap_name);
if (r < 0) {
return r;
}
- if (vm.count(at::SNAPSHOT_NAME)) {
- snap_name = vm[at::SNAPSHOT_NAME].as<std::string>();
- }
-
- if (snap_name.empty()) {
- snap_name = utils::get_positional_argument(vm, arg_index++);
- }
-
- if (snap_name.empty()) {
- std::cerr << "rbd: "
- << "snapshot name was not specified" << std::endl;
- return -EINVAL;
- }
-
librados::IoCtx io_ctx;
librados::Rados rados;
std::string pool_name;
int r = utils::get_pool_group_names(vm, at::ARGUMENT_MODIFIER_NONE,
- &arg_index, &pool_name, &group_name);
+ &arg_index, &pool_name, &group_name,
+ nullptr);
if (r < 0) {
return r;
}
void get_create_arguments(po::options_description *positional,
po::options_description *options) {
- at::add_group_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE);
+ at::add_group_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE,
+ false);
}
void get_remove_arguments(po::options_description *positional,
po::options_description *options) {
- at::add_group_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE);
+ at::add_group_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE,
+ false);
}
void get_list_arguments(po::options_description *positional,
void get_list_images_arguments(po::options_description *positional,
po::options_description *options) {
at::add_format_options(options);
- at::add_group_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE);
+ at::add_group_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE,
+ false);
}
void get_group_snap_create_arguments(po::options_description *positional,
po::options_description *options) {
- at::add_group_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE);
-
- positional->add_options()
- (at::SNAPSHOT_NAME.c_str(), "snapshot name\n(example: <snapshot-name>)");
-
- at::add_snap_option(options, at::ARGUMENT_MODIFIER_NONE);
+ at::add_group_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE,
+ true);
}
void get_group_snap_remove_arguments(po::options_description *positional,
po::options_description *options) {
- at::add_group_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE);
-
- positional->add_options()
- (at::SNAPSHOT_NAME.c_str(), "snapshot name\n(example: <snapshot-name>)");
-
- at::add_snap_option(options, at::ARGUMENT_MODIFIER_NONE);
+ at::add_group_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE,
+ true);
}
void get_group_snap_list_arguments(po::options_description *positional,
po::options_description *options) {
at::add_format_options(options);
- at::add_group_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE);
+ at::add_group_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE,
+ false);
}
Shell::Action action_create(