[libvirt] [PATCH 4/5] virsh: Expose virConnectGetEmulatorCapabilities

Michal Privoznik mprivozn at redhat.com
Fri Jun 20 14:19:09 UTC 2014


The API is exposed under emulatorcaps command.

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 tools/virsh-host.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 tools/virsh.pod    | 13 ++++++++++
 2 files changed, 87 insertions(+)

diff --git a/tools/virsh-host.c b/tools/virsh-host.c
index 13d4c5c..1f9dd0d 100644
--- a/tools/virsh-host.c
+++ b/tools/virsh-host.c
@@ -69,6 +69,74 @@ cmdCapabilities(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
 }
 
 /*
+ * "emulatorcaps" command
+ */
+static const vshCmdInfo info_emulatorcaps[] = {
+    {.name = "help",
+     .data = N_("emulator capabilities")
+    },
+    {.name = "desc",
+     .data = N_("Returns capabilities of emulator with respect to host and libvirt.")
+    },
+    {.name = NULL}
+};
+
+static const vshCmdOptDef opts_emulatorcaps[] = {
+    {.name = "emulatorbin",
+     .type = VSH_OT_STRING,
+     .help = N_("path to emulator binary"),
+    },
+    {.name = "virttype",
+     .type = VSH_OT_STRING,
+     .help = N_("virtualization type (/domain/@type)"),
+    },
+    {.name = "machine",
+     .type = VSH_OT_STRING,
+     .help = N_("machine type (/domain/os/type/@machine)"),
+    },
+    {.name = NULL}
+};
+
+static bool
+cmdEmulatorCaps(vshControl *ctl, const vshCmd *cmd)
+{
+    bool ret = false;
+    char *caps;
+    const char *emulatorbin = NULL;
+    const char *machine = NULL;
+    const char *virttype = NULL;
+    const unsigned int flags = 0; /* No flags so far */
+
+    if (vshCommandOptString(cmd, "emulatorbin", &emulatorbin) < 0) {
+        vshError(ctl, "%s", _("ble"));
+        goto cleanup;
+    }
+
+    if (vshCommandOptString(cmd, "virttype", &virttype) < 0) {
+        vshError(ctl, "%s", _("ble"));
+        goto cleanup;
+    }
+
+    if (vshCommandOptString(cmd, "machine", &machine) < 0) {
+        vshError(ctl, "%s", _("ble"));
+        goto cleanup;
+    }
+
+    caps = virConnectGetEmulatorCapabilities(ctl->conn, emulatorbin,
+                                             machine, virttype, flags);
+    if (!caps) {
+        vshError(ctl, "%s", _("failed to get emulator capabilities"));
+        goto cleanup;
+    }
+
+    vshPrint(ctl, "%s\n", caps);
+    ret = true;
+ cleanup:
+    VIR_FREE(caps);
+    return ret;
+}
+
+/*
  * "freecell" command
  */
 static const vshCmdInfo info_freecell[] = {
@@ -1131,6 +1199,12 @@ const vshCmdDef hostAndHypervisorCmds[] = {
      .info = info_cpu_models,
      .flags = 0
     },
+    {.name = "emulatorcaps",
+     .handler = cmdEmulatorCaps,
+     .opts = opts_emulatorcaps,
+     .info = info_emulatorcaps,
+     .flags = 0
+    },
     {.name = "freecell",
      .handler = cmdFreecell,
      .opts = opts_freecell,
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 2c0f18a..155568f 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -505,6 +505,19 @@ B<virsh> list --title
   0     Domain-0                       running    Mailserver 1
   2     fedora                         paused
 
+=item B<emulatorcaps> I<emulatorbin> I<virttype> [I<machine>]
+
+Print an XML document describing the capabilities of the
+hypervisor we are currently connected to. This may be useful if
+you intend to create a new domain and are curious if for instance
+should use VFIO or legacy KVM device passthrough. The
+I<emulatorbin> specifies the path to the emulator (this is same
+as <emulator> element in the domain XML). Then, I<virttype>
+specifies the virtualization used (the domain XML counterpart is
+the 'type' attribute of the <domain/> top level element). The
+last, optional argument overrides the default machine for the
+emulator (can be found in domain XML under /domain/os/type).
+
 =item B<freecell> [{ [I<--cellno>] B<cellno> | I<--all> }]
 
 Prints the available amount of memory on the machine or within a NUMA
-- 
1.8.5.5




More information about the libvir-list mailing list