--io-type arg IO type (read , write, or readwrite(rw))
rbd help children
- usage: rbd children [--pool <pool>] [--image <image>] [--snap <snap>] [--all]
- [--format <format>] [--pretty-format]
+ usage: rbd children [--pool <pool>] [--image <image>] [--snap <snap>]
+ [--snap-id <snap-id>] [--all] [--format <format>]
+ [--pretty-format]
<snap-spec>
Display children of snapshot.
-p [ --pool ] arg pool name
--image arg image name
--snap arg snapshot name
+ --snap-id arg snapshot id
-a [ --all ] list all children of snapshot (include trash)
--format arg output format (plain, json, or xml) [default: plain]
--pretty-format pretty formatting (json and xml)
static const std::string GROUP_NAME("group");
static const std::string DEST_GROUP_NAME("dest-group");
static const std::string SNAPSHOT_NAME("snap");
+static const std::string SNAPSHOT_ID("snap-id");
static const std::string DEST_SNAPSHOT_NAME("dest-snap");
static const std::string JOURNAL_NAME("journal");
static const std::string DEST_JOURNAL_NAME("dest-journal");
void add_snap_option(boost::program_options::options_description *opt,
ArgumentModifier modifier);
+void add_snap_id_option(boost::program_options::options_description *opt);
void add_journal_option(boost::program_options::options_description *opt,
ArgumentModifier modifier,
void get_arguments(po::options_description *positional,
po::options_description *options) {
at::add_snap_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE);
+ at::add_snap_id_option(options);
options->add_options()
("all,a", po::bool_switch(), "list all children of snapshot (include trash)");
at::add_format_options(options);
int execute(const po::variables_map &vm,
const std::vector<std::string> &ceph_global_init_args) {
+ uint64_t snap_id = LIBRADOS_SNAP_HEAD;
+ auto snap_presence = utils::SNAPSHOT_PRESENCE_REQUIRED;
+ if (vm.count(at::SNAPSHOT_ID)) {
+ snap_id = vm[at::SNAPSHOT_ID].as<uint64_t>();
+ snap_presence = utils::SNAPSHOT_PRESENCE_PERMITTED;
+ }
+
size_t arg_index = 0;
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);
+ &snap_name, snap_presence, utils::SPEC_VALIDATION_NONE);
if (r < 0) {
return r;
}
+ if (snap_id != LIBRADOS_SNAP_HEAD && !snap_name.empty()) {
+ std::cerr << "rbd: trying to access snapshot using both name and id."
+ << std::endl;
+ return -EINVAL;
+ }
+
at::Format::Formatter formatter;
r = utils::get_formatter(vm, &formatter);
if (r < 0) {
librados::Rados rados;
librados::IoCtx io_ctx;
librbd::Image image;
- r = utils::init_and_open_image(pool_name, image_name, "", snap_name, true,
+ r = utils::init_and_open_image(pool_name, image_name, "", "", true,
&rados, &io_ctx, &image);
if (r < 0) {
return r;
}
+ if (snap_id == LIBRADOS_SNAP_HEAD) {
+ r = image.snap_set(snap_name.c_str());
+ } else {
+ r = image.snap_set_by_id(snap_id);
+ }
+ if (r == -ENOENT) {
+ std::cerr << "rbd: snapshot does not exist." << std::endl;
+ return r;
+ } else if (r < 0) {
+ std::cerr << "rbd: error setting snapshot: " << cpp_strerror(r)
+ << std::endl;
+ return r;
+ }
+
r = do_list_children(io_ctx, image, vm["all"].as<bool>(), formatter.get());
if (r < 0) {
std::cerr << "rbd: listing children failed: " << cpp_strerror(r)