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