From fc102c8d288acee2e4b8d496fea092fa53a9ce88 Mon Sep 17 00:00:00 2001 From: JS Choi <77760789+jschoiRR@users.noreply.github.com> Date: Mon, 29 Sep 2025 11:40:41 +0900 Subject: [PATCH 1/2] =?UTF-8?q?vmware=20=EA=B0=80=EC=83=81=EB=A8=B8?= =?UTF-8?q?=EC=8B=A0=20=EA=B0=80=EC=A0=B8=EC=98=A4=EA=B8=B0=EC=8B=9C=20vm?= =?UTF-8?q?=20=EC=83=81=EB=8B=A8=20=ED=8F=B4=EB=8D=94=EB=AA=85=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cloud/agent/api/to/RemoteInstanceTO.java | 8 ++++++- .../cloudstack/vm/UnmanagedInstanceTO.java | 10 +++++++++ .../vm/UnmanagedVMsManagerImpl.java | 2 +- .../vmware/mo/VirtualMachineMO.java | 21 +++++++++++++++++++ .../hypervisor/vmware/util/VmwareHelper.java | 1 + 5 files changed, 40 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 d86eb2a3a7f7..18737c584b34 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 RemoteInstanceTO(String instanceName) { 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 String getInstanceName() { 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 0802098cb4fc..3d5646f68c9d 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 enum PowerState { private String internalCSName; + private String path; + private PowerState powerState; private PowerState cloneSourcePowerState; @@ -75,6 +77,14 @@ public void setInternalCSName(String internalCSName) { this.internalCSName = internalCSName; } + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + public PowerState getPowerState() { return powerState; } 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 b71041835861..006172b1b9e1 100644 --- a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java @@ -1982,7 +1982,7 @@ private UnmanagedInstanceTO convertVmwareInstanceToKVMAfterExportingOVFToConvert 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 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 db270ed30c2a..2b9950ea77b1 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 @@ -996,6 +996,27 @@ public VirtualMachineFileLayoutEx getFileLayout() throws Exception { return fileLayout; } + public String getPath() throws Exception { + List 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 (ManagedObjectReference)_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 178c3a1b34cf..a32aaeda6895 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 @@ -802,6 +802,7 @@ public static UnmanagedInstanceTO getUnmanagedInstance(VmwareHypervisorHost hype 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(); From 360f5a94458970466567ca54345e037153157440 Mon Sep 17 00:00:00 2001 From: JS Choi <77760789+jschoiRR@users.noreply.github.com> Date: Mon, 29 Sep 2025 11:42:46 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=EB=88=84=EB=9D=BD=20=EB=B6=80=EB=B6=84=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wrapper/LibvirtConvertInstanceCommandWrapper.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 559932370ecf..87223fd824d6 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 @@ -171,9 +171,15 @@ private String getExportOVAUrlFromRemoteInstance(RemoteInstanceTO vmwareInstance 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)) { + 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); }