[PATCH v2 2/9] domain_conf.c: move primary video check to validate callback

Daniel Henrique Barboza danielhb413 at gmail.com
Mon Dec 7 13:54:28 UTC 2020


Move this check to virDomainDefVideoValidate() since it's not related to XML
parsing.

We don't have a failure test for this scenario, so a new test called
'video-multiple-primaries' was added to test this failure case.

Signed-off-by: Daniel Henrique Barboza <danielhb413 at gmail.com>
---
 src/conf/domain_conf.c                        | 34 +++++++++++++++----
 .../video-multiple-primaries.err              |  1 +
 .../video-multiple-primaries.xml              | 32 +++++++++++++++++
 tests/qemuxml2argvtest.c                      |  5 +++
 4 files changed, 66 insertions(+), 6 deletions(-)
 create mode 100644 tests/qemuxml2argvdata/video-multiple-primaries.err
 create mode 100644 tests/qemuxml2argvdata/video-multiple-primaries.xml

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index e53a7372fc..4b5cab87e7 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -7321,6 +7321,30 @@ virDomainDefBootValidate(const virDomainDef *def)
 }
 
 
+static int
+virDomainDefVideoValidate(const virDomainDef *def)
+{
+    size_t i;
+
+    if (def->nvideos == 0)
+        return 0;
+
+    /* Any video marked as primary will be put in index 0 by the
+     * parser. Ensure that we have only one primary set by the user. */
+    if (def->videos[0]->primary) {
+        for (i = 1; i < def->nvideos; i++) {
+            if (def->videos[i]->primary) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                               _("Only one primary video device is supported"));
+                return -1;
+            }
+        }
+    }
+
+    return 0;
+}
+
+
 static int
 virDomainDefValidateInternal(const virDomainDef *def,
                              virDomainXMLOptionPtr xmlopt)
@@ -7369,6 +7393,9 @@ virDomainDefValidateInternal(const virDomainDef *def,
     if (virDomainDefBootValidate(def) < 0)
         return -1;
 
+    if (virDomainDefVideoValidate(def) < 0)
+        return -1;
+
     if (virDomainNumaDefValidate(def->numa) < 0)
         return -1;
 
@@ -22162,14 +22189,9 @@ virDomainDefParseXML(xmlDocPtr xml,
             goto error;
 
         if (video->primary) {
-            if (def->nvideos != 0 && def->videos[0]->primary) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                               _("Only one primary video device is supported"));
-                goto error;
-            }
-
             insertAt = 0;
         }
+
         if (VIR_INSERT_ELEMENT_INPLACE(def->videos,
                                        insertAt,
                                        def->nvideos,
diff --git a/tests/qemuxml2argvdata/video-multiple-primaries.err b/tests/qemuxml2argvdata/video-multiple-primaries.err
new file mode 100644
index 0000000000..f81b7275e4
--- /dev/null
+++ b/tests/qemuxml2argvdata/video-multiple-primaries.err
@@ -0,0 +1 @@
+unsupported configuration: Only one primary video device is supported
diff --git a/tests/qemuxml2argvdata/video-multiple-primaries.xml b/tests/qemuxml2argvdata/video-multiple-primaries.xml
new file mode 100644
index 0000000000..977227c5ff
--- /dev/null
+++ b/tests/qemuxml2argvdata/video-multiple-primaries.xml
@@ -0,0 +1,32 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>1048576</memory>
+  <currentMemory unit='KiB'>1048576</currentMemory>
+  <vcpu>1</vcpu>
+  <os>
+    <type arch='i686' machine='pc'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/usr/bin/qemu-system-i386</emulator>
+    <disk type='file' device='disk'>
+      <driver name='qemu' type='qcow2' cache='none'/>
+      <source file='/var/lib/libvirt/images/QEMUGuest1'/>
+      <target dev='hda' bus='ide'/>
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+    </disk>
+    <controller type='ide' index='0'/>
+    <video>
+      <model type='vga' vram='16384' heads='1' primary='yes'/>
+    </video>
+    <video>
+      <model type='qxl' heads='1' primary='yes'/>
+    </video>
+    <memballoon model='virtio'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 202fc83ccf..0e7d8d5ba3 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -2379,6 +2379,11 @@ mymain(void)
     DO_TEST_CAPS_ARCH_LATEST("default-video-type-riscv64", "riscv64");
     DO_TEST_CAPS_ARCH_LATEST("default-video-type-s390x", "s390x");
 
+    DO_TEST_PARSE_ERROR("video-multiple-primaries",
+                        QEMU_CAPS_DEVICE_QXL,
+                        QEMU_CAPS_DEVICE_VGA,
+                        QEMU_CAPS_DEVICE_VIDEO_PRIMARY);
+
     DO_TEST("virtio-rng-default",
             QEMU_CAPS_DEVICE_VIRTIO_RNG,
             QEMU_CAPS_OBJECT_RNG_RANDOM);
-- 
2.26.2




More information about the libvir-list mailing list