Skip to content

Commit 6fc44dc

Browse files
Update full clone flag when restoring vm using root disk offering with more size than the template size
1 parent 828614b commit 6fc44dc

File tree

3 files changed

+35
-29
lines changed

3 files changed

+35
-29
lines changed

Diff for: plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java

+20-18
Original file line numberDiff line numberDiff line change
@@ -2041,7 +2041,6 @@ protected StartAnswer execute(StartCommand cmd) {
20412041
VirtualMachineDefinedProfileSpec diskProfileSpec = null;
20422042
VirtualMachineDefinedProfileSpec vmProfileSpec = null;
20432043

2044-
20452044
DeployAsIsInfoTO deployAsIsInfo = vmSpec.getDeployAsIsInfo();
20462045
boolean deployAsIs = deployAsIsInfo != null;
20472046

@@ -2085,7 +2084,6 @@ protected StartAnswer execute(StartCommand cmd) {
20852084
}
20862085

20872086
VirtualMachineDiskInfoBuilder diskInfoBuilder = null;
2088-
VirtualDevice[] nicDevices = null;
20892087
VirtualMachineMO vmMo = hyperHost.findVmOnHyperHost(vmInternalCSName);
20902088
DiskControllerType systemVmScsiControllerType = DiskControllerType.lsilogic;
20912089
int firstScsiControllerBusNum = 0;
@@ -2102,7 +2100,6 @@ protected StartAnswer execute(StartCommand cmd) {
21022100
diskDatastores = vmMo.getAllDiskDatastores();
21032101
diskInfoBuilder = vmMo.getDiskInfoBuilder();
21042102
hasSnapshot = vmMo.hasSnapshot();
2105-
nicDevices = vmMo.getNicDevices();
21062103

21072104
tearDownVmDevices(vmMo, hasSnapshot, deployAsIs);
21082105
ensureDiskControllersInternal(vmMo, systemVm, controllerInfo, systemVmScsiControllerType,
@@ -2118,17 +2115,20 @@ protected StartAnswer execute(StartCommand cmd) {
21182115
}
21192116

21202117
takeVmFromOtherHyperHost(hyperHost, vmInternalCSName);
2118+
vmMo = hyperHost.findVmOnHyperHost(vmInternalCSName);
21212119

2122-
if (getVmPowerState(vmMo) != PowerState.PowerOff)
2123-
vmMo.safePowerOff(_shutdownWaitMs);
2120+
if (vmMo != null) {
2121+
if (getVmPowerState(vmMo) != PowerState.PowerOff)
2122+
vmMo.safePowerOff(_shutdownWaitMs);
21242123

2125-
diskInfoBuilder = vmMo.getDiskInfoBuilder();
2126-
hasSnapshot = vmMo.hasSnapshot();
2127-
diskDatastores = vmMo.getAllDiskDatastores();
2124+
diskInfoBuilder = vmMo.getDiskInfoBuilder();
2125+
hasSnapshot = vmMo.hasSnapshot();
2126+
diskDatastores = vmMo.getAllDiskDatastores();
21282127

2129-
tearDownVmDevices(vmMo, hasSnapshot, deployAsIs);
2130-
ensureDiskControllersInternal(vmMo, systemVm, controllerInfo, systemVmScsiControllerType,
2131-
numScsiControllerForSystemVm, firstScsiControllerBusNum, deployAsIs);
2128+
tearDownVmDevices(vmMo, hasSnapshot, deployAsIs);
2129+
ensureDiskControllersInternal(vmMo, systemVm, controllerInfo, systemVmScsiControllerType,
2130+
numScsiControllerForSystemVm, firstScsiControllerBusNum, deployAsIs);
2131+
}
21322132
} else {
21332133
// If a VM with the same name is found in a different cluster in the DC, unregister the old VM and configure a new VM (cold-migration).
21342134
VirtualMachineMO existingVmInDc = dcMo.findVm(vmInternalCSName);
@@ -2145,7 +2145,7 @@ protected StartAnswer execute(StartCommand cmd) {
21452145
vmMo = hyperHost.findVmOnHyperHost(vmInternalCSName);
21462146
if (vmMo == null) {
21472147
logger.info("Cloned deploy-as-is VM " + vmInternalCSName + " is not in this host, relocating it");
2148-
vmMo = takeVmFromOtherHyperHost(hyperHost, vmInternalCSName);
2148+
takeVmFromOtherHyperHost(hyperHost, vmInternalCSName);
21492149
}
21502150
} else {
21512151
DiskTO rootDisk = null;
@@ -2255,11 +2255,11 @@ protected StartAnswer execute(StartCommand cmd) {
22552255
vmConfigSpec.setCpuHotAddEnabled(vmMo.isCpuHotAddSupported(guestOsId) && vmSpec.isEnableDynamicallyScaleVm());
22562256
}
22572257

2258-
if(!vmMo.isMemoryHotAddSupported(guestOsId) && vmSpec.isEnableDynamicallyScaleVm()){
2258+
if (!vmMo.isMemoryHotAddSupported(guestOsId) && vmSpec.isEnableDynamicallyScaleVm()) {
22592259
logger.warn("hotadd of memory is not supported, dynamic scaling feature can not be applied to vm: " + vmInternalCSName);
22602260
}
22612261

2262-
if(!vmMo.isCpuHotAddSupported(guestOsId) && vmSpec.isEnableDynamicallyScaleVm()){
2262+
if (!vmMo.isCpuHotAddSupported(guestOsId) && vmSpec.isEnableDynamicallyScaleVm()) {
22632263
logger.warn("hotadd of cpu is not supported, dynamic scaling feature can not be applied to vm: " + vmInternalCSName);
22642264
}
22652265

@@ -2709,9 +2709,11 @@ protected StartAnswer execute(StartCommand cmd) {
27092709
}
27102710

27112711
private boolean powerOnVM(final VirtualMachineMO vmMo, final String vmInternalCSName, final String vmNameOnVcenter) throws Exception {
2712-
int retry = 20;
2713-
while (retry-- > 0) {
2712+
final int retry = 20;
2713+
int retryAttempt = 0;
2714+
while (++retryAttempt <= retry) {
27142715
try {
2716+
logger.debug(String.format("VM %s, powerOn attempt #%d", vmInternalCSName, retryAttempt));
27152717
return vmMo.powerOn();
27162718
} catch (Exception e) {
27172719
logger.info(String.format("Got exception while power on VM %s with hostname %s", vmInternalCSName, vmNameOnVcenter), e);
@@ -3227,7 +3229,7 @@ private void tearDownVm(VirtualMachineMO vmMo) throws Exception {
32273229

32283230
int getReservedMemoryMb(VirtualMachineTO vmSpec) {
32293231
if (vmSpec.getDetails().get(VMwareGuru.VmwareReserveMemory.key()).equalsIgnoreCase("true")) {
3230-
if(vmSpec.getDetails().get(VmDetailConstants.RAM_RESERVATION) != null){
3232+
if (vmSpec.getDetails().get(VmDetailConstants.RAM_RESERVATION) != null) {
32313233
float reservedMemory = (vmSpec.getMaxRam() * Float.parseFloat(vmSpec.getDetails().get(VmDetailConstants.RAM_RESERVATION)));
32323234
return (int) (reservedMemory / ResourceType.bytesToMiB);
32333235
}
@@ -4856,7 +4858,7 @@ private Answer migrateVolume(MigrateVolumeCommand cmd) {
48564858
VmwareHypervisorHost dsHost = hyperHostInTargetCluster == null ? hyperHost : hyperHostInTargetCluster;
48574859
String targetDsName = cmd.getTargetPool().getUuid();
48584860
morDestinationDS = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(dsHost, targetDsName);
4859-
if(morDestinationDS == null) {
4861+
if (morDestinationDS == null) {
48604862
String msg = "Unable to find the target datastore: " + targetDsName + " on host: " + dsHost.getHyperHostName();
48614863
logger.error(msg);
48624864
throw new CloudRuntimeException(msg);

Diff for: plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java

+14-10
Original file line numberDiff line numberDiff line change
@@ -814,7 +814,7 @@ public Answer cloneVolumeFromBaseTemplate(CopyCommand cmd) {
814814
existingVm.detachAllDisksAndDestroy();
815815
}
816816
logger.info("ROOT Volume from deploy-as-is template, cloning template");
817-
cloneVMFromTemplate(hyperHost, template.getPath(), vmName, primaryStore.getUuid());
817+
cloneVMFromTemplate(hyperHost, template, volume, vmName, primaryStore.getUuid());
818818
} else {
819819
logger.info("ROOT Volume from deploy-as-is template, volume already created at this point");
820820
}
@@ -1222,10 +1222,10 @@ private Ternary<String, Long, Long> createTemplateFromVolume(VmwareContext conte
12221222
// Get VMDK filename
12231223
String templateVMDKName = "";
12241224
File[] files = new File(installFullPath).listFiles();
1225-
if(files != null) {
1225+
if (files != null) {
12261226
for(File file : files) {
12271227
String fileName = file.getName();
1228-
if(fileName.toLowerCase().startsWith(templateUniqueName) && fileName.toLowerCase().endsWith(".vmdk")) {
1228+
if (fileName.toLowerCase().startsWith(templateUniqueName) && fileName.toLowerCase().endsWith(".vmdk")) {
12291229
templateVMDKName += fileName;
12301230
break;
12311231
}
@@ -1856,16 +1856,16 @@ public Answer backupSnapshot(CopyCommand cmd) {
18561856
CopyCmdAnswer answer = null;
18571857

18581858
try {
1859-
if(vmName != null) {
1859+
if (vmName != null) {
18601860
vmMo = hyperHost.findVmOnHyperHost(vmName);
18611861
if (vmMo == null) {
1862-
if(logger.isDebugEnabled()) {
1862+
if (logger.isDebugEnabled()) {
18631863
logger.debug("Unable to find owner VM for BackupSnapshotCommand on host " + hyperHost.getHyperHostName() + ", will try within datacenter");
18641864
}
18651865
vmMo = hyperHost.findVmOnPeerHyperHost(vmName);
18661866
}
18671867
}
1868-
if(vmMo == null) {
1868+
if (vmMo == null) {
18691869
dsMo = new DatastoreMO(hyperHost.getContext(), morDs);
18701870
workerVMName = hostService.getWorkerName(context, cmd, 0, dsMo);
18711871
vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, workerVMName, null);
@@ -1899,10 +1899,10 @@ public Answer backupSnapshot(CopyCommand cmd) {
18991899
String secondaryMountPoint = mountService.getMountPoint(secondaryStorageUrl, _nfsVersion);
19001900
String snapshotDir = destSnapshot.getPath() + "/" + snapshotBackupUuid;
19011901
File[] files = new File(secondaryMountPoint + "/" + snapshotDir).listFiles();
1902-
if(files != null) {
1902+
if (files != null) {
19031903
for(File file : files) {
19041904
String fileName = file.getName();
1905-
if(fileName.toLowerCase().startsWith(snapshotBackupUuid) && fileName.toLowerCase().endsWith(".vmdk")) {
1905+
if (fileName.toLowerCase().startsWith(snapshotBackupUuid) && fileName.toLowerCase().endsWith(".vmdk")) {
19061906
physicalSize = new File(secondaryMountPoint + "/" + snapshotDir + "/" + fileName).length();
19071907
break;
19081908
}
@@ -3651,7 +3651,7 @@ private Long restoreVolumeFromSecStorage(VmwareHypervisorHost hyperHost, Datasto
36513651
}
36523652
workerVm.tagAsWorkerVM();
36533653

3654-
if(!primaryDsMo.getDatastoreType().equalsIgnoreCase("VVOL")) {
3654+
if (!primaryDsMo.getDatastoreType().equalsIgnoreCase("VVOL")) {
36553655
HypervisorHostHelper.createBaseFolderInDatastore(primaryDsMo, primaryDsMo.getDataCenterMor());
36563656
workerVm.moveAllVmDiskFiles(primaryDsMo, HypervisorHostHelper.VSPHERE_DATASTORE_BASE_FOLDER, false);
36573657
}
@@ -3811,8 +3811,9 @@ public Answer copyVolumeFromPrimaryToPrimary(CopyCommand cmd) {
38113811
/**
38123812
* Return the cloned VM from the template
38133813
*/
3814-
public VirtualMachineMO cloneVMFromTemplate(VmwareHypervisorHost hyperHost, String templateName, String cloneName, String templatePrimaryStoreUuid) {
3814+
public VirtualMachineMO cloneVMFromTemplate(VmwareHypervisorHost hyperHost, TemplateObjectTO template, VolumeObjectTO volume, String cloneName, String templatePrimaryStoreUuid) {
38153815
try {
3816+
String templateName = template.getPath();
38163817
VmwareContext context = hyperHost.getContext();
38173818
DatacenterMO dcMo = new DatacenterMO(context, hyperHost.getHyperHostDatacenter());
38183819
VirtualMachineMO templateMo = dcMo.findVm(templateName);
@@ -3826,6 +3827,9 @@ public VirtualMachineMO cloneVMFromTemplate(VmwareHypervisorHost hyperHost, Stri
38263827
throw new CloudRuntimeException("Unable to find datastore in vSphere");
38273828
}
38283829
logger.info("Cloning VM " + cloneName + " from template " + templateName + " into datastore " + templatePrimaryStoreUuid);
3830+
if (template.getSize() != null) {
3831+
_fullCloneFlag = volume.getSize() > template.getSize() ? true : _fullCloneFlag;
3832+
}
38293833
if (!_fullCloneFlag) {
38303834
createVMLinkedClone(templateMo, dcMo, cloneName, morDatastore, morPool, null);
38313835
} else {

Diff for: server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -8383,6 +8383,7 @@ public Pair<UserVmVO, Volume> doInTransaction(final TransactionStatus status) th
83838383

83848384
getRootVolumeSizeForVmRestore(newVol, template, userVm, diskOffering, details, true);
83858385
volumeMgr.saveVolumeDetails(newVol.getDiskOfferingId(), newVol.getId());
8386+
newVol = _volsDao.findById(newVol.getId());
83868387

83878388
// 1. Save usage event and update resource count for user vm volumes
83888389
try {
@@ -8482,7 +8483,6 @@ public Pair<UserVmVO, Volume> doInTransaction(final TransactionStatus status) th
84828483

84838484
Long getRootVolumeSizeForVmRestore(Volume vol, VMTemplateVO template, UserVmVO userVm, DiskOffering diskOffering, Map<String, String> details, boolean update) {
84848485
VolumeVO resizedVolume = (VolumeVO) vol;
8485-
84868486
Long size = null;
84878487
if (template != null && template.getSize() != null) {
84888488
UserVmDetailVO vmRootDiskSizeDetail = userVmDetailsDao.findDetail(userVm.getId(), VmDetailConstants.ROOT_DISK_SIZE);

0 commit comments

Comments
 (0)