You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ha...@apache.org on 2021/09/24 08:29:24 UTC
[cloudstack] branch VMwareExportSnapshotFix created (now e4727f7)
This is an automated email from the ASF dual-hosted git repository.
harikrishna pushed a change to branch VMwareExportSnapshotFix
in repository https://gitbox.apache.org/repos/asf/cloudstack.git.
at e4727f7 Fix export snapshot and export template to secondary storage in VMware to export only one required disk
This branch includes the following new commits:
new e4727f7 Fix export snapshot and export template to secondary storage in VMware to export only one required disk
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
[cloudstack] 01/01: Fix export snapshot and export template to
secondary storage in VMware to export only one required disk
Posted by ha...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
harikrishna pushed a commit to branch VMwareExportSnapshotFix
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit e4727f7fa0bb3e6317579d274f191d29e219442d
Author: Harikrishna Patnala <ha...@gmail.com>
AuthorDate: Fri Sep 24 13:36:17 2021 +0530
Fix export snapshot and export template to secondary storage in VMware to export only one required disk
---
.../storage/resource/VmwareStorageProcessor.java | 22 ++++++++++++++++--
.../hypervisor/vmware/mo/VirtualMachineMO.java | 26 ++++++++++++----------
2 files changed, 34 insertions(+), 14 deletions(-)
diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java
index 7ed4e2f..bd0d613 100644
--- a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java
+++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java
@@ -1241,9 +1241,12 @@ public class VmwareStorageProcessor implements StorageProcessor {
DatacenterMO dcMo = new DatacenterMO(context, hyperHost.getHyperHostDatacenter());
ManagedObjectReference morPool = hyperHost.getHyperHostOwnerResourcePool();
- vmMo.createFullCloneWithSpecificDisk(templateUniqueName, dcMo.getVmFolder(), morPool, VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()), volumeDeviceInfo);
+ VirtualDisk requiredDisk = volumeDeviceInfo.first();
+ vmMo.createFullCloneWithSpecificDisk(templateUniqueName, dcMo.getVmFolder(), morPool, requiredDisk);
clonedVm = dcMo.findVm(templateUniqueName);
+ checkIfVMHasOnlyRequiredDisk(clonedVm, requiredDisk);
+
clonedVm.tagAsWorkerVM();
clonedVm.exportVm(secondaryMountPoint + "/" + installPath, templateUniqueName, false, false);
@@ -1828,13 +1831,15 @@ public class VmwareStorageProcessor implements StorageProcessor {
// 4 MB is the minimum requirement for VM memory in VMware
DatacenterMO dcMo = new DatacenterMO(context, hyperHost.getHyperHostDatacenter());
ManagedObjectReference morPool = hyperHost.getHyperHostOwnerResourcePool();
- vmMo.createFullCloneWithSpecificDisk(exportName, dcMo.getVmFolder(), morPool, VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()), volumeDeviceInfo);
+ VirtualDisk requiredDisk = volumeDeviceInfo.first();
+ vmMo.createFullCloneWithSpecificDisk(exportName, dcMo.getVmFolder(), morPool, requiredDisk);
clonedVm = dcMo.findVm(exportName);
if (clonedVm == null) {
String msg = "Failed to clone VM. volume path: " + volumePath;
s_logger.error(msg);
throw new Exception(msg);
}
+ checkIfVMHasOnlyRequiredDisk(clonedVm, requiredDisk);
clonedVm.tagAsWorkerVM();
vmMo = clonedVm;
}
@@ -1849,6 +1854,19 @@ public class VmwareStorageProcessor implements StorageProcessor {
}
}
+ private void checkIfVMHasOnlyRequiredDisk(VirtualMachineMO clonedVm, VirtualDisk requiredDisk) throws Exception {
+
+ s_logger.info(String.format("Checking if Cloned VM %s is created only with required Disk, if not detach the remaining disks", clonedVm.getName()));
+ VirtualDisk[] vmDisks = clonedVm.getAllDiskDevice();
+ if (vmDisks.length != 1) {
+ String baseName = VmwareHelper.getDiskDeviceFileName(requiredDisk);
+ s_logger.info(String.format("Detaching all disks for the cloned VM: %s except disk with base name: %s, key=%d", clonedVm.getName(), baseName, requiredDisk.getKey()));
+ clonedVm.detachAllDisksExcept(VmwareHelper.getDiskDeviceFileName(requiredDisk), null);
+ } else {
+ s_logger.info(String.format("Cloned VM %s is created only with required Disk", clonedVm.getName()));
+ }
+ }
+
// Ternary<String(backup uuid in secondary storage), String(device bus name), String[](original disk chain in the snapshot)>
private Ternary<String, String, String[]> backupSnapshotToSecondaryStorage(VmwareContext context, VirtualMachineMO vmMo, VmwareHypervisorHost hypervisorHost, String installPath, String volumePath, String snapshotUuid,
String secStorageUrl, String prevSnapshotUuid, String prevBackupUuid, String workerVmName,
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 2384935..93df0dc 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
@@ -751,30 +751,32 @@ public class VirtualMachineMO extends BaseMO {
return false;
}
- public boolean createFullCloneWithSpecificDisk(String cloneName, ManagedObjectReference morFolder, ManagedObjectReference morResourcePool, ManagedObjectReference morDs, Pair<VirtualDisk, String> volumeDeviceInfo)
+ public boolean createFullCloneWithSpecificDisk(String cloneName, ManagedObjectReference morFolder, ManagedObjectReference morResourcePool, VirtualDisk requiredDisk)
throws Exception {
assert (morFolder != null);
assert (morResourcePool != null);
- assert (morDs != null);
- VirtualDisk requiredDisk = volumeDeviceInfo.first();
VirtualMachineRelocateSpec rSpec = new VirtualMachineRelocateSpec();
- List<VirtualMachineRelocateSpecDiskLocator> diskLocator = new ArrayList<VirtualMachineRelocateSpecDiskLocator>(1);
- VirtualMachineRelocateSpecDiskLocator loc = new VirtualMachineRelocateSpecDiskLocator();
- loc.setDatastore(morDs);
- loc.setDiskId(requiredDisk.getKey());
- loc.setDiskMoveType(VirtualMachineRelocateDiskMoveOptions.MOVE_ALL_DISK_BACKINGS_AND_DISALLOW_SHARING.value());
- diskLocator.add(loc);
-
- rSpec.setDiskMoveType(VirtualMachineRelocateDiskMoveOptions.MOVE_ALL_DISK_BACKINGS_AND_DISALLOW_SHARING.value());
- rSpec.getDisk().addAll(diskLocator);
+
+ VirtualDisk[] vmDisks = getAllDiskDevice();
+ VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec();
+ for (VirtualDisk disk : vmDisks) {
+ if (requiredDisk.getKey() != disk.getKey()) {
+ VirtualDeviceConfigSpec virtualDeviceConfigSpec = new VirtualDeviceConfigSpec();
+ virtualDeviceConfigSpec.setDevice(disk);
+ virtualDeviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.REMOVE);
+ vmConfigSpec.getDeviceChange().add(virtualDeviceConfigSpec);
+ }
+ }
rSpec.setPool(morResourcePool);
VirtualMachineCloneSpec cloneSpec = new VirtualMachineCloneSpec();
cloneSpec.setPowerOn(false);
cloneSpec.setTemplate(false);
cloneSpec.setLocation(rSpec);
+ cloneSpec.setMemory(false);
+ cloneSpec.setConfig(vmConfigSpec);
ManagedObjectReference morTask = _context.getService().cloneVMTask(_mor, morFolder, cloneName, cloneSpec);