This is an automated email from the ASF dual-hosted git repository.
dahn pushed a commit to branch 4.19
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.19 by this push:
new b9ebc7b721b VMware Import - Support external VMs in any
folders/subfolders other than the root folder ('vm') of datacenter (#10411)
b9ebc7b721b is described below
commit b9ebc7b721b9dc187c38e3c97a3d43a12de09e12
Author: Suresh Kumar Anaparti <[email protected]>
AuthorDate: Tue Feb 18 13:53:25 2025 +0530
VMware Import - Support external VMs in any folders/subfolders other than
the root folder ('vm') of datacenter (#10411)
---
.../com/cloud/agent/api/to/RemoteInstanceTO.java | 8 +++++++-
.../apache/cloudstack/vm/UnmanagedInstanceTO.java | 10 ++++++++++
.../LibvirtConvertInstanceCommandWrapper.java | 7 +++++++
.../cloudstack/vm/UnmanagedVMsManagerImpl.java | 2 +-
.../hypervisor/vmware/mo/VirtualMachineMO.java | 21 +++++++++++++++++++++
.../cloud/hypervisor/vmware/util/VmwareHelper.java | 1 +
6 files changed, 47 insertions(+), 2 deletions(-)
diff --git a/api/src/main/java/com/cloud/agent/api/to/RemoteInstanceTO.java
b/api/src/main/java/com/cloud/agent/api/to/RemoteInstanceTO.java
index d86eb2a3a7f..18737c584b3 100644
--- a/api/src/main/java/com/cloud/agent/api/to/RemoteInstanceTO.java
+++ b/api/src/main/java/com/cloud/agent/api/to/RemoteInstanceTO.java
@@ -27,6 +27,7 @@ public class RemoteInstanceTO implements Serializable {
private Hypervisor.HypervisorType hypervisorType;
private String instanceName;
+ private String instancePath;
// VMware Remote Instances parameters (required for exporting OVA through
ovftool)
// TODO: cloud.agent.transport.Request#getCommands() cannot handle gsoc
decode for polymorphic classes
@@ -44,9 +45,10 @@ public class RemoteInstanceTO implements Serializable {
this.instanceName = instanceName;
}
- public RemoteInstanceTO(String instanceName, String vcenterHost, String
vcenterUsername, String vcenterPassword, String datacenterName) {
+ public RemoteInstanceTO(String instanceName, String instancePath, String
vcenterHost, String vcenterUsername, String vcenterPassword, String
datacenterName) {
this.hypervisorType = Hypervisor.HypervisorType.VMware;
this.instanceName = instanceName;
+ this.instancePath = instancePath;
this.vcenterHost = vcenterHost;
this.vcenterUsername = vcenterUsername;
this.vcenterPassword = vcenterPassword;
@@ -61,6 +63,10 @@ public class RemoteInstanceTO implements Serializable {
return this.instanceName;
}
+ public String getInstancePath() {
+ return this.instancePath;
+ }
+
public String getVcenterUsername() {
return vcenterUsername;
}
diff --git
a/api/src/main/java/org/apache/cloudstack/vm/UnmanagedInstanceTO.java
b/api/src/main/java/org/apache/cloudstack/vm/UnmanagedInstanceTO.java
index 5697a040b81..6f632853527 100644
--- a/api/src/main/java/org/apache/cloudstack/vm/UnmanagedInstanceTO.java
+++ b/api/src/main/java/org/apache/cloudstack/vm/UnmanagedInstanceTO.java
@@ -33,6 +33,8 @@ public class UnmanagedInstanceTO {
private String internalCSName;
+ private String path;
+
private PowerState powerState;
private PowerState cloneSourcePowerState;
@@ -75,6 +77,14 @@ public class UnmanagedInstanceTO {
this.internalCSName = internalCSName;
}
+ public String getPath() {
+ return path;
+ }
+
+ public void setPath(String path) {
+ this.path = path;
+ }
+
public PowerState getPowerState() {
return powerState;
}
diff --git
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtConvertInstanceCommandWrapper.java
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtConvertInstanceCommandWrapper.java
index e6654b1ffc5..504edb9d888 100644
---
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtConvertInstanceCommandWrapper.java
+++
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtConvertInstanceCommandWrapper.java
@@ -57,6 +57,7 @@ public class LibvirtConvertInstanceCommandWrapper extends
CommandWrapper<Convert
RemoteInstanceTO sourceInstance = cmd.getSourceInstance();
Hypervisor.HypervisorType sourceHypervisorType =
sourceInstance.getHypervisorType();
String sourceInstanceName = sourceInstance.getInstanceName();
+ String sourceInstancePath = sourceInstance.getInstancePath();
Hypervisor.HypervisorType destinationHypervisorType =
cmd.getDestinationHypervisorType();
DataStoreTO conversionTemporaryLocation =
cmd.getConversionTemporaryLocation();
long timeout = (long) cmd.getWait() * 1000;
@@ -177,9 +178,15 @@ public class LibvirtConvertInstanceCommandWrapper extends
CommandWrapper<Convert
String password = vmwareInstance.getVcenterPassword();
String datacenter = vmwareInstance.getDatacenterName();
String vm = vmwareInstance.getInstanceName();
+ String path = vmwareInstance.getInstancePath();
String encodedUsername = encodeUsername(username);
String encodedPassword = encodeUsername(password);
+ if (StringUtils.isNotBlank(path)) {
+ s_logger.info("VM path: " + path);
+ return String.format("vi://%s:%s@%s/%s/%s/%s",
+ encodedUsername, encodedPassword, vcenter, datacenter,
path, vm);
+ }
return String.format("vi://%s:%s@%s/%s/vm/%s",
encodedUsername, encodedPassword, vcenter, datacenter, vm);
}
diff --git
a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java
b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java
index f70a26f33c7..abb0e6b63c5 100644
--- a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java
+++ b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java
@@ -1947,7 +1947,7 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
LOGGER.debug(String.format("Delegating the conversion of instance %s
from VMware to KVM to the host %s (%s) after OVF export through ovftool",
sourceVM, convertHost.getId(), convertHost.getName()));
- RemoteInstanceTO remoteInstanceTO = new
RemoteInstanceTO(sourceVMwareInstance.getName(), vcenterHost, vcenterUsername,
vcenterPassword, datacenterName);
+ RemoteInstanceTO remoteInstanceTO = new
RemoteInstanceTO(sourceVMwareInstance.getName(),
sourceVMwareInstance.getPath(), vcenterHost, vcenterUsername, vcenterPassword,
datacenterName);
List<String> destinationStoragePools =
selectInstanceConversionStoragePools(convertStoragePools,
sourceVMwareInstance.getDisks(), serviceOffering, dataDiskOfferingMap);
ConvertInstanceCommand cmd = new
ConvertInstanceCommand(remoteInstanceTO,
Hypervisor.HypervisorType.KVM, temporaryConvertLocation, null,
false, true);
diff --git
a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
index 20c62c30c0b..1e824f34fbb 100644
---
a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
+++
b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
@@ -891,6 +891,27 @@ public class VirtualMachineMO extends BaseMO {
return fileLayout;
}
+ public String getPath() throws Exception {
+ List<String> subPaths = new ArrayList<>();
+ ManagedObjectReference mor =
_context.getVimClient().getDynamicProperty(_mor, "parent");
+ while (mor != null && mor.getType().equalsIgnoreCase("Folder")) {
+ String subPath = _context.getVimClient().getDynamicProperty(mor,
"name");
+ if (StringUtils.isBlank(subPath)) {
+ return null;
+ }
+ subPaths.add(subPath);
+ mor = _context.getVimClient().getDynamicProperty(mor, "parent");
+ }
+
+ if (!subPaths.isEmpty()) {
+ Collections.reverse(subPaths);
+ String path = StringUtils.join(subPaths, "/");
+ return path;
+ }
+
+ return null;
+ }
+
@Override
public ManagedObjectReference getParentMor() throws Exception {
return _context.getVimClient().getDynamicProperty(_mor, "parent");
diff --git
a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareHelper.java
b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareHelper.java
index 96b176df5f6..b273688c162 100644
---
a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareHelper.java
+++
b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareHelper.java
@@ -801,6 +801,7 @@ public class VmwareHelper {
instance = new UnmanagedInstanceTO();
instance.setName(vmMo.getVmName());
instance.setInternalCSName(vmMo.getInternalCSName());
+ instance.setPath((vmMo.getPath()));
instance.setCpuCoresPerSocket(vmMo.getCoresPerSocket());
instance.setOperatingSystemId(vmMo.getVmGuestInfo().getGuestId());
VirtualMachineConfigSummary configSummary =
vmMo.getConfigSummary();