}
if (vm.count(snap_key) && snap_name != nullptr) {
*snap_name = vm[snap_key].as<std::string>();
- }
+ }
int r;
if (image_name != nullptr && !image_name->empty()) {
return 0;
}
+int get_pool_snapshot_names(const po::variables_map &vm,
+ at::ArgumentModifier mod,
+ size_t *spec_arg_index,
+ std::string *pool_name,
+ std::string *snap_name,
+ SnapshotPresence snapshot_presence,
+ SpecValidation spec_validation) {
+ std::string pool_key = (mod == at::ARGUMENT_MODIFIER_DEST ?
+ at::DEST_POOL_NAME : at::POOL_NAME);
+ std::string snap_key = (mod == at::ARGUMENT_MODIFIER_DEST ?
+ at::DEST_SNAPSHOT_NAME : at::SNAPSHOT_NAME);
+
+ if (vm.count(pool_key) && pool_name != nullptr) {
+ *pool_name = vm[pool_key].as<std::string>();
+ }
+ if (vm.count(snap_key) && snap_name != nullptr) {
+ *snap_name = vm[snap_key].as<std::string>();
+ }
+
+ if (pool_name != nullptr && pool_name->empty()) {
+ *pool_name = at::DEFAULT_POOL_NAME;
+ }
+
+ if (snap_name != nullptr) {
+ int r = validate_snapshot_name(mod, *snap_name, snapshot_presence,
+ spec_validation);
+ if (r < 0) {
+ return r;
+ }
+ }
+ return 0;
+}
+
int get_pool_journal_names(const po::variables_map &vm,
at::ArgumentModifier mod,
size_t *spec_arg_index,
return 0;
}
+int open_image_by_id(librados::IoCtx &io_ctx, const std::string &image_id,
+ bool read_only, librbd::Image *image) {
+ int r;
+ librbd::RBD rbd;
+ if (read_only) {
+ r = rbd.open_by_id_read_only(io_ctx, *image, image_id.c_str(), NULL);
+ } else {
+ r = rbd.open_by_id(io_ctx, *image, image_id.c_str());
+ }
+
+ if (r < 0) {
+ std::cerr << "rbd: error opening image with id " << image_id << ": "
+ << cpp_strerror(r) << std::endl;
+ return r;
+ }
+ return 0;
+}
+
int init_and_open_image(const std::string &pool_name,
const std::string &image_name,
const std::string &image_id,
void get_list_arguments(po::options_description *positional,
po::options_description *options) {
at::add_image_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE);
+ at::add_image_id_option(options);
at::add_format_options(options);
}
std::string pool_name;
std::string image_name;
std::string snap_name;
- int r = utils::get_pool_image_snapshot_names(
- vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, &image_name,
- &snap_name, utils::SNAPSHOT_PRESENCE_NONE, utils::SPEC_VALIDATION_NONE);
+ std::string image_id;
+
+ if (vm.count(at::IMAGE_ID)) {
+ image_id = vm[at::IMAGE_ID].as<std::string>();
+ }
+
+ bool has_image_spec = utils::check_if_image_spec_present(
+ vm, at::ARGUMENT_MODIFIER_NONE, arg_index);
+
+ if (!image_id.empty() && has_image_spec) {
+ std::cerr << "rbd: trying to access image using both name and id. "
+ << std::endl;
+ return -EINVAL;
+ }
+
+ int r;
+ if (image_id.empty()) {
+ r = utils::get_pool_image_snapshot_names(vm, at::ARGUMENT_MODIFIER_NONE,
+ &arg_index, &pool_name,
+ &image_name, &snap_name,
+ utils::SNAPSHOT_PRESENCE_NONE,
+ utils::SPEC_VALIDATION_NONE);
+ } else {
+ r = utils::get_pool_snapshot_names(vm, at::ARGUMENT_MODIFIER_NONE,
+ &arg_index, &pool_name, &snap_name,
+ utils::SNAPSHOT_PRESENCE_NONE,
+ utils::SPEC_VALIDATION_NONE);
+ }
if (r < 0) {
return r;
}
librados::Rados rados;
librados::IoCtx io_ctx;
librbd::Image image;
- r = utils::init_and_open_image(pool_name, image_name, "", "", true,
+ r = utils::init_and_open_image(pool_name, image_name, image_id, "", true,
&rados, &io_ctx, &image);
if (r < 0) {
return r;
po::options_description *options) {
at::add_snap_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE);
at::add_no_progress_option(options);
-
+ at::add_image_id_option(options);
+
options->add_options()
("force", po::bool_switch(), "flatten children and unprotect snapshot if needed.");
}
std::string pool_name;
std::string image_name;
std::string snap_name;
+ std::string image_id;
bool force = vm["force"].as<bool>();
- int r = utils::get_pool_image_snapshot_names(
- vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, &image_name,
- &snap_name, utils::SNAPSHOT_PRESENCE_REQUIRED, utils::SPEC_VALIDATION_NONE);
+
+ if (vm.count(at::IMAGE_ID)) {
+ image_id = vm[at::IMAGE_ID].as<std::string>();
+ }
+
+ bool has_image_spec = utils::check_if_image_spec_present(
+ vm, at::ARGUMENT_MODIFIER_NONE, arg_index);
+
+ if (!image_id.empty() && has_image_spec) {
+ std::cerr << "rbd: trying to access image using both name and id. "
+ << std::endl;
+ return -EINVAL;
+ }
+
+ int r;
+ if (image_id.empty()) {
+ r = utils::get_pool_image_snapshot_names(vm, at::ARGUMENT_MODIFIER_NONE,
+ &arg_index, &pool_name,
+ &image_name, &snap_name,
+ utils::SNAPSHOT_PRESENCE_REQUIRED,
+ utils::SPEC_VALIDATION_NONE);
+ } else {
+ r = utils::get_pool_snapshot_names(vm, at::ARGUMENT_MODIFIER_NONE,
+ &arg_index, &pool_name, &snap_name,
+ utils::SNAPSHOT_PRESENCE_REQUIRED,
+ utils::SPEC_VALIDATION_NONE);
+ }
if (r < 0) {
return r;
}
}
io_ctx.set_osdmap_full_try();
- r = utils::open_image(io_ctx, image_name, false, &image);
+ if (image_id.empty()) {
+ r = utils::open_image(io_ctx, image_name, false, &image);
+ } else {
+ r = utils::open_image_by_id(io_ctx, image_id, false, &image);
+ }
if (r < 0) {
return r;
}
void get_purge_arguments(po::options_description *positional,
po::options_description *options) {
at::add_image_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE);
+ at::add_image_id_option(options);
at::add_no_progress_option(options);
}
std::string pool_name;
std::string image_name;
std::string snap_name;
- int r = utils::get_pool_image_snapshot_names(
- vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, &image_name,
- &snap_name, utils::SNAPSHOT_PRESENCE_NONE, utils::SPEC_VALIDATION_NONE);
+ std::string image_id;
+
+ if (vm.count(at::IMAGE_ID)) {
+ image_id = vm[at::IMAGE_ID].as<std::string>();
+ }
+
+ bool has_image_spec = utils::check_if_image_spec_present(
+ vm, at::ARGUMENT_MODIFIER_NONE, arg_index);
+
+ if (!image_id.empty() && has_image_spec) {
+ std::cerr << "rbd: trying to access image using both name and id. "
+ << std::endl;
+ return -EINVAL;
+ }
+
+ int r;
+ if (image_id.empty()) {
+ r = utils::get_pool_image_snapshot_names(vm, at::ARGUMENT_MODIFIER_NONE,
+ &arg_index, &pool_name,
+ &image_name, &snap_name,
+ utils::SNAPSHOT_PRESENCE_NONE,
+ utils::SPEC_VALIDATION_NONE);
+ } else {
+ r = utils::get_pool_snapshot_names(vm, at::ARGUMENT_MODIFIER_NONE,
+ &arg_index, &pool_name, &snap_name,
+ utils::SNAPSHOT_PRESENCE_NONE,
+ utils::SPEC_VALIDATION_NONE);
+ }
if (r < 0) {
return r;
}
}
io_ctx.set_osdmap_full_try();
- r = utils::open_image(io_ctx, image_name, false, &image);
+ if (image_id.empty()) {
+ r = utils::open_image(io_ctx, image_name, false, &image);
+ } else {
+ r = utils::open_image_by_id(io_ctx, image_id, false, &image);
+ }
if (r < 0) {
return r;
}
void get_unprotect_arguments(po::options_description *positional,
po::options_description *options) {
at::add_snap_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE);
+ at::add_image_id_option(options);
}
int execute_unprotect(const po::variables_map &vm) {
std::string pool_name;
std::string image_name;
std::string snap_name;
- int r = utils::get_pool_image_snapshot_names(
- vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, &image_name,
- &snap_name, utils::SNAPSHOT_PRESENCE_REQUIRED, utils::SPEC_VALIDATION_NONE);
+ std::string image_id;
+
+ if (vm.count(at::IMAGE_ID)) {
+ image_id = vm[at::IMAGE_ID].as<std::string>();
+ }
+
+ bool has_image_spec = utils::check_if_image_spec_present(
+ vm, at::ARGUMENT_MODIFIER_NONE, arg_index);
+
+ if (!image_id.empty() && has_image_spec) {
+ std::cerr << "rbd: trying to access image using both name and id. "
+ << std::endl;
+ return -EINVAL;
+ }
+
+ int r;
+ if (image_id.empty()) {
+ r = utils::get_pool_image_snapshot_names(vm, at::ARGUMENT_MODIFIER_NONE,
+ &arg_index, &pool_name,
+ &image_name, &snap_name,
+ utils::SNAPSHOT_PRESENCE_REQUIRED,
+ utils::SPEC_VALIDATION_NONE);
+ } else {
+ r = utils::get_pool_snapshot_names(vm, at::ARGUMENT_MODIFIER_NONE,
+ &arg_index, &pool_name, &snap_name,
+ utils::SNAPSHOT_PRESENCE_REQUIRED,
+ utils::SPEC_VALIDATION_NONE);
+ }
if (r < 0) {
return r;
}
}
io_ctx.set_osdmap_full_try();
- r = utils::open_image(io_ctx, image_name, false, &image);
+ if (image_id.empty()) {
+ r = utils::open_image(io_ctx, image_name, false, &image);
+ } else {
+ r = utils::open_image_by_id(io_ctx, image_id, false, &image);
+ }
if (r < 0) {
return r;
}
-
+
bool is_protected = false;
r = image.snap_is_protected(snap_name.c_str(), &is_protected);
if (r < 0) {