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 1ad1802e9499..5a99a5ee903c 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 @@ Use VIR_DOMAIN_XML_SECURE (value = 1) prior to v1.0.0. 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 @@ protected MigrateDiskInfo searchDiskDefOnMigrateDiskInfoList(List * @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 @@ String replaceIpForVNCInDescFile(String xmlDesc, final String target) { 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 b5574bf7297f..23f0ff911283 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 void setup() throws Exception { @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 = "" + " " + - " " + + " " + " " + " " + " " + @@ -588,22 +588,23 @@ public void testReplaceIpForVNCInDesc() { final String expectedXmlDesc = "" + " " + - " " + + " " + " " + " " + " " + ""; 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 = "" + " " + - " " + + " " + " " + " " + " " + @@ -611,13 +612,14 @@ public void testReplaceFqdnForVNCInDesc() { final String expectedXmlDesc = "" + " " + - " " + + " " + " " + " " + " " + ""; 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 void testReplaceDPDKPorts() throws ParserConfigurationException, IOExcept Assert.assertTrue(replaced.contains("csdpdk-7")); Assert.assertFalse(replaced.contains("csdpdk-1")); } - }