Skip to content

Commit

Permalink
[KVM] Fix VM migration error due to VNC password on libvirt limiting …
Browse files Browse the repository at this point in the history
…versions (apache#6404)

* [KVM] Fix VM migration error due to VNC password on libvirt limiting versions

* Fix passwd value

* Simplify implementation

(cherry picked from commit b1c8b5a)
Signed-off-by: Rohit Yadav <[email protected]>
  • Loading branch information
nvazquez authored and rohityadavcloud committed May 24, 2022
1 parent 957b64b commit 4b7d229
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,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);
Expand Down Expand Up @@ -420,16 +424,20 @@ protected MigrateDiskInfo searchDiskDefOnMigrateDiskInfoList(List<MigrateDiskInf
* </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();
if (end > begin) {
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);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -571,53 +571,55 @@ 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 =
"<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>" +
"</domain>";
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>" +
"</domain>";
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));
}

Expand Down Expand Up @@ -789,5 +791,4 @@ public void testReplaceDPDKPorts() throws ParserConfigurationException, IOExcept
Assert.assertTrue(replaced.contains("csdpdk-7"));
Assert.assertFalse(replaced.contains("csdpdk-1"));
}

}

0 comments on commit 4b7d229

Please sign in to comment.