}
static int do_show_info(librados::IoCtx &io_ctx, librbd::Image& image,
- const char *imgname, const char *snapname, Formatter *f)
+ const std::string &imgname, const std::string &imgid,
+ const std::string &snapname, Formatter *f)
{
librbd::image_info_t info;
std::string parent_pool, parent_name, parent_snapname;
return r;
}
- if (snapname) {
- r = image.snap_is_protected(snapname, &snap_protected);
+ if (!snapname.empty()) {
+ r = image.snap_is_protected(snapname.c_str(), &snap_protected);
if (r < 0)
return r;
}
if (f) {
f->open_object_section("image");
- f->dump_string("name", imgname);
+ if (!imgname.empty()) {
+ f->dump_string("name", imgname);
+ } else {
+ f->dump_string("id", imgid);
+ }
f->dump_unsigned("size", info.size);
f->dump_unsigned("objects", info.num_objs);
f->dump_int("order", info.order);
f->dump_string("block_name_prefix", prefix);
f->dump_int("format", (old_format ? 1 : 2));
} else {
- std::cout << "rbd image '" << imgname << "':\n"
+ std::cout << "rbd image '" << (imgname.empty() ? imgid : imgname) << "':\n"
<< "\tsize " << prettybyte_t(info.size) << " in "
<< info.num_objs << " objects"
<< std::endl
}
// snapshot info, if present
- if (snapname) {
+ if (!snapname.empty()) {
if (f) {
f->dump_string("protected", snap_protected ? "true" : "false");
} else {
po::options_description *options) {
at::add_image_or_snap_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_PERMITTED,
- 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_PERMITTED,
+ 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_PERMITTED,
+ 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, snap_name, true,
- &rados, &io_ctx, &image);
+ r = utils::init_and_open_image(pool_name, image_name, image_id, snap_name,
+ true, &rados, &io_ctx, &image);
if (r < 0) {
return r;
}
- r = do_show_info(io_ctx, image, image_name.c_str(),
- snap_name.empty() ? nullptr : snap_name.c_str(),
+ r = do_show_info(io_ctx, image, image_name, image_id, snap_name,
formatter.get());
if (r < 0) {
std::cerr << "rbd: info: " << cpp_strerror(r) << std::endl;