From: songweibin Date: Thu, 23 Aug 2018 03:09:26 +0000 (+0800) Subject: tools/rbd: support group snap rollback CLI X-Git-Tag: v14.0.1~297^2~2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=dec2ea83cf60dbdc3d98af045527fe1235ffcaf9;p=ceph.git tools/rbd: support group snap rollback CLI Signed-off-by: songweibin --- diff --git a/doc/man/8/rbd.rst b/doc/man/8/rbd.rst index 0128254893587..1ae43e91f025f 100644 --- a/doc/man/8/rbd.rst +++ b/doc/man/8/rbd.rst @@ -307,6 +307,9 @@ Commands :command:`group snap rename` *group-snap-spec* *snap-name* Rename group's snapshot. +:command:`group snap rollback` *group-snap-spec* + Rollback group to snapshot. + :command:`image-meta get` *image-spec* *key* Get metadata value with the key. diff --git a/qa/workunits/rbd/rbd_groups.sh b/qa/workunits/rbd/rbd_groups.sh index c41389d549fcf..2c9fd318f3c1d 100755 --- a/qa/workunits/rbd/rbd_groups.sh +++ b/qa/workunits/rbd/rbd_groups.sh @@ -132,6 +132,13 @@ list_snapshots() rbd group snap list $group_name } +rollback_snapshot() +{ + local group_name=$1 + local snap_name=$2 + rbd group snap rollback $group_name@$snap_name +} + check_snapshot_in_group() { local group_name=$1 @@ -180,6 +187,7 @@ image="test_image" group="test_consistency_group" snap="group_snap" new_snap="new_group_snap" +sec_snap="group_snap2" create_image $image create_group $group add_image_to_group $image $group @@ -187,8 +195,13 @@ create_snapshot $group $snap check_snapshot_in_group $group $snap rename_snapshot $group $snap $new_snap check_snapshot_not_in_group $group $snap +create_snapshot $group $sec_snap +check_snapshot_in_group $group $sec_snap +rollback_snapshot $group $new_snap remove_snapshot $group $new_snap check_snapshot_not_in_group $group $new_snap +remove_snapshot $group $sec_snap +check_snapshot_not_in_group $group $sec_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 bbbbcaf6751fd..decf764ec8018 100644 --- a/src/test/cli/rbd/help.t +++ b/src/test/cli/rbd/help.t @@ -35,6 +35,7 @@ group snap list (group snap ls) List snapshots of a group. group snap remove (group snap rm) Remove a snapshot from a group. group snap rename Rename group's snapshot. + group snap rollback Rollback group to 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. @@ -810,6 +811,27 @@ --snap arg snapshot name --dest-snap arg destination snapshot name + rbd help group snap rollback + usage: rbd group snap rollback [--no-progress] [--pool ] + [--namespace ] [--group ] + [--snap ] + + + Rollback group to snapshot. + + Positional arguments + group specification + (example: + [/[/]]@ + ) + + Optional arguments + --no-progress disable progress output + -p [ --pool ] arg pool name + --namespace arg namespace name + --group arg group name + --snap arg snapshot name + rbd help image-meta get usage: rbd image-meta get [--pool ] [--namespace ] [--image ] diff --git a/src/tools/rbd/action/Group.cc b/src/tools/rbd/action/Group.cc index 4c288e8dd774d..7cc9c299e8cd8 100644 --- a/src/tools/rbd/action/Group.cc +++ b/src/tools/rbd/action/Group.cc @@ -683,6 +683,47 @@ int execute_group_snap_list(const po::variables_map &vm, return 0; } +int execute_group_snap_rollback(const po::variables_map &vm, + const std::vector &global_args) { + size_t arg_index = 0; + + std::string group_name; + std::string namespace_name; + std::string pool_name; + std::string snap_name; + + int r = utils::get_pool_generic_snapshot_names( + vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, at::POOL_NAME, &pool_name, + &namespace_name, GROUP_NAME, "group", &group_name, &snap_name, true, + utils::SNAPSHOT_PRESENCE_REQUIRED, utils::SPEC_VALIDATION_FULL); + if (r < 0) { + return r; + } + + librados::IoCtx io_ctx; + librados::Rados rados; + + r = utils::init(pool_name, namespace_name, &rados, &io_ctx); + if (r < 0) { + return r; + } + + librbd::RBD rbd; + utils::ProgressContext pc("Rolling back to group snapshot", + vm[at::NO_PROGRESS].as()); + r = rbd.group_snap_rollback_with_progress(io_ctx, group_name.c_str(), + snap_name.c_str(), pc); + if (r < 0) { + pc.fail(); + std::cerr << "rbd: rollback group to snapshot failed: " + << cpp_strerror(r) << std::endl; + return r; + } + + pc.finish(); + return 0; +} + void get_create_arguments(po::options_description *positional, po::options_description *options) { add_group_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE, @@ -796,6 +837,13 @@ void get_group_snap_list_arguments(po::options_description *positional, false); } +void get_group_snap_rollback_arguments(po::options_description *positional, + po::options_description *options) { + at::add_no_progress_option(options); + add_group_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE, + true); +} + Shell::Action action_create( {"group", "create"}, {}, "Create a group.", "", &get_create_arguments, &execute_create); @@ -833,6 +881,10 @@ Shell::Action action_group_snap_list( {"group", "snap", "list"}, {"group", "snap", "ls"}, "List snapshots of a group.", "", &get_group_snap_list_arguments, &execute_group_snap_list); +Shell::Action action_group_snap_rollback( + {"group", "snap", "rollback"}, {}, + "Rollback group to snapshot.", + "", &get_group_snap_rollback_arguments, &execute_group_snap_rollback); } // namespace group } // namespace action