This patch adds a graph view option to the `collie vdi' command.  This
is the same as `shepherd info -f graph' in the old syntax.

The output text is parsable by Graphviz (graph drawing tools developed
by AT&T Research Labs) and help us debugging VDI relation bugs.

Example:

  $ qemu-img convert src.raw sheepdog:linux     # create volume
  $ qemu-img snapshot -c name sheepdog:linux    # create snapshot
  $ qemu-system-x86_64 sheepdog:linux:1         # boot from snapshot
  $ collie vdi graph                            # show graph
  digraph G {
    node [shape = "box", fontname = "Courier"];

    "0" [shape = "ellipse", label = "root"];

    "0" -> "a5d05d";
    "a5d05d" [
      group = "linux",
      label = "name:      linux\ntag :          1\nsize:      20 MB\ndate: 
2010-06-17\ntime:   15:12:09"
    ];

    "a5d05d" -> "a5d05e";
    "a5d05e" [
      group = "linux",
      label = "name:      linux\ntag :          2\nsize:      20 MB\ndate: 
2010-06-17\ntime:   15:12:35"
    ];

    "a5d05d" -> "a5d060";
    "a5d060" [
      group = "linux",
      label = "name:      linux\ntag :          3\nsize:      20 MB\ndate: 
2010-06-17\ntime:   15:12:53"
      color="red"
    ];
  }

  $ collie vdi graph | dotty -                  # show graph with graphviz

Signed-off-by: MORITA Kazutaka <[email protected]>
---
 collie/collie.c |   51 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 50 insertions(+), 1 deletions(-)

diff --git a/collie/collie.c b/collie/collie.c
index 0e0a2a2..f493d05 100644
--- a/collie/collie.c
+++ b/collie/collie.c
@@ -56,7 +56,7 @@ static void usage(int status)
 Command syntax:\n\
   cluster (info|format|shutdown)\n\
   node (info|list)\n\
-  vdi (list|tree|delete|object|lock|release)\n\
+  vdi (list|tree|graph|delete|object|lock|release)\n\
   vm list\n\
 \n\
 Common parameters:\n\
@@ -354,6 +354,39 @@ static void print_vdi_tree(uint32_t vid, char *name, 
uint32_t tag,
        add_vdi_tree(name, buf, vid, i->parent_vdi_id, highlight && 
is_current(i));
 }
 
+static void print_vdi_graph(uint32_t vid, char *name, uint32_t tag,
+                           uint32_t flags, struct sheepdog_inode *i, void 
*data)
+{
+       time_t ti;
+       struct tm tm;
+       char dbuf[128], tbuf[128], size_str[128];
+
+       ti = i->ctime >> 32;
+       localtime_r(&ti, &tm);
+
+       strftime(dbuf, sizeof(dbuf), "%Y-%m-%d", &tm);
+       strftime(tbuf, sizeof(tbuf), "%H:%M:%S", &tm);
+       size_to_str(i->vdi_size, size_str, sizeof(size_str));
+
+       printf("  \"%x\" -> \"%x\";\n", i->parent_vdi_id, vid);
+       printf("  \"%x\" [\n"
+              "    group = \"%s\",\n"
+              "    label = \"",
+              vid, name);
+       printf("name: %10s\\n"
+              "tag : %10x\\n"
+              "size: %10s\\n"
+              "date: %10s\\n"
+              "time: %10s",
+              name, tag, size_str, dbuf, tbuf);
+
+       if (is_current(i))
+               printf("\",\n    color=\"red\"\n  ];\n\n");
+       else
+               printf("\"\n  ];\n\n");
+
+}
+
 struct vm_list_info {
        struct sheepdog_vm_list_entry *vm_list_entries;
        int nr_vms;
@@ -708,6 +741,21 @@ static int vdi_tree(int argc, char **argv)
        return 0;
 }
 
+static int vdi_graph(int argc, char **argv)
+{
+       /* print a header */
+       printf("digraph G \{\n");
+       printf("  node [shape = \"box\", fontname = \"Courier\"];\n\n");
+       printf("  \"0\" [shape = \"ellipse\", label = \"root\"];\n\n");
+
+       parse_vdi(print_vdi_graph, NULL);
+
+       /* print a footer */
+       printf("}\n");
+
+       return 0;
+}
+
 static int vdi_delete(int argc, char **argv)
 {
        char *data = argv[optind];
@@ -899,6 +947,7 @@ static struct subcommand vdi_cmd[] = {
        {"delete", SUBCMD_FLAG_NEED_NOEDLIST|SUBCMD_FLAG_NEED_THIRD_ARG, 
vdi_delete},
        {"list", SUBCMD_FLAG_NEED_NOEDLIST, vdi_list},
        {"tree", SUBCMD_FLAG_NEED_NOEDLIST, vdi_tree},
+       {"graph", SUBCMD_FLAG_NEED_NOEDLIST, vdi_graph},
        {"object", SUBCMD_FLAG_NEED_NOEDLIST|SUBCMD_FLAG_NEED_THIRD_ARG, 
vdi_object},
        {"lock", SUBCMD_FLAG_NEED_THIRD_ARG, vdi_lock},
        {"release", SUBCMD_FLAG_NEED_THIRD_ARG, vdi_release},
-- 
1.5.6.5

-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to