sureshanaparti commented on code in PR #12970:
URL: https://github.com/apache/cloudstack/pull/12970#discussion_r3049230432
##########
plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtConvertInstanceCommandWrapper.java:
##########
@@ -275,4 +299,194 @@ protected void addExtraParamsToScript(String extraParams,
Script script) {
protected String encodeUsername(String username) {
return URLEncoder.encode(username, Charset.defaultCharset());
}
+
+ private String resolveVddkSetting(String commandValue, String agentValue) {
+ return
StringUtils.defaultIfBlank(StringUtils.trimToNull(commandValue),
StringUtils.trimToNull(agentValue));
+ }
+
+ protected boolean performInstanceConversionVddk(RemoteInstanceTO
vmwareInstance, String originalVMName,
+ String
temporaryConvertFolder, String vddkLibDir,
+ String libguestfsBackend,
String vddkTransports,
+ String
configuredVddkThumbprint,
+ long timeout, boolean
verboseModeEnabled, String extraParams,
+ String
temporaryConvertUuid, String passwordOption) {
+
+ String vcenterPassword = vmwareInstance.getVcenterPassword();
+ if (StringUtils.isBlank(vcenterPassword)) {
+ logger.error("({}) Could not determine vCenter password for {}",
originalVMName, vmwareInstance.getVcenterHost());
+ return false;
+ }
+
+ String passwordFilePath = String.format("/root/v2v.pass.cloud.%s",
+ StringUtils.defaultIfBlank(vmwareInstance.getVcenterHost(),
"unknown"));
+ try {
+ Files.writeString(Path.of(passwordFilePath), vcenterPassword);
+ logger.debug("({}) Written vCenter password to {}",
originalVMName, passwordFilePath);
+ } catch (Exception e) {
+ logger.error("({}) Failed to write vCenter password file {}: {}",
originalVMName, passwordFilePath, e.getMessage());
+ return false;
+ }
+
+ String vpxUrl = buildVpxUrl(vmwareInstance, originalVMName);
+
+ StringBuilder cmd = new StringBuilder();
+
+ String effectiveLibguestfsBackend =
StringUtils.defaultIfBlank(libguestfsBackend, "direct");
+ cmd.append("export
LIBGUESTFS_BACKEND=").append(effectiveLibguestfsBackend).append(" && ");
+
+ cmd.append("virt-v2v ");
+ cmd.append("--root first ");
+ cmd.append("-ic '").append(vpxUrl).append("' ");
+ if (StringUtils.isBlank(passwordOption)) {
+ logger.error("({}) Could not determine supported password file
option for virt-v2v", originalVMName);
+ return false;
+ }
+
+ cmd.append(passwordOption).append("
").append(passwordFilePath).append(" ");
+ cmd.append("-it vddk ");
+ cmd.append("-io vddk-libdir=").append(vddkLibDir).append(" ");
+ String vddkThumbprint =
StringUtils.trimToNull(configuredVddkThumbprint);
+ if (StringUtils.isBlank(vddkThumbprint)) {
+ vddkThumbprint =
getVcenterThumbprint(vmwareInstance.getVcenterHost(), timeout, originalVMName);
+ }
+ if (StringUtils.isBlank(vddkThumbprint)) {
+ logger.error("({}) Could not determine vCenter thumbprint for {}",
originalVMName, vmwareInstance.getVcenterHost());
+ return false;
+ }
+ cmd.append("-io vddk-thumbprint=").append(vddkThumbprint).append(" ");
+ if (StringUtils.isNotBlank(vddkTransports)) {
+ cmd.append("-io vddk-transports=").append(vddkTransports).append("
");
+ }
+ cmd.append(originalVMName).append(" ");
+ cmd.append("-o local ");
+ cmd.append("-os ").append(temporaryConvertFolder).append(" ");
+ cmd.append("-of qcow2 ");
+ cmd.append("-on ").append(temporaryConvertUuid).append(" ");
+
+ if (verboseModeEnabled) {
+ cmd.append("-v ");
+ }
+
+ if (StringUtils.isNotBlank(extraParams)) {
+ cmd.append(extraParams).append(" ");
+ }
+
+ Script script = new Script("/bin/bash", timeout, logger);
+ script.add("-c");
+ script.add(cmd.toString());
+
+ String logPrefix = String.format("(%s) virt-v2v vddk import",
originalVMName);
+ OutputInterpreter.LineByLineOutputLogger outputLogger =
+ new OutputInterpreter.LineByLineOutputLogger(logger,
logPrefix);
+
+ logger.info("({}) Starting virt-v2v VDDK conversion", originalVMName);
+ script.execute(outputLogger);
+
+ int exitValue = script.getExitValue();
+ if (exitValue != 0) {
+ logger.error("({}) virt-v2v failed with exit code {}",
originalVMName, exitValue);
+ }
+ try {
+ Files.deleteIfExists(Path.of(passwordFilePath));
+ logger.debug("({}) Deleted password file {}", originalVMName,
passwordFilePath);
+ } catch (Exception e) {
+ logger.warn("({}) Failed to delete password file {}: {}",
originalVMName, passwordFilePath, e.getMessage());
+ }
+
+ return exitValue == 0;
+ }
+
+
Review Comment:
```suggestion
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]