Skip to content

Commit fa2f18d

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 3604f87 commit fa2f18d

2 files changed

Lines changed: 30 additions & 23 deletions

File tree

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

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -253,16 +253,6 @@ private boolean createVMLinkedClone(VirtualMachineMO vmTemplate, DatacenterMO dc
253253
s_logger.error(msg);
254254
throw new Exception(msg);
255255
}
256-
257-
s_logger.info("Move volume out of volume-wrapper VM ");
258-
String[] vmwareLayoutFilePair = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, vmdkName, vmdkName, VmwareStorageLayoutType.VMWARE, true);
259-
String[] legacyCloudStackLayoutFilePair =
260-
VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, vmdkName, vmdkName, VmwareStorageLayoutType.CLOUDSTACK_LEGACY, true);
261-
262-
dsMo.moveDatastoreFile(vmwareLayoutFilePair[0], dcMo.getMor(), dsMo.getMor(), legacyCloudStackLayoutFilePair[0], dcMo.getMor(), true);
263-
264-
dsMo.moveDatastoreFile(vmwareLayoutFilePair[1], dcMo.getMor(), dsMo.getMor(), legacyCloudStackLayoutFilePair[1], dcMo.getMor(), true);
265-
266256
return true;
267257
}
268258

@@ -275,15 +265,6 @@ private boolean createVMFullClone(VirtualMachineMO vmTemplate, DatacenterMO dcMo
275265
s_logger.error(msg);
276266
throw new Exception(msg);
277267
}
278-
279-
s_logger.info("Move volume out of volume-wrapper VM ");
280-
String[] vmwareLayoutFilePair = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, vmdkName, vmdkName, VmwareStorageLayoutType.VMWARE, false);
281-
String[] legacyCloudStackLayoutFilePair =
282-
VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, vmdkName, vmdkName, VmwareStorageLayoutType.CLOUDSTACK_LEGACY, false);
283-
284-
dsMo.moveDatastoreFile(vmwareLayoutFilePair[0], dcMo.getMor(), dsMo.getMor(), legacyCloudStackLayoutFilePair[0], dcMo.getMor(), true);
285-
286-
dsMo.moveDatastoreFile(vmwareLayoutFilePair[1], dcMo.getMor(), dsMo.getMor(), legacyCloudStackLayoutFilePair[1], dcMo.getMor(), true);
287268
return true;
288269
}
289270

@@ -309,6 +290,7 @@ public Answer cloneVolumeFromBaseTemplate(CopyCommand cmd) {
309290
DatastoreMO dsMo = new DatastoreMO(context, morDatastore);
310291

311292
String vmdkName = volume.getName();
293+
String vmdkFileBaseName = null;
312294
if (srcStore == null) {
313295
// create a root volume for blank VM (created from ISO)
314296
String dummyVmName = this.hostService.getWorkerName(context, cmd, 0);
@@ -319,8 +301,9 @@ public Answer cloneVolumeFromBaseTemplate(CopyCommand cmd) {
319301
throw new Exception("Unable to create a dummy VM for volume creation");
320302
}
321303

322-
String vmdkFilePair[] = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, null, vmdkName, VmwareStorageLayoutType.CLOUDSTACK_LEGACY, true // we only use the first file in the pair, linked or not will not matter
323-
);
304+
vmdkFileBaseName = vmMo.getVmdkFileBaseNames().get(0);
305+
// we only use the first file in the pair, linked or not will not matter
306+
String vmdkFilePair[] = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, null, vmdkFileBaseName, VmwareStorageLayoutType.CLOUDSTACK_LEGACY, true);
324307
String volumeDatastorePath = vmdkFilePair[0];
325308
synchronized (this) {
326309
s_logger.info("Delete file if exists in datastore to clear the way for creating the volume. file: " + volumeDatastorePath);
@@ -353,6 +336,14 @@ public Answer cloneVolumeFromBaseTemplate(CopyCommand cmd) {
353336
vmMo = new ClusterMO(context, morCluster).findVmOnHyperHost(vmdkName);
354337
assert (vmMo != null);
355338

339+
vmdkFileBaseName = vmMo.getVmdkFileBaseNames().get(0); // TO-DO: Support for base template containing multiple disks
340+
s_logger.info("Move volume out of volume-wrapper VM ");
341+
String[] vmwareLayoutFilePair = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, vmdkName, vmdkFileBaseName, VmwareStorageLayoutType.VMWARE, !_fullCloneFlag);
342+
String[] legacyCloudStackLayoutFilePair = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, vmdkName, vmdkFileBaseName, VmwareStorageLayoutType.CLOUDSTACK_LEGACY, !_fullCloneFlag);
343+
344+
dsMo.moveDatastoreFile(vmwareLayoutFilePair[0], dcMo.getMor(), dsMo.getMor(), legacyCloudStackLayoutFilePair[0], dcMo.getMor(), true);
345+
dsMo.moveDatastoreFile(vmwareLayoutFilePair[1], dcMo.getMor(), dsMo.getMor(), legacyCloudStackLayoutFilePair[1], dcMo.getMor(), true);
346+
356347
s_logger.info("detach disks from volume-wrapper VM " + vmdkName);
357348
vmMo.detachAllDisks();
358349

@@ -365,11 +356,11 @@ public Answer cloneVolumeFromBaseTemplate(CopyCommand cmd) {
365356
// restoreVM - move the new ROOT disk into corresponding VM folder
366357
String vmInternalCSName = volume.getVmName();
367358
if (dsMo.folderExists(String.format("[%s]", dsMo.getName()), vmInternalCSName)) {
368-
VmwareStorageLayoutHelper.syncVolumeToVmDefaultFolder(dcMo, vmInternalCSName, dsMo, vmdkName);
359+
VmwareStorageLayoutHelper.syncVolumeToVmDefaultFolder(dcMo, vmInternalCSName, dsMo, vmdkFileBaseName);
369360
}
370361

371362
VolumeObjectTO newVol = new VolumeObjectTO();
372-
newVol.setPath(vmdkName);
363+
newVol.setPath(vmdkFileBaseName);
373364
newVol.setSize(volume.getSize());
374365
return new CopyCmdAnswer(newVol);
375366
} 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
@@ -1737,6 +1737,22 @@ public void copyAllVmDiskFiles(DatastoreMO destDsMo, String destDsDir, boolean f
17371737
}
17381738
}
17391739

1740+
public List<String> getVmdkFileBaseNames() throws Exception {
1741+
List<String> vmdkFileBaseNames = new ArrayList<String>();
1742+
VirtualDevice[] devices = getAllDiskDevice();
1743+
for(VirtualDevice device : devices) {
1744+
if(device instanceof VirtualDisk) {
1745+
VirtualDeviceBackingInfo backingInfo = ((VirtualDisk)device).getBacking();
1746+
if(backingInfo instanceof VirtualDiskFlatVer2BackingInfo) {
1747+
VirtualDiskFlatVer2BackingInfo diskBackingInfo = (VirtualDiskFlatVer2BackingInfo)backingInfo;
1748+
DatastoreFile dsBackingFile = new DatastoreFile(diskBackingInfo.getFileName());
1749+
vmdkFileBaseNames.add(dsBackingFile.getFileBaseName());
1750+
}
1751+
}
1752+
}
1753+
return vmdkFileBaseNames;
1754+
}
1755+
17401756
// this method relies on un-offical VMware API
17411757
@Deprecated
17421758
public void moveAllVmDiskFiles(DatastoreMO destDsMo, String destDsDir, boolean followDiskChain) throws Exception {

0 commit comments

Comments
 (0)