]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rbd: Add group snapshot rename commands
authorVictor Denisov <denisovenator@gmail.com>
Thu, 1 Dec 2016 20:40:16 +0000 (12:40 -0800)
committerJason Dillaman <dillaman@redhat.com>
Sat, 13 Jan 2018 19:00:31 +0000 (14:00 -0500)
Signed-off-by: Victor Denisov <denisovenator@gmail.com>
qa/workunits/rbd/rbd_groups.sh
src/test/cli/rbd/help.t
src/tools/rbd/action/Group.cc

index 44bda52b875e74ed9ddd9dd0d3ff01216edfcc34..3b12d206449d80e63554fb825018cf76a0fb405b 100755 (executable)
@@ -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"
index 3f5fdb5fd8c4b604afb7851442f609ec970fd209..506a18356602e22f1225bca58ba0c35cc8e13889 100644 (file)
@@ -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 <pool>] [--group <group>] [--snap <snap>] 
+                               [--dest-snap <dest-snap>] 
+                               <group-spec> <dest-snap> 
+  
+  Rename group's snapshot.
+  
+  Positional arguments
+    <group-spec>         group specification
+                         (example: [<pool-name>/]<group-name>@<snap-name>)
+    <dest-snap>          destination snapshot name
+                         (example: <snapshot-name>)
+  
+  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 <pool>] [--image <image>] 
                             <image-spec> <key> 
index 36270deb24c477370b520ed69b30d19e38d6406e..69eaccba6c502b367dbd13b72dca163ef9f60c97 100644 (file)
@@ -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<std::string>();
+  }
+
+  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: <snapshot-name>)");
+  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);