From 838cae45af823373a91131d3d62c959b57d74cf6 Mon Sep 17 00:00:00 2001 From: Victor Denisov Date: Thu, 1 Dec 2016 12:40:16 -0800 Subject: [PATCH] rbd: Add group snapshot rename commands Signed-off-by: Victor Denisov --- qa/workunits/rbd/rbd_groups.sh | 13 ++++++- src/test/cli/rbd/help.t | 20 +++++++++++ src/tools/rbd/action/Group.cc | 63 +++++++++++++++++++++++++++++++++- 3 files changed, 94 insertions(+), 2 deletions(-) diff --git a/qa/workunits/rbd/rbd_groups.sh b/qa/workunits/rbd/rbd_groups.sh index 44bda52b875..3b12d206449 100755 --- a/qa/workunits/rbd/rbd_groups.sh +++ b/qa/workunits/rbd/rbd_groups.sh @@ -110,6 +110,14 @@ remove_snapshot() rbd group snap remove $group_name@$snap_name } +rename_snapshot() +{ + local group_name=$1 + local snap_name=$2 + local new_snap_name=$3 + rbd group snap rename $group_name@$snap_name $new_snap_name +} + list_snapshots() { local group_name=$1 @@ -160,13 +168,16 @@ echo "TEST: create remove snapshots of consistency group" image="test_image" group="test_consistency_group" snap="group_snap" +new_snap="new_group_snap" create_image $image create_group $group add_image_to_group $image $group create_snapshot $group $snap check_snapshot_in_group $group $snap -remove_snapshot $group $snap +rename_snapshot $group $snap $new_snap check_snapshot_not_in_group $group $snap +remove_snapshot $group $new_snap +check_snapshot_not_in_group $group $new_snap remove_group $group remove_image $image echo "PASSED" diff --git a/src/test/cli/rbd/help.t b/src/test/cli/rbd/help.t index 3f5fdb5fd8c..506a1835660 100644 --- a/src/test/cli/rbd/help.t +++ b/src/test/cli/rbd/help.t @@ -33,6 +33,7 @@ Skip test on FreeBSD as it generates different output there. group snap create Make a snapshot of a group. group snap list List snapshots of a group. group snap remove (group snap rm) Remove a snapshot from a group. + group snap rename Rename group's snapshot. image-meta get Image metadata get the value associated with the key. image-meta list (image-meta ls) Image metadata list keys with values. @@ -586,6 +587,25 @@ Skip test on FreeBSD as it generates different output there. --group arg group name --snap arg snapshot name + rbd help group snap rename + usage: rbd group snap rename [--pool ] [--group ] [--snap ] + [--dest-snap ] + + + Rename group's snapshot. + + Positional arguments + group specification + (example: [/]@) + destination snapshot name + (example: ) + + Optional arguments + -p [ --pool ] arg pool name + --group arg group name + --snap arg snapshot name + --dest-snap arg destination snapshot name + rbd help image-meta get usage: rbd image-meta get [--pool ] [--image ] diff --git a/src/tools/rbd/action/Group.cc b/src/tools/rbd/action/Group.cc index 36270deb24c..69eaccba6c5 100644 --- a/src/tools/rbd/action/Group.cc +++ b/src/tools/rbd/action/Group.cc @@ -385,6 +385,54 @@ int execute_group_snap_remove(const po::variables_map &vm) { return r; } +int execute_group_snap_rename(const po::variables_map &vm) { + size_t arg_index = 0; + + std::string group_name; + std::string pool_name; + std::string source_snap_name; + + int r = utils::get_pool_group_names(vm, at::ARGUMENT_MODIFIER_NONE, + &arg_index, &pool_name, &group_name, + &source_snap_name); + if (r < 0) { + return r; + } + + std::string dest_snap_name; + if (vm.count(at::DEST_SNAPSHOT_NAME)) { + dest_snap_name = vm[at::DEST_SNAPSHOT_NAME].as(); + } + + if (dest_snap_name.empty()) { + dest_snap_name = utils::get_positional_argument(vm, arg_index++); + } + + if (dest_snap_name.empty()) { + std::cerr << "rbd: destination snapshot name was not specified" + << std::endl; + return -EINVAL; + } + + librados::Rados rados; + librados::IoCtx io_ctx; + r = utils::init(pool_name, &rados, &io_ctx); + if (r < 0) { + return r; + } + + librbd::RBD rbd; + r = rbd.group_snap_rename(io_ctx, group_name.c_str(), + source_snap_name.c_str(), dest_snap_name.c_str()); + + if (r < 0) { + std::cerr << "rbd: failed to rename snapshot" << std::endl; + return r; + } + + return 0; +} + int execute_group_snap_list(const po::variables_map &vm) { size_t arg_index = 0; std::string group_name; @@ -468,7 +516,6 @@ int execute_group_snap_list(const po::variables_map &vm) { return 0; } - void get_create_arguments(po::options_description *positional, po::options_description *options) { at::add_group_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE, @@ -551,6 +598,17 @@ void get_group_snap_remove_arguments(po::options_description *positional, true); } +void get_group_snap_rename_arguments(po::options_description *positional, + po::options_description *options) { + at::add_group_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE, + true); + + positional->add_options() + (at::DEST_SNAPSHOT_NAME.c_str(), + "destination snapshot name\n(example: )"); + at::add_snap_option(options, at::ARGUMENT_MODIFIER_DEST); +} + void get_group_snap_list_arguments(po::options_description *positional, po::options_description *options) { at::add_format_options(options); @@ -582,6 +640,9 @@ Shell::Action action_group_snap_create( Shell::Action action_group_snap_remove( {"group", "snap", "remove"}, {"group", "snap", "rm"}, "Remove a snapshot from a group.", "", &get_group_snap_remove_arguments, &execute_group_snap_remove); +Shell::Action action_group_snap_rename( + {"group", "snap", "rename"}, {}, "Rename group's snapshot.", + "", &get_group_snap_rename_arguments, &execute_group_snap_rename); Shell::Action action_group_snap_list( {"group", "snap", "list"}, {}, "List snapshots of a group.", "", &get_group_snap_list_arguments, &execute_group_snap_list); -- 2.39.5