From ed1d44d3addfc41ce9b9affa43eeb016cb5db4f9 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 20 Mar 2018 12:32:00 +0800 Subject: [PATCH] rbd: listing children now supports a snapshot id optional Fixes: http://tracker.ceph.com/issues/23399 Signed-off-by: Jason Dillaman --- src/test/cli/rbd/help.t | 6 ++++-- src/tools/rbd/ArgumentTypes.cc | 5 +++++ src/tools/rbd/ArgumentTypes.h | 2 ++ src/tools/rbd/action/Children.cc | 32 ++++++++++++++++++++++++++++++-- 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/test/cli/rbd/help.t b/src/test/cli/rbd/help.t index dc0f40e653df2..d0ddc71009d59 100644 --- a/src/test/cli/rbd/help.t +++ b/src/test/cli/rbd/help.t @@ -143,8 +143,9 @@ --io-type arg IO type (read , write, or readwrite(rw)) rbd help children - usage: rbd children [--pool ] [--image ] [--snap ] [--all] - [--format ] [--pretty-format] + usage: rbd children [--pool ] [--image ] [--snap ] + [--snap-id ] [--all] [--format ] + [--pretty-format] Display children of snapshot. @@ -157,6 +158,7 @@ -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) diff --git a/src/tools/rbd/ArgumentTypes.cc b/src/tools/rbd/ArgumentTypes.cc index 6edcf9cebb76a..61b84d199a952 100644 --- a/src/tools/rbd/ArgumentTypes.cc +++ b/src/tools/rbd/ArgumentTypes.cc @@ -171,6 +171,11 @@ void add_snap_option(po::options_description *opt, (name.c_str(), po::value(), description.c_str()); } +void add_snap_id_option(po::options_description *opt) { + opt->add_options() + (SNAPSHOT_ID.c_str(), po::value(), "snapshot id"); +} + void add_journal_option(po::options_description *opt, ArgumentModifier modifier, const std::string &desc_suffix) { diff --git a/src/tools/rbd/ArgumentTypes.h b/src/tools/rbd/ArgumentTypes.h index 1d5d8a817375e..36e625d5404ea 100644 --- a/src/tools/rbd/ArgumentTypes.h +++ b/src/tools/rbd/ArgumentTypes.h @@ -53,6 +53,7 @@ static const std::string DEST_IMAGE_NAME("dest"); 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"); @@ -148,6 +149,7 @@ void add_group_option(boost::program_options::options_description *opt, 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, diff --git a/src/tools/rbd/action/Children.cc b/src/tools/rbd/action/Children.cc index 673070edc0f6c..d2ede539427f6 100644 --- a/src/tools/rbd/action/Children.cc +++ b/src/tools/rbd/action/Children.cc @@ -68,6 +68,7 @@ int do_list_children(librados::IoCtx &io_ctx, librbd::Image &image, 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); @@ -75,17 +76,30 @@ void get_arguments(po::options_description *positional, int execute(const po::variables_map &vm, const std::vector &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(); + 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) { @@ -95,12 +109,26 @@ int execute(const po::variables_map &vm, 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(), formatter.get()); if (r < 0) { std::cerr << "rbd: listing children failed: " << cpp_strerror(r) -- 2.39.5