From: Ricardo Dias Date: Mon, 10 Apr 2017 13:26:52 +0000 (+0100) Subject: rbd: added group image remove by id to CLI X-Git-Tag: v12.0.2~106^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=46de06ebb293defd25551727762190b8c453c233;p=ceph.git rbd: added group image remove by id to CLI Signed-off-by: Ricardo Dias --- diff --git a/src/test/cli/rbd/help.t b/src/test/cli/rbd/help.t index ab89eeff3064..7cc9348cf1d1 100644 --- a/src/test/cli/rbd/help.t +++ b/src/test/cli/rbd/help.t @@ -480,7 +480,7 @@ rbd help group image remove usage: rbd group image remove [--group-pool ] [--group ] [--image-pool ] [--image ] - [--pool ] + [--pool ] [--image-id ] Remove an image from a consistency group. @@ -497,6 +497,7 @@ --image-pool arg image pool name --image arg image name -p [ --pool ] arg pool name unless overridden + --image-id arg image id rbd help group list usage: rbd group list [--pool ] [--format ] [--pretty-format] diff --git a/src/tools/rbd/Utils.cc b/src/tools/rbd/Utils.cc index 9f9913fbad30..82a7bc5189bc 100644 --- a/src/tools/rbd/Utils.cc +++ b/src/tools/rbd/Utils.cc @@ -987,5 +987,23 @@ uint64_t get_rbd_default_features(CephContext* cct) { return boost::lexical_cast(features); } +bool check_if_image_spec_present(const po::variables_map &vm, + at::ArgumentModifier mod, + size_t spec_arg_index) { + std::string image_key = (mod == at::ARGUMENT_MODIFIER_DEST ? + at::DEST_IMAGE_NAME : at::IMAGE_NAME); + + if (vm.count(image_key)) { + return true; + } + + std::string spec = get_positional_argument(vm, spec_arg_index); + if (!spec.empty()) { + return true; + } + + return false; +} + } // namespace utils } // namespace rbd diff --git a/src/tools/rbd/Utils.h b/src/tools/rbd/Utils.h index 4f338a23ac49..ae677e86e033 100644 --- a/src/tools/rbd/Utils.h +++ b/src/tools/rbd/Utils.h @@ -183,6 +183,10 @@ bool calc_sparse_extent(const bufferptr &bp, size_t *write_length, size_t *offset); +bool check_if_image_spec_present(const boost::program_options::variables_map &vm, + argument_types::ArgumentModifier mod, + size_t spec_arg_index); + std::string image_id(librbd::Image& image); std::string mirror_image_state(librbd::mirror_image_state_t mirror_image_state); diff --git a/src/tools/rbd/action/Group.cc b/src/tools/rbd/action/Group.cc index 6c77da3ff4d0..9bfb58fc588f 100644 --- a/src/tools/rbd/action/Group.cc +++ b/src/tools/rbd/action/Group.cc @@ -188,10 +188,27 @@ int execute_remove_image(const po::variables_map &vm) { std::string image_name; std::string image_pool_name; + std::string image_id; - r = utils::get_special_pool_image_names(vm, &arg_index, - &image_pool_name, - &image_name); + if (vm.count(at::IMAGE_ID)) { + image_id = vm[at::IMAGE_ID].as(); + } + + 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; + } + + if (image_id.empty()) { + r = utils::get_special_pool_image_names(vm, &arg_index, &image_pool_name, + &image_name); + } else { + image_pool_name = utils::get_pool_name(vm, &arg_index); + } if (r < 0) { std::cerr << "rbd: image remove error: " << cpp_strerror(r) << std::endl; @@ -213,8 +230,13 @@ int execute_remove_image(const po::variables_map &vm) { } librbd::RBD rbd; - r = rbd.group_image_remove(cg_io_ctx, group_name.c_str(), - image_io_ctx, image_name.c_str()); + if (image_id.empty()) { + r = rbd.group_image_remove(cg_io_ctx, group_name.c_str(), + image_io_ctx, image_name.c_str()); + } else { + r = rbd.group_image_remove_by_id(cg_io_ctx, group_name.c_str(), + image_io_ctx, image_id.c_str()); + } if (r < 0) { std::cerr << "rbd: remove image error: " << cpp_strerror(r) << std::endl; return r; @@ -350,6 +372,7 @@ void get_remove_image_arguments(po::options_description *positional, at::add_pool_option(options, at::ARGUMENT_MODIFIER_NONE, " unless overridden"); + at::add_image_id_option(options); } void get_list_images_arguments(po::options_description *positional,