[libvirt] [PATCH v2] qemuhotplugtest: Add tests for virtio disk hotplug

Jiri Denemark jdenemar at redhat.com
Mon Aug 26 13:47:27 UTC 2013


---
Version 2:
- generate aliases for all devices present in domain XML; this is
  required for hotplugging PCI devices as that needs the appropriate PCI
  controller to already have its alias assigned

 tests/qemuhotplugtest.c                            | 49 +++++++++++++++++++---
 ...qemuhotplug-console-compat-2+console-virtio.xml |  2 +-
 .../qemuhotplug-disk-virtio.xml                    |  7 ++++
 .../qemuhotplug-hotplug-base+disk-virtio.xml       | 46 ++++++++++++++++++++
 .../qemuxml2argv-console-compat-2.xml              |  2 +-
 5 files changed, 98 insertions(+), 8 deletions(-)
 create mode 100644 tests/qemuhotplugtestdata/qemuhotplug-disk-virtio.xml
 create mode 100644 tests/qemuhotplugtestdata/qemuhotplug-hotplug-base+disk-virtio.xml

diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c
index 34b375f..7e547ad 100644
--- a/tests/qemuhotplugtest.c
+++ b/tests/qemuhotplugtest.c
@@ -73,7 +73,15 @@ qemuHotplugCreateObjects(virDomainXMLOptionPtr xmlopt,
         goto cleanup;
 
     /* for attach & detach qemu must support -device */
+    virQEMUCapsSet(priv->qemuCaps, QEMU_CAPS_DRIVE);
     virQEMUCapsSet(priv->qemuCaps, QEMU_CAPS_DEVICE);
+    virQEMUCapsSet(priv->qemuCaps, QEMU_CAPS_NET_NAME);
+
+    if (qemuDomainAssignPCIAddresses((*vm)->def, priv->qemuCaps, *vm) < 0)
+        goto cleanup;
+
+    if (qemuAssignDeviceAliases((*vm)->def, priv->qemuCaps) < 0)
+        goto cleanup;
 
     ret = 0;
 cleanup:
@@ -87,12 +95,14 @@ testQemuHotplugAttach(virDomainObjPtr vm,
     int ret = -1;
 
     switch (dev->type) {
+    case VIR_DOMAIN_DEVICE_DISK:
+        /* conn in only used for storage pool and secrets lookup so as long
+         * as we don't use any of them, passing NULL should be safe
+         */
+        ret = qemuDomainAttachDeviceDiskLive(NULL, &driver, vm, dev);
+        break;
     case VIR_DOMAIN_DEVICE_CHR:
         ret = qemuDomainAttachChrDevice(&driver, vm, dev->data.chr);
-        if (!ret) {
-            /* vm->def stolen dev->data.chr so we ought to avoid freeing it */
-            dev->data.chr = NULL;
-        }
         break;
     default:
         if (virTestGetVerbose())
@@ -111,6 +121,9 @@ testQemuHotplugDetach(virDomainObjPtr vm,
     int ret = -1;
 
     switch (dev->type) {
+    case VIR_DOMAIN_DEVICE_DISK:
+        ret = qemuDomainDetachDeviceDiskLive(&driver, vm, dev);
+        break;
     case VIR_DOMAIN_DEVICE_CHR:
         ret = qemuDomainDetachChrDevice(&driver, vm, dev->data.chr);
         break;
@@ -256,6 +269,11 @@ testQemuHotplug(const void *data)
     switch (test->action) {
     case ATTACH:
         ret = testQemuHotplugAttach(vm, dev);
+        if (ret == 0) {
+            /* vm->def stolen dev->data.* so we just need to free the dev
+             * envelope */
+            VIR_FREE(dev);
+        }
         if (ret == 0 || fail)
             ret = testQemuHotplugCheckResult(vm, result_xml, fail);
         break;
@@ -297,6 +315,7 @@ mymain(void)
 {
     int ret = 0;
     struct qemuHotplugTestData data = {0};
+    virSecurityManagerPtr mgr;
 
 #if !WITH_YAJL
     fputs("libvirt not compiled with yajl, skipping this test\n", stderr);
@@ -313,12 +332,22 @@ mymain(void)
     driver.config = virQEMUDriverConfigNew(false);
     VIR_FREE(driver.config->spiceListen);
     VIR_FREE(driver.config->vncListen);
+    /* some dummy values from 'config file' */
+    if (VIR_STRDUP_QUIET(driver.config->spicePassword, "123456") < 0)
+        return EXIT_FAILURE;
 
     if (!(driver.domainEventState = virDomainEventStateNew()))
         return EXIT_FAILURE;
 
-    /* some dummy values from 'config file' */
-    if (VIR_STRDUP_QUIET(driver.config->spicePassword, "123456") < 0)
+    driver.lockManager = virLockManagerPluginNew("nop", "qemu",
+                                                 driver.config->configBaseDir,
+                                                 0);
+    if (!driver.lockManager)
+        return EXIT_FAILURE;
+
+    if (!(mgr = virSecurityManagerNew("none", "qemu", false, false, false)))
+        return EXIT_FAILURE;
+    if (!(driver.securityManager = virSecurityManagerNewStack(mgr)))
         return EXIT_FAILURE;
 
 #define DO_TEST(file, ACTION, dev, fial, kep, ...)                          \
@@ -346,6 +375,7 @@ mymain(void)
 
 
 #define QMP_OK      "{\"return\": {}}"
+#define HMP(msg)    "{\"return\": \"" msg "\"}"
 
     DO_TEST_UPDATE("graphics-spice", "graphics-spice-nochange", false, false, NULL);
     DO_TEST_UPDATE("graphics-spice-timeout", "graphics-spice-timeout-nochange", false, false,
@@ -366,6 +396,13 @@ mymain(void)
                    "device_del", QMP_OK,
                    "chardev-remove", QMP_OK);
 
+    DO_TEST_ATTACH("hotplug-base", "disk-virtio", false, true,
+                   "human-monitor-command", HMP("OK\\r\\n"),
+                   "device_add", QMP_OK);
+    DO_TEST_DETACH("hotplug-base", "disk-virtio", false, false,
+                   "device_del", QMP_OK,
+                   "human-monitor-command", HMP(""));
+
     virObjectUnref(driver.caps);
     virObjectUnref(driver.xmlopt);
     virObjectUnref(driver.config);
diff --git a/tests/qemuhotplugtestdata/qemuhotplug-console-compat-2+console-virtio.xml b/tests/qemuhotplugtestdata/qemuhotplug-console-compat-2+console-virtio.xml
index 21fd090..d75af19 100644
--- a/tests/qemuhotplugtestdata/qemuhotplug-console-compat-2+console-virtio.xml
+++ b/tests/qemuhotplugtestdata/qemuhotplug-console-compat-2+console-virtio.xml
@@ -50,7 +50,7 @@
       <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
     </controller>
     <controller type='pci' index='0' model='pci-root'>
-      <alias name='pci0'/>
+      <alias name='pci.0'/>
     </controller>
     <controller type='virtio-serial' index='0'>
       <alias name='virtio-serial0'/>
diff --git a/tests/qemuhotplugtestdata/qemuhotplug-disk-virtio.xml b/tests/qemuhotplugtestdata/qemuhotplug-disk-virtio.xml
new file mode 100644
index 0000000..844dc79
--- /dev/null
+++ b/tests/qemuhotplugtestdata/qemuhotplug-disk-virtio.xml
@@ -0,0 +1,7 @@
+<disk type='file' device='disk'>
+  <driver name='qemu' type='raw' cache='none'/>
+  <source file='/dev/null'/>
+  <target dev='vde' bus='virtio'/>
+  <readonly/>
+  <shareable/>
+</disk>
diff --git a/tests/qemuhotplugtestdata/qemuhotplug-hotplug-base+disk-virtio.xml b/tests/qemuhotplugtestdata/qemuhotplug-hotplug-base+disk-virtio.xml
new file mode 100644
index 0000000..e96055c
--- /dev/null
+++ b/tests/qemuhotplugtestdata/qemuhotplug-hotplug-base+disk-virtio.xml
@@ -0,0 +1,46 @@
+<domain type='kvm'>
+  <name>hotplug</name>
+  <uuid>d091ea82-29e6-2e34-3005-f02617b36e87</uuid>
+  <memory unit='KiB'>4194304</memory>
+  <currentMemory unit='KiB'>4194304</currentMemory>
+  <vcpu placement='static'>4</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <features>
+    <acpi/>
+    <apic/>
+    <pae/>
+  </features>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>restart</on_crash>
+  <devices>
+    <emulator>/usr/libexec/qemu-kvm</emulator>
+    <disk type='file' device='disk'>
+      <driver name='qemu' type='raw' cache='none'/>
+      <source file='/dev/null'/>
+      <target dev='vde' bus='virtio'/>
+      <readonly/>
+      <shareable/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
+    </disk>
+    <controller type='usb' index='0'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+    </controller>
+    <controller type='ide' index='0'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
+    </controller>
+    <controller type='scsi' index='0' model='virtio-scsi'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
+    </controller>
+    <controller type='pci' index='0' model='pci-root'/>
+    <controller type='virtio-serial' index='0'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
+    </controller>
+    <memballoon model='none'/>
+  </devices>
+  <seclabel type='none'/>
+</domain>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-console-compat-2.xml b/tests/qemuxml2argvdata/qemuxml2argv-console-compat-2.xml
index 3fc1153..37e8e00 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-console-compat-2.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-console-compat-2.xml
@@ -50,7 +50,7 @@
       <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
     </controller>
     <controller type='pci' index='0' model='pci-root'>
-      <alias name='pci0'/>
+      <alias name='pci.0'/>
     </controller>
     <controller type='virtio-serial' index='0'>
       <alias name='virtio-serial0'/>
-- 
1.8.3.2




More information about the libvir-list mailing list