Skip to content

Commit 11ef692

Browse files
author
Likitha Shetty
committed
CLOUDSTACK-4875. Vmware vCenter 5.5 - System VM deployment fails.
During VM deployment when base template is being cloned to create VM ROOT disk, get the disk path i.e. base file name of the VM's ROOT disk from vCenter
1 parent 9118bbf commit 11ef692

2 files changed

Lines changed: 32 additions & 36 deletions

File tree

plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java

Lines changed: 16 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -256,22 +256,6 @@ private boolean createVMLinkedClone(VirtualMachineMO vmTemplate, DatacenterMO dc
256256
throw new Exception(msg);
257257
}
258258

259-
s_logger.info("Move volume out of volume-wrapper VM ");
260-
String[] vmwareLayoutFilePair = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo,
261-
vmdkName, vmdkName, VmwareStorageLayoutType.VMWARE, true);
262-
String[] legacyCloudStackLayoutFilePair = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo,
263-
vmdkName, vmdkName, VmwareStorageLayoutType.CLOUDSTACK_LEGACY, true);
264-
265-
dsMo.moveDatastoreFile(vmwareLayoutFilePair[0],
266-
dcMo.getMor(), dsMo.getMor(),
267-
legacyCloudStackLayoutFilePair[0],
268-
dcMo.getMor(), true);
269-
270-
dsMo.moveDatastoreFile(vmwareLayoutFilePair[1],
271-
dcMo.getMor(), dsMo.getMor(),
272-
legacyCloudStackLayoutFilePair[1],
273-
dcMo.getMor(), true);
274-
275259
return true;
276260
}
277261

@@ -285,21 +269,6 @@ private boolean createVMFullClone(VirtualMachineMO vmTemplate, DatacenterMO dcMo
285269
throw new Exception(msg);
286270
}
287271

288-
s_logger.info("Move volume out of volume-wrapper VM ");
289-
String[] vmwareLayoutFilePair = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo,
290-
vmdkName, vmdkName, VmwareStorageLayoutType.VMWARE, false);
291-
String[] legacyCloudStackLayoutFilePair = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo,
292-
vmdkName, vmdkName, VmwareStorageLayoutType.CLOUDSTACK_LEGACY, false);
293-
294-
dsMo.moveDatastoreFile(vmwareLayoutFilePair[0],
295-
dcMo.getMor(), dsMo.getMor(),
296-
legacyCloudStackLayoutFilePair[0],
297-
dcMo.getMor(), true);
298-
299-
dsMo.moveDatastoreFile(vmwareLayoutFilePair[1],
300-
dcMo.getMor(), dsMo.getMor(),
301-
legacyCloudStackLayoutFilePair[1],
302-
dcMo.getMor(), true);
303272
return true;
304273
}
305274

@@ -325,6 +294,7 @@ public Answer cloneVolumeFromBaseTemplate(CopyCommand cmd) {
325294
DatastoreMO dsMo = new DatastoreMO(context, morDatastore);
326295

327296
String vmdkName = volume.getName();
297+
String vmdkFileBaseName = null;
328298
if (srcStore == null) {
329299
// create a root volume for blank VM (created from ISO)
330300
String dummyVmName = this.hostService.getWorkerName(context, cmd, 0);
@@ -334,8 +304,8 @@ public Answer cloneVolumeFromBaseTemplate(CopyCommand cmd) {
334304
if (vmMo == null) {
335305
throw new Exception("Unable to create a dummy VM for volume creation");
336306
}
337-
338-
String vmdkFilePair[] = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, null, vmdkName,
307+
vmdkFileBaseName = vmMo.getVmdkFileBaseNames().get(0);
308+
String vmdkFilePair[] = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, null, vmdkFileBaseName,
339309
VmwareStorageLayoutType.CLOUDSTACK_LEGACY,
340310
true // we only use the first file in the pair, linked or not will not matter
341311
);
@@ -371,6 +341,16 @@ public Answer cloneVolumeFromBaseTemplate(CopyCommand cmd) {
371341
vmMo = new ClusterMO(context, morCluster).findVmOnHyperHost(vmdkName);
372342
assert (vmMo != null);
373343

344+
vmdkFileBaseName = vmMo.getVmdkFileBaseNames().get(0); // TO-DO: Support for base template containing multiple disks
345+
s_logger.info("Move volume out of volume-wrapper VM ");
346+
String[] vmwareLayoutFilePair = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, vmdkName, vmdkFileBaseName,
347+
VmwareStorageLayoutType.VMWARE, !_fullCloneFlag);
348+
String[] legacyCloudStackLayoutFilePair = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, vmdkName, vmdkFileBaseName,
349+
VmwareStorageLayoutType.CLOUDSTACK_LEGACY, !_fullCloneFlag);
350+
351+
dsMo.moveDatastoreFile(vmwareLayoutFilePair[0], dcMo.getMor(), dsMo.getMor(), legacyCloudStackLayoutFilePair[0], dcMo.getMor(), true);
352+
dsMo.moveDatastoreFile(vmwareLayoutFilePair[1], dcMo.getMor(), dsMo.getMor(), legacyCloudStackLayoutFilePair[1], dcMo.getMor(), true);
353+
374354
s_logger.info("detach disks from volume-wrapper VM " + vmdkName);
375355
vmMo.detachAllDisks();
376356

@@ -383,13 +363,13 @@ public Answer cloneVolumeFromBaseTemplate(CopyCommand cmd) {
383363
// restoreVM - move the new ROOT disk into corresponding VM folder
384364
String vmInternalCSName = volume.getVmName();
385365
if (dsMo.folderExists(String.format("[%s]", dsMo.getName()), vmInternalCSName)) {
386-
String oldRootDisk = VmwareStorageLayoutHelper.getVmwareDatastorePathFromVmdkFileName(dsMo, vmInternalCSName, vmdkName);
366+
String oldRootDisk = VmwareStorageLayoutHelper.getVmwareDatastorePathFromVmdkFileName(dsMo, vmInternalCSName, vmdkFileBaseName);
387367
if (oldRootDisk != null)
388-
VmwareStorageLayoutHelper.syncVolumeToVmDefaultFolder(dcMo, vmInternalCSName, dsMo, vmdkName);
368+
VmwareStorageLayoutHelper.syncVolumeToVmDefaultFolder(dcMo, vmInternalCSName, dsMo, vmdkFileBaseName);
389369
}
390370

391371
VolumeObjectTO newVol = new VolumeObjectTO();
392-
newVol.setPath(vmdkName);
372+
newVol.setPath(vmdkFileBaseName);
393373
newVol.setSize(volume.getSize());
394374
return new CopyCmdAnswer(newVol);
395375
} catch (Throwable e) {

vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1693,6 +1693,22 @@ public void copyAllVmDiskFiles(DatastoreMO destDsMo, String destDsDir, boolean f
16931693
}
16941694
}
16951695

1696+
public List<String> getVmdkFileBaseNames() throws Exception {
1697+
List<String> vmdkFileBaseNames = new ArrayList<String>();
1698+
VirtualDevice[] devices = getAllDiskDevice();
1699+
for(VirtualDevice device : devices) {
1700+
if(device instanceof VirtualDisk) {
1701+
VirtualDeviceBackingInfo backingInfo = ((VirtualDisk)device).getBacking();
1702+
if(backingInfo instanceof VirtualDiskFlatVer2BackingInfo) {
1703+
VirtualDiskFlatVer2BackingInfo diskBackingInfo = (VirtualDiskFlatVer2BackingInfo)backingInfo;
1704+
DatastoreFile dsBackingFile = new DatastoreFile(diskBackingInfo.getFileName());
1705+
vmdkFileBaseNames.add(dsBackingFile.getFileBaseName());
1706+
}
1707+
}
1708+
}
1709+
return vmdkFileBaseNames;
1710+
}
1711+
16961712
// this method relies on un-offical VMware API
16971713
@Deprecated
16981714
public void moveAllVmDiskFiles(DatastoreMO destDsMo, String destDsDir, boolean followDiskChain) throws Exception {

0 commit comments

Comments
 (0)