]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Introduce qemuMonitorGetDeviceAliases
authorJiri Denemark <jdenemar@redhat.com>
Fri, 19 Jul 2013 13:01:38 +0000 (15:01 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Fri, 19 Jul 2013 16:45:47 +0000 (18:45 +0200)
This API provides a NULL-terminated list of devices which are currently
attached to a QEMU domain.

src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
src/qemu/qemu_monitor_json.h
tests/qemumonitorjsontest.c

index 1f6ce54846ba1371308180d3ad5046160153f9a6..0b734115e84cbbe8ddcf3248ee94bb5c77f87fe1 100644 (file)
@@ -3818,3 +3818,24 @@ int qemuMonitorDetachCharDev(qemuMonitorPtr mon,
 
     return qemuMonitorJSONDetachCharDev(mon, chrID);
 }
+
+int
+qemuMonitorGetDeviceAliases(qemuMonitorPtr mon,
+                            char ***aliases)
+{
+    VIR_DEBUG("mon=%p, aliases=%p", mon, aliases);
+
+    if (!mon) {
+        virReportError(VIR_ERR_INVALID_ARG, "%s",
+                       _("monitor must not be NULL"));
+        return -1;
+    }
+
+    if (!mon->json) {
+        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
+                       _("JSON monitor is required"));
+        return -1;
+    }
+
+    return qemuMonitorJSONGetDeviceAliases(mon, aliases);
+}
index eef0997f0693861e0dab52749f48aa1a1a2c2ef9..4a555016f01435d50284204a1beda10e92b90691 100644 (file)
@@ -713,6 +713,10 @@ int qemuMonitorAttachCharDev(qemuMonitorPtr mon,
                              virDomainChrSourceDefPtr chr);
 int qemuMonitorDetachCharDev(qemuMonitorPtr mon,
                              const char *chrID);
+
+int qemuMonitorGetDeviceAliases(qemuMonitorPtr mon,
+                                char ***aliases);
+
 /**
  * When running two dd process and using <> redirection, we need a
  * shell that will not truncate files.  These two strings serve that
index 331810103aa5fe4d225dc2cdc914ac5e3bf41658..12f7e691155e892b685d3d2ff25c8e780fcc53a3 100644 (file)
@@ -5415,3 +5415,41 @@ qemuMonitorJSONDetachCharDev(qemuMonitorPtr mon,
     virJSONValueFree(reply);
     return ret;
 }
+
+
+int
+qemuMonitorJSONGetDeviceAliases(qemuMonitorPtr mon,
+                                char ***aliases)
+{
+    qemuMonitorJSONListPathPtr *paths = NULL;
+    char **alias;
+    int ret = -1;
+    size_t i;
+    int n;
+
+    *aliases = NULL;
+
+    n = qemuMonitorJSONGetObjectListPaths(mon, "/machine/peripheral", &paths);
+    if (n < 0)
+        return -1;
+
+    if (VIR_ALLOC_N(*aliases, n + 1) < 0)
+        goto cleanup;
+
+    alias = *aliases;
+    for (i = 0; i < n; i++) {
+        if (STRPREFIX(paths[i]->type, "child<")) {
+            *alias = paths[i]->name;
+            paths[i]->name = NULL;
+            alias++;
+        }
+    }
+
+    ret = 0;
+
+cleanup:
+    for (i = 0; i < n; i++)
+        qemuMonitorJSONListPathFree(paths[i]);
+    VIR_FREE(paths);
+    return ret;
+}
index e94abf298d75cb04d72d1660f0039771ee00eb28..51cf19caec3fc93597b32acfc5dcf5b359e61166 100644 (file)
@@ -422,4 +422,8 @@ int qemuMonitorJSONAttachCharDev(qemuMonitorPtr mon,
                                  virDomainChrSourceDefPtr chr);
 int qemuMonitorJSONDetachCharDev(qemuMonitorPtr mon,
                                  const char *chrID);
+
+int qemuMonitorJSONGetDeviceAliases(qemuMonitorPtr mon,
+                                    char ***aliases);
+
 #endif /* QEMU_MONITOR_JSON_H */
index 3d2ed4b8006e873d1621220c14f907b14331595e..4061a0cba91634d0b9ea80bad376a795e34cd1af 100644 (file)
@@ -882,6 +882,66 @@ cleanup:
 }
 
 
+static int
+testQemuMonitorJSONGetDeviceAliases(const void *data)
+{
+    const virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr)data;
+    qemuMonitorTestPtr test = qemuMonitorTestNew(true, xmlopt);
+    int ret = -1;
+    char **aliases = NULL;
+    char **alias;
+    const char *expected[] = {
+        "virtio-disk25", "video0", "serial0", "ide0-0-0", "usb", NULL };
+
+    if (!test)
+        return -1;
+
+    if (qemuMonitorTestAddItem(test,
+                               "qom-list",
+                               "{\"return\": ["
+                               " {\"name\": \"virtio-disk25\","
+                               "  \"type\": \"child<virtio-blk-pci>\"},"
+                               " {\"name\": \"video0\","
+                               "  \"type\": \"child<VGA>\"},"
+                               " {\"name\": \"serial0\","
+                               "  \"type\": \"child<isa-serial>\"},"
+                               " {\"name\": \"ide0-0-0\","
+                               "  \"type\": \"child<ide-cd>\"},"
+                               " {\"name\": \"usb\","
+                               "  \"type\": \"child<piix3-usb-uhci>\"},"
+                               " {\"name\": \"type\", \"type\": \"string\"}"
+                               "]}") < 0)
+        goto cleanup;
+
+    if (qemuMonitorJSONGetDeviceAliases(qemuMonitorTestGetMonitor(test),
+                                        &aliases) < 0)
+        goto cleanup;
+
+    if (!aliases) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", "no aliases returned");
+        goto cleanup;
+    }
+
+    ret = 0;
+    for (alias = aliases; *alias; alias++) {
+        if (!virStringArrayHasString((char **) expected, *alias)) {
+            fprintf(stderr, "got unexpected device alias '%s'\n", *alias);
+            ret = -1;
+        }
+    }
+    for (alias = (char **) expected; *alias; alias++) {
+        if (!virStringArrayHasString(aliases, *alias)) {
+            fprintf(stderr, "missing expected alias '%s'\n", *alias);
+            ret = -1;
+        }
+    }
+
+cleanup:
+    virStringFreeList(aliases);
+    return ret;
+}
+
+
 static int
 mymain(void)
 {
@@ -915,6 +975,7 @@ mymain(void)
     DO_TEST(GetListPaths);
     DO_TEST(GetObjectProperty);
     DO_TEST(SetObjectProperty);
+    DO_TEST(GetDeviceAliases);
 
     virObjectUnref(xmlopt);