]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd: listing children now supports a snapshot id optional 20966/head
authorJason Dillaman <dillaman@redhat.com>
Tue, 20 Mar 2018 04:32:00 +0000 (12:32 +0800)
committerJason Dillaman <dillaman@redhat.com>
Tue, 20 Mar 2018 08:58:44 +0000 (16:58 +0800)
Fixes: http://tracker.ceph.com/issues/23399
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/test/cli/rbd/help.t
src/tools/rbd/ArgumentTypes.cc
src/tools/rbd/ArgumentTypes.h
src/tools/rbd/action/Children.cc

index dc0f40e653df261b46e28120dac4f621689ae8aa..d0ddc71009d59bddba39940ceccb690db777eadb 100644 (file)
     --io-type arg        IO type (read , write, or readwrite(rw))
   
   rbd help children
-  usage: rbd children [--pool <pool>] [--image <image>] [--snap <snap>] [--all] 
-                      [--format <format>] [--pretty-format] 
+  usage: rbd children [--pool <pool>] [--image <image>] [--snap <snap>] 
+                      [--snap-id <snap-id>] [--all] [--format <format>] 
+                      [--pretty-format] 
                       <snap-spec> 
   
   Display children of snapshot.
     -p [ --pool ] arg    pool name
     --image arg          image name
     --snap arg           snapshot name
+    --snap-id arg        snapshot id
     -a [ --all ]         list all children of snapshot (include trash)
     --format arg         output format (plain, json, or xml) [default: plain]
     --pretty-format      pretty formatting (json and xml)
index 6edcf9cebb76a76270b0ba7b2107a77046be3dc4..61b84d199a9525edb15bfb57119c180ec0482777 100644 (file)
@@ -171,6 +171,11 @@ void add_snap_option(po::options_description *opt,
     (name.c_str(), po::value<std::string>(), description.c_str());
 }
 
+void add_snap_id_option(po::options_description *opt) {
+  opt->add_options()
+    (SNAPSHOT_ID.c_str(), po::value<uint64_t>(), "snapshot id");
+}
+
 void add_journal_option(po::options_description *opt,
                       ArgumentModifier modifier,
                       const std::string &desc_suffix) {
index 1d5d8a817375eb447d9c1d524ed1ef146857c467..36e625d5404eaed4e890e9334a6307a9094fa8ca 100644 (file)
@@ -53,6 +53,7 @@ static const std::string DEST_IMAGE_NAME("dest");
 static const std::string GROUP_NAME("group");
 static const std::string DEST_GROUP_NAME("dest-group");
 static const std::string SNAPSHOT_NAME("snap");
+static const std::string SNAPSHOT_ID("snap-id");
 static const std::string DEST_SNAPSHOT_NAME("dest-snap");
 static const std::string JOURNAL_NAME("journal");
 static const std::string DEST_JOURNAL_NAME("dest-journal");
@@ -148,6 +149,7 @@ void add_group_option(boost::program_options::options_description *opt,
 
 void add_snap_option(boost::program_options::options_description *opt,
                      ArgumentModifier modifier);
+void add_snap_id_option(boost::program_options::options_description *opt);
 
 void add_journal_option(boost::program_options::options_description *opt,
                       ArgumentModifier modifier,
index 673070edc0f6cbf4dea4c6c1ecc901354a088ef7..d2ede539427f65d50be509a53c8cb4a5b6dd9aaf 100644 (file)
@@ -68,6 +68,7 @@ int do_list_children(librados::IoCtx &io_ctx, librbd::Image &image,
 void get_arguments(po::options_description *positional,
                    po::options_description *options) {
   at::add_snap_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE);
+  at::add_snap_id_option(options);
   options->add_options()
     ("all,a", po::bool_switch(), "list all children of snapshot (include trash)");
   at::add_format_options(options);
@@ -75,17 +76,30 @@ void get_arguments(po::options_description *positional,
 
 int execute(const po::variables_map &vm,
             const std::vector<std::string> &ceph_global_init_args) {
+  uint64_t snap_id = LIBRADOS_SNAP_HEAD;
+  auto snap_presence = utils::SNAPSHOT_PRESENCE_REQUIRED;
+  if (vm.count(at::SNAPSHOT_ID)) {
+    snap_id = vm[at::SNAPSHOT_ID].as<uint64_t>();
+    snap_presence = utils::SNAPSHOT_PRESENCE_PERMITTED;
+  }
+
   size_t arg_index = 0;
   std::string pool_name;
   std::string image_name;
   std::string snap_name;
   int r = utils::get_pool_image_snapshot_names(
     vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, &image_name,
-    &snap_name, utils::SNAPSHOT_PRESENCE_REQUIRED, utils::SPEC_VALIDATION_NONE);
+    &snap_name, snap_presence, utils::SPEC_VALIDATION_NONE);
   if (r < 0) {
     return r;
   }
 
+  if (snap_id != LIBRADOS_SNAP_HEAD && !snap_name.empty()) {
+    std::cerr << "rbd: trying to access snapshot using both name and id."
+              << std::endl;
+    return -EINVAL;
+  }
+
   at::Format::Formatter formatter;
   r = utils::get_formatter(vm, &formatter);
   if (r < 0) {
@@ -95,12 +109,26 @@ int execute(const po::variables_map &vm,
   librados::Rados rados;
   librados::IoCtx io_ctx;
   librbd::Image image;
-  r = utils::init_and_open_image(pool_name, image_name, "", snap_name, true,
+  r = utils::init_and_open_image(pool_name, image_name, "", "", true,
                                  &rados, &io_ctx, &image);
   if (r < 0) {
     return r;
   }
 
+  if (snap_id == LIBRADOS_SNAP_HEAD) {
+    r = image.snap_set(snap_name.c_str());
+  } else {
+    r = image.snap_set_by_id(snap_id);
+  }
+  if (r == -ENOENT) {
+    std::cerr << "rbd: snapshot does not exist." << std::endl;
+    return r;
+  } else if (r < 0) {
+    std::cerr << "rbd: error setting snapshot: " << cpp_strerror(r)
+              << std::endl;
+    return r;
+  }
+
   r = do_list_children(io_ctx, image, vm["all"].as<bool>(), formatter.get());
   if (r < 0) {
     std::cerr << "rbd: listing children failed: " << cpp_strerror(r)