]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd: expose optional namespace in parent/child image output
authorJason Dillaman <dillaman@redhat.com>
Wed, 21 Nov 2018 03:54:08 +0000 (22:54 -0500)
committerJason Dillaman <dillaman@redhat.com>
Sun, 25 Nov 2018 12:59:41 +0000 (07:59 -0500)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/tools/rbd/action/Children.cc
src/tools/rbd/action/Info.cc
src/tools/rbd/action/List.cc

index 550b19bb9b99674c0793a093c502a198bb41ac0c..b13195506a01df77d117e97eac44a64d2cae2ee9 100644 (file)
@@ -19,41 +19,43 @@ namespace po = boost::program_options;
 int do_list_children(librados::IoCtx &io_ctx, librbd::Image &image,
                      bool all_flag, Formatter *f)
 {
-  std::vector<librbd::child_info_t> children;
+  std::vector<librbd::linked_image_spec_t> children;
   librbd::RBD rbd;
-  int r = image.list_children2(&children);
+  int r = image.list_children3(&children);
   if (r < 0)
     return r;
 
   if (f)
     f->open_array_section("children");
 
-  for (std::vector<librbd::child_info_t>::iterator it = children.begin();
-       it != children.end(); ++it) {
-    bool trash = it->trash;
+  for (auto& child : children) {
+    bool trash = child.trash;
     if (f) {
       if (all_flag) {
         f->open_object_section("child");
-        f->dump_string("pool", it->pool_name);
-        f->dump_string("image", it->image_name);
-        f->dump_string("id", it->image_id);
-        f->dump_bool("trash", it->trash);
+        f->dump_string("pool", child.pool_name);
+        f->dump_string("pool_namespace", child.pool_namespace);
+        f->dump_string("image", child.image_name);
+        f->dump_string("id", child.image_id);
+        f->dump_bool("trash", child.trash);
         f->close_section();
       } else if (!trash) {
         f->open_object_section("child");
-        f->dump_string("pool", it->pool_name);
-        f->dump_string("image", it->image_name);
+        f->dump_string("pool", child.pool_name);
+        f->dump_string("pool_namespace", child.pool_namespace);
+        f->dump_string("image", child.image_name);
         f->close_section();
       }
-    } else {
-      if (all_flag) {
-        std::cout << it->pool_name << "/" << it->image_name;
-        if (trash)
-          std::cout << " (trash " << it->image_id << ")";
-        std::cout << std::endl;
-      } else if (!trash) {
-        std::cout << it->pool_name << "/" << it->image_name << std::endl;
+    } else if (all_flag || !trash) {
+      std::cout << child.pool_name << "/";
+      if (!child.pool_namespace.empty()) {
+        std::cout << child.pool_namespace << "/";
+      }
+      std::cout << child.image_name;
+      if (trash) {
+        std::cout << " (trash " << child.image_id << ")";
       }
+      std::cout << std::endl;
     }
   }
 
index 4192a246ef0c79fc47f2622356edf16f51ebbb45..1b4f53d0081f9df1274e6a92635362bdf0b57697 100644 (file)
@@ -312,34 +312,32 @@ static int do_show_info(librados::IoCtx &io_ctx, librbd::Image& image,
   }
 
   // parent info, if present
-  std::string parent_pool, parent_name, parent_id, parent_snapname;
-  if ((image.parent_info2(&parent_pool, &parent_name, &parent_id,
-                          &parent_snapname) == 0) &&
-      parent_name.length() > 0) {
-
-    librbd::trash_image_info_t trash_image_info;
-    librbd::RBD rbd;
-    r = rbd.trash_get(io_ctx, parent_id.c_str(), &trash_image_info);
-    bool trash_image_info_valid = (r == 0);
-
+  librbd::linked_image_spec_t parent_image_spec;
+  librbd::snap_spec_t parent_snap_spec;
+  if ((image.get_parent(&parent_image_spec, &parent_snap_spec) == 0) &&
+      (parent_image_spec.image_name.length() > 0)) {
     if (f) {
       f->open_object_section("parent");
-      f->dump_string("pool", parent_pool);
-      f->dump_string("image", parent_name);
-      f->dump_string("snapshot", parent_snapname);
-      if (trash_image_info_valid) {
-        f->dump_string("trash", parent_id);
-      }
+      f->dump_string("pool", parent_image_spec.pool_name);
+      f->dump_string("pool_namespace", parent_image_spec.pool_namespace);
+      f->dump_string("image", parent_image_spec.image_name);
+      f->dump_string("id", parent_image_spec.image_id);
+      f->dump_string("snapshot", parent_snap_spec.name);
+      f->dump_bool("trash", parent_image_spec.trash);
       if ((features & RBD_FEATURE_MIGRATING) != 0) {
         f->dump_bool("migration_source", true);
       }
       f->dump_unsigned("overlap", overlap);
       f->close_section();
     } else {
-      std::cout << "\tparent: " << parent_pool << "/" << parent_name
-                << (parent_snapname.empty() ? "" : "@") << parent_snapname;
-      if (trash_image_info_valid) {
-        std::cout << " (trash " << parent_id << ")";
+      std::cout << "\tparent: " << parent_image_spec.pool_name << "/";
+      if (!parent_image_spec.pool_namespace.empty()) {
+        std::cout << parent_image_spec.pool_namespace << "/";
+      }
+      std::cout << parent_image_spec.image_name << "@"
+                << parent_snap_spec.name;
+      if (parent_image_spec.trash) {
+        std::cout << " (trash " << parent_image_spec.image_id << ")";
       }
       if ((features & RBD_FEATURE_MIGRATING) != 0) {
         std::cout << " (migration source)";
index dcab81814a6e19bcabcaccfa7885d539c27feb74..56c14a90160987f70d4c5ab507ad9aa84e745ca8 100644 (file)
@@ -46,15 +46,23 @@ int list_process_image(librados::Rados* rados, WorkerEntry* w, bool lflag, Forma
 {
   int r = 0;
   librbd::image_info_t info;
-  std::string pool, image, snap, parent;
+  std::string parent;
 
   // handle second-nth trips through loop
-  r = w->img.parent_info(&pool, &image, &snap);
-  if (r < 0 && r != -ENOENT)
+  librbd::linked_image_spec_t parent_image_spec;
+  librbd::snap_spec_t parent_snap_spec;
+  r = w->img.get_parent(&parent_image_spec, &parent_snap_spec);
+  if (r < 0 && r != -ENOENT) {
     return r;
+  }
+
   bool has_parent = false;
   if (r != -ENOENT) {
-    parent = pool + "/" + image + "@" + snap;
+    parent = parent_image_spec.pool_name + "/";
+    if (!parent_image_spec.pool_namespace.empty()) {
+      parent += parent_image_spec.pool_namespace + "/";
+    }
+    parent +=  parent_image_spec.image_name + "@" + parent_snap_spec.name;
     has_parent = true;
   }
 
@@ -81,9 +89,10 @@ int list_process_image(librados::Rados* rados, WorkerEntry* w, bool lflag, Forma
     f->dump_unsigned("size", info.size);
     if (has_parent) {
       f->open_object_section("parent");
-      f->dump_string("pool", pool);
-      f->dump_string("image", image);
-      f->dump_string("snapshot", snap);
+      f->dump_string("pool", parent_image_spec.pool_name);
+      f->dump_string("pool_namespace", parent_image_spec.pool_namespace);
+      f->dump_string("image", parent_image_spec.image_name);
+      f->dump_string("snapshot", parent_snap_spec.name);
       f->close_section();
     }
     f->dump_int("format", old_format ? 1 : 2);
@@ -115,8 +124,12 @@ int list_process_image(librados::Rados* rados, WorkerEntry* w, bool lflag, Forma
       r = w->img.snap_is_protected(s->name.c_str(), &is_protected);
       if (r < 0)
         return r;
-      if (w->img.parent_info(&pool, &image, &snap) >= 0) {
-        parent = pool + "/" + image + "@" + snap;
+      if (w->img.get_parent(&parent_image_spec, &parent_snap_spec) >= 0) {
+        parent = parent_image_spec.pool_name + "/";
+        if (!parent_image_spec.pool_namespace.empty()) {
+          parent += parent_image_spec.pool_namespace + "/";
+        }
+        parent +=  parent_image_spec.image_name + "@" + parent_snap_spec.name;
         has_parent = true;
       }
       if (f) {
@@ -126,9 +139,10 @@ int list_process_image(librados::Rados* rados, WorkerEntry* w, bool lflag, Forma
         f->dump_unsigned("size", s->size);
         if (has_parent) {
           f->open_object_section("parent");
-          f->dump_string("pool", pool);
-          f->dump_string("image", image);
-          f->dump_string("snapshot", snap);
+          f->dump_string("pool", parent_image_spec.pool_name);
+          f->dump_string("pool_namespace", parent_image_spec.pool_namespace);
+          f->dump_string("image", parent_image_spec.image_name);
+          f->dump_string("snapshot", parent_snap_spec.name);
           f->close_section();
         }
         f->dump_int("format", old_format ? 1 : 2);
@@ -152,7 +166,7 @@ int list_process_image(librados::Rados* rados, WorkerEntry* w, bool lflag, Forma
 int do_list(const std::string &pool_name, const std::string& namespace_name,
             bool lflag, int threads, Formatter *f) {
   std::vector<WorkerEntry*> workers;
-  std::vector<std::string> names;
+  std::vector<librbd::image_spec_t> images;
   librados::Rados rados;
   librbd::RBD rbd;
   librados::IoCtx ioctx;
@@ -171,19 +185,18 @@ int do_list(const std::string &pool_name, const std::string& namespace_name,
 
   utils::disable_cache();
 
-  r = rbd.list(ioctx, names);
+  r = rbd.list2(ioctx, &images);
   if (r < 0)
     return r;
 
   if (!lflag) {
     if (f)
       f->open_array_section("images");
-    for (std::vector<std::string>::const_iterator i = names.begin();
-       i != names.end(); ++i) {
+    for (auto& image : images) {
        if (f)
-        f->dump_string("name", *i);
+        f->dump_string("name", image.name);
        else
-        std::cout << *i << std::endl;
+        std::cout << image.name << std::endl;
     }
     if (f) {
       f->close_section();
@@ -205,11 +218,12 @@ int do_list(const std::string &pool_name, const std::string& namespace_name,
     tbl.define_column("LOCK", TextTable::LEFT, TextTable::LEFT);
   }
 
-  for (int left = 0; left < std::min(threads, (int)names.size()); left++) {
+  for (size_t left = 0; left < std::min<size_t>(threads, images.size());
+       left++) {
     workers.push_back(new WorkerEntry());
   }
 
-  auto i = names.begin();
+  auto i = images.begin();
   while (true) {
     size_t workers_idle = 0;
     for (auto comp : workers) {
@@ -221,13 +235,14 @@ int do_list(const std::string &pool_name, const std::string& namespace_name,
          comp->completion = nullptr;
          // we want it to fall through in this case
        case STATE_IDLE:
-         if (i == names.end()) {
+         if (i == images.end()) {
            workers_idle++;
            continue;
          }
-         comp->name = *i;
+         comp->name = i->name;
          comp->completion = new librbd::RBD::AioCompletion(nullptr, nullptr);
-         r = rbd.aio_open_read_only(ioctx, comp->img, i->c_str(), NULL, comp->completion);
+         r = rbd.aio_open_read_only(ioctx, comp->img, i->name.c_str(), nullptr,
+                                     comp->completion);
          i++;
          comp->state = STATE_OPENED;
          break;
@@ -241,8 +256,8 @@ int do_list(const std::string &pool_name, const std::string& namespace_name,
          comp->completion->release();
          if (r < 0) {
            if (r != -ENOENT) {
-             std::cerr << "rbd: error opening " << *i << ": " << cpp_strerror(r)
-                       << std::endl;
+             std::cerr << "rbd: error opening " << i->name << ": "
+                        << cpp_strerror(r) << std::endl;
            }
            // in any event, continue to next image
            comp->state = STATE_IDLE;
@@ -250,8 +265,8 @@ int do_list(const std::string &pool_name, const std::string& namespace_name,
          }
          r = list_process_image(&rados, comp, lflag, f, tbl);
          if (r < 0) {
-             std::cerr << "rbd: error processing image " << comp->name << ": " << cpp_strerror(r)
-                       << std::endl;
+             std::cerr << "rbd: error processing image " << comp->name << ": "
+                        << cpp_strerror(r) << std::endl;
          }
          comp->completion = new librbd::RBD::AioCompletion(nullptr, nullptr);
          r = comp->img.aio_close(comp->completion);
@@ -267,7 +282,7 @@ int do_list(const std::string &pool_name, const std::string& namespace_name,
   if (f) {
     f->close_section();
     f->flush(std::cout);
-  } else if (!names.empty()) {
+  } else if (!images.empty()) {
     std::cout << tbl;
   }