]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: fix virDomainDefParseXML for parallels
authorDmitry Guryanov <dguryanov@parallels.com>
Tue, 7 Apr 2015 20:35:11 +0000 (23:35 +0300)
committerMichal Privoznik <mprivozn@redhat.com>
Fri, 10 Apr 2015 11:31:49 +0000 (13:31 +0200)
Handle input devices in virDomainDefParseXML properly
in case of parallels containers and VMs.

Parallels containers support only
VIR_DOMAIN_INPUT_BUS_PARALLELS. And if VNC is enabled
we should add implicit mouse and keyboard.

For VMs we should add implicit PS/2 mouse and
keyboard.

BTW, is it worth to refactor code and move
all this code to drivers, to *DomainDefPostParse
functions?

Signed-off-by: Dmitry Guryanov <dguryanov@parallels.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
src/conf/domain_conf.c

index fbf8052a90d45be422d0f2ed28373080008a05e5..1ff42f9e7cd190eb2b74941d625977b6372854cc 100644 (file)
@@ -9458,7 +9458,7 @@ virDomainInputDefParseXML(const virDomainDef *dom,
                                bus);
                 goto error;
             }
-        } else {
+        } else if (STREQ(dom->os.type, "xen")) {
             if (def->bus != VIR_DOMAIN_INPUT_BUS_XEN) {
                 virReportError(VIR_ERR_INTERNAL_ERROR,
                                _("unsupported input bus %s"),
@@ -9472,6 +9472,30 @@ virDomainInputDefParseXML(const virDomainDef *dom,
                                type);
                 goto error;
             }
+        } else {
+            if (dom->virtType == VIR_DOMAIN_VIRT_PARALLELS) {
+                if (def->bus != VIR_DOMAIN_INPUT_BUS_PARALLELS) {
+                    virReportError(VIR_ERR_INTERNAL_ERROR,
+                                   _("parallels containers don't support "
+                                     "input bus %s"),
+                                   bus);
+                    goto error;
+                }
+
+                if (def->type != VIR_DOMAIN_INPUT_TYPE_MOUSE &&
+                    def->type != VIR_DOMAIN_INPUT_TYPE_KBD) {
+                    virReportError(VIR_ERR_INTERNAL_ERROR,
+                                   _("parallels bus does not support "
+                                     "%s input device"),
+                                   type);
+                    goto error;
+                }
+            } else {
+                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                               _("Input devices are not supported by this "
+                                 "virtualization driver."));
+                goto error;
+            }
         }
     } else {
         if (STREQ(dom->os.type, "hvm")) {
@@ -9482,8 +9506,11 @@ virDomainInputDefParseXML(const virDomainDef *dom,
             } else {
                 def->bus = VIR_DOMAIN_INPUT_BUS_USB;
             }
-        } else {
+        } else if (STREQ(dom->os.type, "xen")) {
             def->bus = VIR_DOMAIN_INPUT_BUS_XEN;
+        } else {
+            if ((dom->virtType == VIR_DOMAIN_VIRT_PARALLELS))
+                def->bus = VIR_DOMAIN_INPUT_BUS_PARALLELS;
         }
     }
 
@@ -14979,8 +15006,13 @@ virDomainDefParseXML(xmlDocPtr xml,
              input->bus == VIR_DOMAIN_INPUT_BUS_PS2 &&
              (input->type == VIR_DOMAIN_INPUT_TYPE_MOUSE ||
               input->type == VIR_DOMAIN_INPUT_TYPE_KBD)) ||
-            (STRNEQ(def->os.type, "hvm") &&
+            (STREQ(def->os.type, "xen") &&
              input->bus == VIR_DOMAIN_INPUT_BUS_XEN &&
+             (input->type == VIR_DOMAIN_INPUT_TYPE_MOUSE ||
+              input->type == VIR_DOMAIN_INPUT_TYPE_KBD)) ||
+            (STREQ(def->os.type, "exe") &&
+             def->virtType == VIR_DOMAIN_VIRT_PARALLELS &&
+             input->bus == VIR_DOMAIN_INPUT_BUS_PARALLELS &&
              (input->type == VIR_DOMAIN_INPUT_TYPE_MOUSE ||
               input->type == VIR_DOMAIN_INPUT_TYPE_KBD))) {
             virDomainInputDefFree(input);
@@ -15014,6 +15046,9 @@ virDomainDefParseXML(xmlDocPtr xml,
 
         if (STREQ(def->os.type, "hvm"))
             input_bus = VIR_DOMAIN_INPUT_BUS_PS2;
+        if (STREQ(def->os.type, "exe") &&
+            def->virtType == VIR_DOMAIN_VIRT_PARALLELS)
+            input_bus = VIR_DOMAIN_INPUT_BUS_PARALLELS;
 
         if (virDomainDefMaybeAddInput(def,
                                       VIR_DOMAIN_INPUT_TYPE_MOUSE,