mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
[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
This commit is contained in:
parent
dc975dff95
commit
b1c8b5ab37
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user