This is an automated email from the ASF dual-hosted git repository.

nvazquez pushed a commit to branch 4.16
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.16 by this push:
     new b1c8b5ab37 [KVM] Fix VM migration error due to VNC password on libvirt 
limiting versions (#6404)
b1c8b5ab37 is described below

commit b1c8b5ab370f681fa0a92b3f185cab95bd9daad5
Author: Nicolas Vazquez <[email protected]>
AuthorDate: Mon May 23 08:12:49 2022 -0300

    [KVM] Fix VM migration error due to VNC password on libvirt limiting 
versions (#6404)
    
    * [KVM] Fix VM migration error due to VNC password on libvirt limiting 
versions
    
    * Fix passwd value
    
    * Simplify implementation
---
 .../wrapper/LibvirtMigrateCommandWrapper.java       | 12 ++++++++++--
 .../wrapper/LibvirtMigrateCommandWrapperTest.java   | 21 +++++++++++----------
 2 files changed, 21 insertions(+), 12 deletions(-)

diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java
index ab448df300..ed3b048181 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java
@@ -149,7 +149,11 @@ public final class LibvirtMigrateCommandWrapper extends 
CommandWrapper<MigrateCo
 
             final String target = command.getDestinationIp();
             xmlDesc = dm.getXMLDesc(xmlFlag);
-            xmlDesc = replaceIpForVNCInDescFile(xmlDesc, target);
+
+            // Limit the VNC password in case the length is greater than 8 
characters
+            // Since libvirt version 8 VNC passwords are limited to 8 
characters
+            String vncPassword = 
org.apache.commons.lang3.StringUtils.truncate(to.getVncPassword(), 8);
+            xmlDesc = replaceIpForVNCInDescFileAndNormalizePassword(xmlDesc, 
target, vncPassword);
 
             String oldIsoVolumePath = getOldVolumePath(disks, vmName);
             String newIsoVolumePath = 
getNewVolumePathIfDatastoreHasChanged(libvirtComputingResource, conn, to);
@@ -450,9 +454,10 @@ public final class LibvirtMigrateCommandWrapper extends 
CommandWrapper<MigrateCo
      *     </graphics>
      * @param xmlDesc the qemu xml description
      * @param target the ip address to migrate to
+     * @param vncPassword if set, the VNC password truncated to 8 characters
      * @return the new xmlDesc
      */
-    String replaceIpForVNCInDescFile(String xmlDesc, final String target) {
+    String replaceIpForVNCInDescFileAndNormalizePassword(String xmlDesc, final 
String target, String vncPassword) {
         final int begin = xmlDesc.indexOf(GRAPHICS_ELEM_START);
         if (begin >= 0) {
             final int end = xmlDesc.lastIndexOf(GRAPHICS_ELEM_END) + 
GRAPHICS_ELEM_END.length();
@@ -460,6 +465,9 @@ public final class LibvirtMigrateCommandWrapper extends 
CommandWrapper<MigrateCo
                 String graphElem = xmlDesc.substring(begin, end);
                 graphElem = graphElem.replaceAll("listen='[a-zA-Z0-9\\.]*'", 
"listen='" + target + "'");
                 graphElem = graphElem.replaceAll("address='[a-zA-Z0-9\\.]*'", 
"address='" + target + "'");
+                if 
(org.apache.commons.lang3.StringUtils.isNotBlank(vncPassword)) {
+                    graphElem = graphElem.replaceAll("passwd='([^\\s]+)'", 
"passwd='" + vncPassword + "'");
+                }
                 xmlDesc = xmlDesc.replaceAll(GRAPHICS_ELEM_START + 
CONTENTS_WILDCARD + GRAPHICS_ELEM_END, graphElem);
             }
         }
diff --git 
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapperTest.java
 
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapperTest.java
index b5574bf729..23f0ff9112 100644
--- 
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapperTest.java
+++ 
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapperTest.java
@@ -571,16 +571,16 @@ public class LibvirtMigrateCommandWrapperTest {
     @Test
     public void testReplaceIpForVNCInDescFile() {
         final String targetIp = "192.168.22.21";
-        final String result = 
libvirtMigrateCmdWrapper.replaceIpForVNCInDescFile(fullfile, targetIp);
+        final String result = 
libvirtMigrateCmdWrapper.replaceIpForVNCInDescFileAndNormalizePassword(fullfile,
 targetIp, null);
         assertTrue("transformation does not live up to expectation:\n" + 
result, targetfile.equals(result));
     }
 
     @Test
-    public void testReplaceIpForVNCInDesc() {
+    public void testReplaceIpAndPasswordForVNCInDesc() {
         final String xmlDesc =
                 "<domain type='kvm' id='3'>" +
                 "  <devices>" +
-                "    <graphics type='vnc' port='5900' autoport='yes' 
listen='10.10.10.1'>" +
+                "    <graphics type='vnc' port='5900' autoport='yes' 
listen='10.10.10.1' passwd='123456789012345'>" +
                 "      <listen type='address' address='10.10.10.1'/>" +
                 "    </graphics>" +
                 "  </devices>" +
@@ -588,22 +588,23 @@ public class LibvirtMigrateCommandWrapperTest {
         final String expectedXmlDesc =
                 "<domain type='kvm' id='3'>" +
                 "  <devices>" +
-                "    <graphics type='vnc' port='5900' autoport='yes' 
listen='10.10.10.10'>" +
+                "    <graphics type='vnc' port='5900' autoport='yes' 
listen='10.10.10.10' passwd='12345678'>" +
                 "      <listen type='address' address='10.10.10.10'/>" +
                 "    </graphics>" +
                 "  </devices>" +
                 "</domain>";
         final String targetIp = "10.10.10.10";
-        final String result = 
libvirtMigrateCmdWrapper.replaceIpForVNCInDescFile(xmlDesc, targetIp);
+        final String password = "12345678";
+        final String result = 
libvirtMigrateCmdWrapper.replaceIpForVNCInDescFileAndNormalizePassword(xmlDesc, 
targetIp, password);
         assertTrue("transformation does not live up to expectation:\n" + 
result, expectedXmlDesc.equals(result));
     }
 
     @Test
-    public void testReplaceFqdnForVNCInDesc() {
+    public void testReplaceFqdnAndPasswordForVNCInDesc() {
         final String xmlDesc =
                 "<domain type='kvm' id='3'>" +
                 "  <devices>" +
-                "    <graphics type='vnc' port='5900' autoport='yes' 
listen='localhost.local'>" +
+                "    <graphics type='vnc' port='5900' autoport='yes' 
listen='localhost.local' passwd='123456789012345'>" +
                 "      <listen type='address' address='localhost.local'/>" +
                 "    </graphics>" +
                 "  </devices>" +
@@ -611,13 +612,14 @@ public class LibvirtMigrateCommandWrapperTest {
         final String expectedXmlDesc =
                 "<domain type='kvm' id='3'>" +
                 "  <devices>" +
-                "    <graphics type='vnc' port='5900' autoport='yes' 
listen='localhost.localdomain'>" +
+                "    <graphics type='vnc' port='5900' autoport='yes' 
listen='localhost.localdomain' passwd='12345678'>" +
                 "      <listen type='address' 
address='localhost.localdomain'/>" +
                 "    </graphics>" +
                 "  </devices>" +
                 "</domain>";
         final String targetIp = "localhost.localdomain";
-        final String result = 
libvirtMigrateCmdWrapper.replaceIpForVNCInDescFile(xmlDesc, targetIp);
+        final String password = "12345678";
+        final String result = 
libvirtMigrateCmdWrapper.replaceIpForVNCInDescFileAndNormalizePassword(xmlDesc, 
targetIp, password);
         assertTrue("transformation does not live up to expectation:\n" + 
result, expectedXmlDesc.equals(result));
     }
 
@@ -789,5 +791,4 @@ public class LibvirtMigrateCommandWrapperTest {
         Assert.assertTrue(replaced.contains("csdpdk-7"));
         Assert.assertFalse(replaced.contains("csdpdk-1"));
     }
-
 }

Reply via email to