[libvirt] [PATCHv2] qemu: Do fake auto-allocation of ports when generating native command

Peter Krempa pkrempa at redhat.com
Thu May 2 09:16:35 UTC 2013


When attempting to generate the native command line from an XML file
that uses graphics port auto allocation, the generated commandline
wouldn't be valid.

This patch adds fake autoallocation of ports as done when starting the
actual machine.
---

Notes:
    Version 2:
    - rebased after context-conflict with 11fc1beab6e018a88182f80056d35217c150b3de

 src/qemu/qemu_driver.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 9492850..45fcf05 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -5274,6 +5274,58 @@ static char *qemuConnectDomainXMLToNative(virConnectPtr conn,
     if (qemuDomainAssignAddresses(def, qemuCaps, NULL) < 0)
         goto cleanup;

+    /* do fake auto-alloc of graphics ports, if such config is used */
+    for (i = 0 ; i < def->ngraphics; ++i) {
+        virDomainGraphicsDefPtr graphics = def->graphics[i];
+        if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
+            !graphics->data.vnc.socket && graphics->data.vnc.autoport) {
+            graphics->data.vnc.port = 5900;
+        } else if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
+            int j;
+            bool needTLSPort = false;
+            bool needPort = false;
+            int defaultMode = graphics->data.spice.defaultMode;
+
+            if (graphics->data.spice.autoport) {
+                /* check if tlsPort or port need allocation */
+                for (j = 0 ; j < VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_LAST ; j++) {
+                    switch (graphics->data.spice.channels[j]) {
+                    case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_SECURE:
+                        needTLSPort = true;
+                        break;
+
+                    case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_INSECURE:
+                        needPort = true;
+                        break;
+
+                    case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_ANY:
+                        switch (defaultMode) {
+                        case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_SECURE:
+                            needTLSPort = true;
+                            break;
+
+                        case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_INSECURE:
+                            needPort = true;
+                            break;
+
+                        case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_ANY:
+                            needTLSPort = true;
+                            needPort = true;
+                            break;
+                        }
+                        break;
+                    }
+                }
+            }
+
+            if (needPort || graphics->data.spice.port == -1)
+                graphics->data.spice.port = 5901;
+
+            if (needTLSPort || graphics->data.spice.tlsPort == -1)
+                graphics->data.spice.tlsPort = 5902;
+        }
+    }
+
     if (!(cmd = qemuBuildCommandLine(conn, driver, def,
                                      &monConfig, monitor_json, qemuCaps,
                                      NULL, -1, NULL, VIR_NETDEV_VPORT_PROFILE_OP_NO_OP)))
-- 
1.8.2.1




More information about the libvir-list mailing list