mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Use clonevm task while creating template from volume
Old way is by taking snapshot of entire VM and then clone from that snapshot with the required disk
This commit is contained in:
parent
4178a7cd90
commit
c8a28f34ee
@ -1131,6 +1131,14 @@ public class VmwareStorageProcessor implements StorageProcessor {
|
||||
throw new Exception(msg);
|
||||
}
|
||||
|
||||
VmwareContext context = hostService.getServiceContext(null);
|
||||
VmwareHypervisorHost hyperHost = hostService.getHyperHost(context, null);
|
||||
DatacenterMO dcMo = new DatacenterMO(context, hyperHost.getHyperHostDatacenter());
|
||||
ManagedObjectReference morPool = hyperHost.getHyperHostOwnerResourcePool();
|
||||
vmMo.createFullCloneWithSpecificDisk(templateUniqueName, dcMo.getVmFolder(), morPool, VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()), volumeDeviceInfo);
|
||||
clonedVm = dcMo.findVm(templateUniqueName);
|
||||
|
||||
/* FR41 THIS IS OLD way of creating template using snapshot
|
||||
if (!vmMo.createSnapshot(templateUniqueName, "Temporary snapshot for template creation", false, false)) {
|
||||
String msg = "Unable to take snapshot for creating template from volume. volume path: " + volumePath;
|
||||
s_logger.error(msg);
|
||||
@ -1143,7 +1151,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
|
||||
Pair<VirtualMachineMO, String[]> cloneResult =
|
||||
vmMo.cloneFromCurrentSnapshot(workerVmName, 0, 4, volumeDeviceInfo.second(), VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()), hardwareVersion);
|
||||
clonedVm = cloneResult.first();
|
||||
|
||||
* */
|
||||
clonedVm.exportVm(secondaryMountPoint + "/" + installPath, templateUniqueName, false, false);
|
||||
|
||||
// Get VMDK filename
|
||||
|
||||
@ -729,6 +729,44 @@ public class VirtualMachineMO extends BaseMO {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean createFullCloneWithSpecificDisk(String cloneName, ManagedObjectReference morFolder, ManagedObjectReference morResourcePool, ManagedObjectReference morDs, Pair<VirtualDisk, String> volumeDeviceInfo)
|
||||
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);
|
||||
rSpec.setPool(morResourcePool);
|
||||
|
||||
VirtualMachineCloneSpec cloneSpec = new VirtualMachineCloneSpec();
|
||||
cloneSpec.setPowerOn(false);
|
||||
cloneSpec.setTemplate(false);
|
||||
cloneSpec.setLocation(rSpec);
|
||||
|
||||
ManagedObjectReference morTask = _context.getService().cloneVMTask(_mor, morFolder, cloneName, cloneSpec);
|
||||
|
||||
boolean result = _context.getVimClient().waitForTask(morTask);
|
||||
if (result) {
|
||||
_context.waitForTaskProgressDone(morTask);
|
||||
return true;
|
||||
} else {
|
||||
s_logger.error("VMware cloneVM_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean createFullClone(String cloneName, ManagedObjectReference morFolder, ManagedObjectReference morResourcePool, ManagedObjectReference morDs)
|
||||
throws Exception {
|
||||
|
||||
|
||||
@ -25,6 +25,7 @@ import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.GregorianCalendar;
|
||||
import java.util.List;
|
||||
@ -249,10 +250,7 @@ public class VmwareHelper {
|
||||
|
||||
backingInfo.setFileName(vmdkDatastorePathChain[0]);
|
||||
if (vmdkDatastorePathChain.length > 1) {
|
||||
String[] parentDisks = new String[vmdkDatastorePathChain.length - 1];
|
||||
for (int i = 0; i < vmdkDatastorePathChain.length - 1; i++)
|
||||
parentDisks[i] = vmdkDatastorePathChain[i + 1];
|
||||
|
||||
String[] parentDisks = Arrays.copyOfRange(vmdkDatastorePathChain, 1, vmdkDatastorePathChain.length);
|
||||
setParentBackingInfo(backingInfo, morDs, parentDisks);
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user