]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
virsh: add qemu-monitor-command --pretty
authorEric Blake <eblake@redhat.com>
Thu, 4 Oct 2012 23:14:19 +0000 (17:14 -0600)
committerEric Blake <eblake@redhat.com>
Mon, 8 Oct 2012 21:47:06 +0000 (15:47 -0600)
I was using qemu-monitor-command during development, and found it quite
hard to use.  Compare the results of this patch on ease of reading:

$ virsh qemu-monitor-command          dom '{"execute":"query-version"}'
{"return":{"qemu":{"micro":1,"minor":12,"major":0},"package":"(qemu-kvm-0.12.1.2)"},"id":"libvirt-7683"}

$ virsh qemu-monitor-command --pretty dom '{"execute":"query-version"}'
{
    "return": {
        "qemu": {
            "micro": 1,
            "minor": 12,
            "major": 0
        },
        "package": "(qemu-kvm-0.12.1.2)"
    },
    "id": "libvirt-7674"
}

* tools/virsh-host.c (cmdQemuMonitorCommand): New option.
* tools/virsh.pod (qemu-monitor-command): Document it.

tools/virsh-host.c
tools/virsh.pod

index 2c463366579227c2930fe8449c9972b71c34c16d..5cf192de65b90dadc48bd2275055fa4c5441f8e1 100644 (file)
@@ -38,6 +38,7 @@
 #include "virsh-domain.h"
 #include "xml.h"
 #include "virtypedparam.h"
+#include "json.h"
 
 /*
  * "capabilities" command
@@ -529,6 +530,8 @@ static const vshCmdInfo info_qemu_monitor_command[] = {
 static const vshCmdOptDef opts_qemu_monitor_command[] = {
     {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")},
     {"hmp", VSH_OT_BOOL, 0, N_("command is in human monitor protocol")},
+    {"pretty", VSH_OT_BOOL, 0,
+     N_("pretty-print any qemu monitor protocol output")},
     {"cmd", VSH_OT_ARGV, VSH_OFLAG_REQ, N_("command")},
     {NULL, 0, 0, NULL}
 };
@@ -544,6 +547,7 @@ cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd)
     const vshCmdOpt *opt = NULL;
     virBuffer buf = VIR_BUFFER_INITIALIZER;
     bool pad = false;
+    virJSONValuePtr pretty = NULL;
 
     dom = vshCommandOptDomain(ctl, cmd, NULL);
     if (dom == NULL)
@@ -561,12 +565,27 @@ cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd)
     }
     monitor_cmd = virBufferContentAndReset(&buf);
 
-    if (vshCommandOptBool(cmd, "hmp"))
+    if (vshCommandOptBool(cmd, "hmp")) {
+        if (vshCommandOptBool(cmd, "pretty")) {
+            vshError(ctl, _("--hmp and --pretty are not compatible"));
+            goto cleanup;
+        }
         flags |= VIR_DOMAIN_QEMU_MONITOR_COMMAND_HMP;
+    }
 
     if (virDomainQemuMonitorCommand(dom, monitor_cmd, &result, flags) < 0)
         goto cleanup;
 
+    if (vshCommandOptBool(cmd, "pretty")) {
+        char *tmp;
+        pretty = virJSONValueFromString(result);
+        if (pretty && (tmp = virJSONValueToString(pretty, true))) {
+            VIR_FREE(result);
+            result = tmp;
+        } else {
+            vshResetLibvirtError();
+        }
+    }
     vshPrint(ctl, "%s\n", result);
 
     ret = true;
@@ -574,6 +593,7 @@ cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd)
 cleanup:
     VIR_FREE(result);
     VIR_FREE(monitor_cmd);
+    virJSONValueFree(pretty);
     if (dom)
         virDomainFree(dom);
 
index c02ffe823288c9f2a581b6102eb4dbba4ca0222c..ac8a00f2a90defca9a27b55f5995fc1067c6b007 100644 (file)
@@ -2910,15 +2910,17 @@ attaching to an externally launched QEMU process. There may be
 issues with the guest ABI changing upon migration, and hotunplug
 may not work.
 
-=item B<qemu-monitor-command> I<domain> [I<--hmp>] I<command>...
+=item B<qemu-monitor-command> I<domain> { [I<--hmp>] | [I<--pretty>] }
+I<command>...
 
 Send an arbitrary monitor command I<command> to domain I<domain> through the
 qemu monitor.  The results of the command will be printed on stdout.  If
 I<--hmp> is passed, the command is considered to be a human monitor command
 and libvirt will automatically convert it into QMP if needed.  In that case
-the result will also be converted back from QMP.  If more than one argument
-is provided for I<command>, they are concatenated with a space in between
-before passing the single command to the monitor.
+the result will also be converted back from QMP.  If I<--pretty> is given,
+and the monitor uses QMP, then the output will be pretty-printed.  If more
+than one argument is provided for I<command>, they are concatenated with a
+space in between before passing the single command to the monitor.
 
 =back