]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
tools/rbd: support group snap rollback CLI
authorsongweibin <song.weibin@zte.com.cn>
Thu, 23 Aug 2018 03:09:26 +0000 (11:09 +0800)
committersongweibin <song.weibin@zte.com.cn>
Wed, 12 Sep 2018 15:42:15 +0000 (23:42 +0800)
Signed-off-by: songweibin <song.weibin@zte.com.cn>
doc/man/8/rbd.rst
qa/workunits/rbd/rbd_groups.sh
src/test/cli/rbd/help.t
src/tools/rbd/action/Group.cc

index 01282548935877b1899bc0d40a02c97cbe52848a..1ae43e91f025fe3ee1171c36731fdaafa1fc7e39 100644 (file)
@@ -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.
 
index c41389d549fcf3b2dafc2977f8f60189bc6a677b..2c9fd318f3c1db25196a2b4f307663db2f5224d8 100755 (executable)
@@ -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"
index bbbbcaf6751fdff17855d38b5f148b2ab84b3e94..decf764ec8018fb15fe3018ee3edff84feb92684 100644 (file)
@@ -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.
     --snap arg           snapshot name
     --dest-snap arg      destination snapshot name
   
+  rbd help group snap rollback
+  usage: rbd group snap rollback [--no-progress] [--pool <pool>] 
+                                 [--namespace <namespace>] [--group <group>] 
+                                 [--snap <snap>] 
+                                 <group-snap-spec> 
+  
+  Rollback group to snapshot.
+  
+  Positional arguments
+    <group-snap-spec>    group specification
+                         (example:
+                         [<pool-name>/[<namespace-name>/]]<group-name>@<snap-name>
+                         )
+  
+  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 <pool>] [--namespace <namespace>] 
                             [--image <image>] 
index 4c288e8dd774d4c49f05acbb37e80599aa094c5f..7cc9c299e8cd88a03832e0489d159dfce6d39d8d 100644 (file)
@@ -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<std::string> &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<bool>());
+  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