[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 (cherry picked from commit b1c8b5ab370f681fa0a92b3f185cab95bd9daad5) Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>
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 60261a4..a3e5f11 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
@@ -145,7 +145,11 @@ 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); @@ -420,9 +424,10 @@ * </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(); @@ -430,6 +435,9 @@ 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 b5574bf..23f0ff9 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 @@ @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 @@ 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 @@ 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 @@ Assert.assertTrue(replaced.contains("csdpdk-7")); Assert.assertFalse(replaced.contains("csdpdk-1")); } - }