]> xenbits.xensource.com Git - 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)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 25 May 2016 08:15:54 +0000 (10:15 +0200)
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.

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

index e29df0712401de4ce65534318b8468770b84024f..825036cb1dd4165b4e2201b87cadedbe79f89a5a 100644 (file)
@@ -307,7 +307,9 @@ struct _qemuDomainDiskPrivate {
 struct qemuDomainDiskInfo {
     bool removable;
     bool locked;
+    bool tray;
     bool tray_open;
+    bool empty;
     int io_status;
 };
 
index 64a87656d28c7f34dcd99cf36631dad649a0275c..0508fe6d0c3b960a56d853c5c5429951bbad82ca 100644 (file)
@@ -1832,11 +1832,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 229ccac504ac262a912a66a4f2a2e5502a7d3c6e..87b1a8f4aea9b6e1699efbbf45513812f575351d 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;