]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Extract more information about qemu drives
authorPeter Krempa <pkrempa@redhat.com>
Thu, 19 May 2016 12:57:41 +0000 (14:57 +0200)
committerCole Robinson <crobinso@redhat.com>
Thu, 23 Jun 2016 19:50:12 +0000 (15:50 -0400)
Extract whether a given drive has a tray and whether there is no image
inserted.

Negative logic for the image insertion is chosen so that the flag is set
only if we are certain of the fact.

(cherry picked from commit f1690dc3d7934bf70f4fbc84d55bf210276c6f27)

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

index ada4a17ed2876014a2501824bce19fecaa444b59..fbf5b1c9668c78e856887119549fe1138abe0494 100644 (file)
@@ -241,7 +241,9 @@ struct _qemuDomainDiskPrivate {
 struct qemuDomainDiskInfo {
     bool removable;
     bool locked;
+    bool tray;
     bool tray_open;
+    bool empty;
     int io_status;
 };
 
index e140d0eeb03bcd602fd5126a75ead1a9092d33e8..bd5537a10a3056fcd9a951fb2684684a7e7c0244 100644 (file)
@@ -1797,11 +1797,13 @@ int qemuMonitorJSONGetBlockInfo(qemuMonitorPtr mon,
             goto cleanup;
         }
 
-        /* Don't check for success here, because 'tray_open' is presented iff
-         * medium is ejected.
-         */
-        ignore_value(virJSONValueObjectGetBoolean(dev, "tray_open",
-                                                  &info->tray_open));
+        /* 'tray_open' is present only if the device has a tray */
+        if (virJSONValueObjectGetBoolean(dev, "tray_open", &info->tray_open) == 0)
+            info->tray = true;
+
+        /* presence of 'inserted' notifies that a medium is in the device */
+        if (!virJSONValueObjectGetObject(dev, "inserted"))
+            info->empty = true;
 
         /* Missing io-status indicates no error */
         if ((status = virJSONValueObjectGetString(dev, "io-status"))) {
index cb917c26be72743900eea99016e1629d5f1e8dbe..315baeaaad542eb5a3989fc01b0c38e00063a8cb 100644 (file)
@@ -114,6 +114,14 @@ const char *queryBlockReply =
 "            },"
 "            \"tray_open\": false,"
 "            \"type\": \"unknown\""
+"        },"
+"        {"
+"            \"io-status\": \"ok\","
+"            \"device\": \"drive-ide0-1-1\","
+"            \"locked\": false,"
+"            \"removable\": true,"
+"            \"tray_open\": false,"
+"            \"type\": \"unknown\""
 "        }"
 "    ],"
 "    \"id\": \"libvirt-10\""
@@ -1404,12 +1412,27 @@ testQemuMonitorJSONqemuMonitorJSONGetBlockInfo(const void *data)
 
     info->locked = true;
     info->removable = true;
+    info->tray = true;
+
     if (virHashAddEntry(expectedBlockDevices, "ide0-1-0", info) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                        "Unable to create expectedBlockDevices hash table");
         goto cleanup;
     }
 
+    if (VIR_ALLOC(info) < 0)
+        goto cleanup;
+
+    info->removable = true;
+    info->tray = true;
+    info->empty = true;
+
+    if (virHashAddEntry(expectedBlockDevices, "ide0-1-1", info) < 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       "Unable to create expectedBlockDevices hash table");
+        goto cleanup;
+    }
+
     if (qemuMonitorTestAddItem(test, "query-block", queryBlockReply) < 0)
         goto cleanup;