[PATCH v3 02/14] domain_conf.c: move primary video check to validate callback

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This check isn't exclusive to XML parsing. Let's move it to
virDomainDefVideoValidate() in domain_validate.c

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.

Reviewed-by: Michal Privoznik <mprivozn@xxxxxxxxxx>
Signed-off-by: Daniel Henrique Barboza <danielhb413@xxxxxxxxx>
---
 src/conf/domain_conf.c                        | 10 +++---
 src/conf/domain_validate.c                    | 24 ++++++++++++++
 src/conf/domain_validate.h                    |  1 +
 .../video-multiple-primaries.err              |  1 +
 .../video-multiple-primaries.xml              | 32 +++++++++++++++++++
 tests/qemuxml2argvtest.c                      |  5 +++
 6 files changed, 67 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 4a45c76cf1..a8bd54a368 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -7348,6 +7348,9 @@ virDomainDefValidateInternal(const virDomainDef *def,
     if (virDomainDefBootValidate(def) < 0)
         return -1;
 
+    if (virDomainDefVideoValidate(def) < 0)
+        return -1;
+
     if (virDomainNumaDefValidate(def->numa) < 0)
         return -1;
 
@@ -22141,14 +22144,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/src/conf/domain_validate.c b/src/conf/domain_validate.c
index e4d947c553..eb2ef6c7fb 100644
--- a/src/conf/domain_validate.c
+++ b/src/conf/domain_validate.c
@@ -49,3 +49,27 @@ virDomainDefBootValidate(const virDomainDef *def)
 
     return 0;
 }
+
+
+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;
+}
diff --git a/src/conf/domain_validate.h b/src/conf/domain_validate.h
index 2b558668a9..df4f35c1dd 100644
--- a/src/conf/domain_validate.h
+++ b/src/conf/domain_validate.h
@@ -25,3 +25,4 @@
 #include "domain_conf.h"
 
 int virDomainDefBootValidate(const virDomainDef *def);
+int virDomainDefVideoValidate(const virDomainDef *def);
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




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux