]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd: resolve names of snapshot namespaces
authorJason Dillaman <dillaman@redhat.com>
Wed, 24 Jan 2018 20:34:19 +0000 (15:34 -0500)
committerJason Dillaman <dillaman@redhat.com>
Mon, 5 Feb 2018 16:11:59 +0000 (11:11 -0500)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/tools/rbd/action/Snap.cc

index 47a6dbd295fc0a813bb046ba57b919bff7fdf264..533e3d4349affbe68578da9d17230157be47ca49 100644 (file)
@@ -40,8 +40,10 @@ int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados::
   int r;
 
   r = image.snap_list(snaps);
-  if (r < 0)
+  if (r < 0) {
+    std::cerr << "rbd: unable to list snapshots" << std::endl;
     return r;
+  }
 
   if (!all_snaps) {
     snaps.erase(remove_if(snaps.begin(),
@@ -76,9 +78,33 @@ int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados::
       tt_str = ctime(&tt);
       tt_str = tt_str.substr(0, tt_str.length() - 1);
     }
+
+    librbd::snap_namespace_type_t snap_namespace;
+    r = image.snap_get_namespace_type(s->id, &snap_namespace);
+    if (r < 0) {
+      std::cerr << "rbd: unable to retrieve snap namespace" << std::endl;
+      return r;
+    }
+
+    std::string snap_namespace_name = "Unknown";
+    switch (snap_namespace) {
+    case RBD_SNAP_NAMESPACE_TYPE_USER:
+      snap_namespace_name = "user";
+      break;
+    case RBD_SNAP_NAMESPACE_TYPE_GROUP:
+      snap_namespace_name = "group";
+      break;
+    case RBD_SNAP_NAMESPACE_TYPE_TRASH:
+      snap_namespace_name = "trash";
+      break;
+    }
+
+    int get_group_res = -ENOENT;
     librbd::snap_group_namespace_t group_snap;
-    int get_group_res = image.snap_get_group_namespace(s->id, &group_snap,
-                                                       sizeof(group_snap));
+    if (snap_namespace == RBD_SNAP_NAMESPACE_TYPE_GROUP) {
+      get_group_res = image.snap_get_group_namespace(s->id, &group_snap,
+                                                     sizeof(group_snap));
+    }
 
     if (f) {
       f->open_object_section("snapshot");
@@ -88,6 +114,7 @@ int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados::
       f->dump_string("timestamp", tt_str);
       if (all_snaps) {
        f->open_object_section("namespace");
+        f->dump_string("type", snap_namespace_name);
        if (get_group_res == 0) {
          std::string pool_name = pool_map[group_snap.group_pool];
          f->dump_string("pool", pool_name);
@@ -98,19 +125,20 @@ int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados::
       }
       f->close_section();
     } else {
-      std::string namespace_string;
-      if (all_snaps && (get_group_res == 0)) {
-       ostringstream oss;
-       std::string pool_name = pool_map[group_snap.group_pool];
-       oss << "group snapshot (" << pool_name << "/" <<
-                                            group_snap.group_name << "@" <<
-                                            group_snap.group_snap_name << ")";
-
-       namespace_string = oss.str();
-      }
       t << s->id << s->name << stringify(prettybyte_t(s->size)) << tt_str;
+
       if (all_snaps) {
-       t << namespace_string;
+       ostringstream oss;
+        oss << snap_namespace_name;
+
+        if (get_group_res == 0) {
+         std::string pool_name = pool_map[group_snap.group_pool];
+         oss << " (" << pool_name << "/"
+                     << group_snap.group_name << "@"
+                     << group_snap.group_snap_name << ")";
+        }
+
+       t << oss.str();
       }
       t << TextTable::endrow;
     }