Skip to content

Commit 9dd1d60

Browse files
Fix multidisk VM deployment on vVol datastore
1 parent 388a9c2 commit 9dd1d60

1 file changed

Lines changed: 22 additions & 12 deletions

File tree

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

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -849,18 +849,20 @@ public Answer cloneVolumeFromBaseTemplate(CopyCommand cmd) {
849849
s_logger.warn("Template host in vSphere is not in connected state, request template reload");
850850
return new CopyCmdAnswer("Template host in vSphere is not in connected state, request template reload");
851851
}
852-
if (dsMo.getDatastoreType().equalsIgnoreCase("VVOL") && volume.getVolumeType() == Volume.Type.ROOT) {
853-
vmdkFileBaseName = cloneVMwithVMname(context, hyperHost, template, vmTemplate, volume, dcMo, dsMo);
852+
if (dsMo.getDatastoreType().equalsIgnoreCase("VVOL")) {
853+
vmdkFileBaseName = cloneVMforVvols(context, hyperHost, template, vmTemplate, volume, dcMo, dsMo);
854854
} else {
855855
vmdkFileBaseName = createVMFolderWithVMName(context, hyperHost, template, vmTemplate, volume, dcMo, dsMo, searchExcludedFolders);
856856
}
857857
}
858858
// restoreVM - move the new ROOT disk into corresponding VM folder
859859
VirtualMachineMO restoreVmMo = dcMo.findVm(volume.getVmName());
860860
if (restoreVmMo != null) {
861-
String vmNameInVcenter = restoreVmMo.getName(); // VM folder name in datastore will be VM's name in vCenter.
862-
if (dsMo.folderExists(String.format("[%s]", dsMo.getName()), vmNameInVcenter)) {
863-
VmwareStorageLayoutHelper.syncVolumeToVmDefaultFolder(dcMo, vmNameInVcenter, dsMo, vmdkFileBaseName, searchExcludedFolders);
861+
if (!dsMo.getDatastoreType().equalsIgnoreCase("VVOL")) {
862+
String vmNameInVcenter = restoreVmMo.getName(); // VM folder name in datastore will be VM's name in vCenter.
863+
if (dsMo.folderExists(String.format("[%s]", dsMo.getName()), vmNameInVcenter)) {
864+
VmwareStorageLayoutHelper.syncVolumeToVmDefaultFolder(dcMo, vmNameInVcenter, dsMo, vmdkFileBaseName, searchExcludedFolders);
865+
}
864866
}
865867
}
866868
}
@@ -887,24 +889,32 @@ public Answer cloneVolumeFromBaseTemplate(CopyCommand cmd) {
887889
}
888890
}
889891

890-
private String cloneVMwithVMname(VmwareContext context, VmwareHypervisorHost hyperHost, TemplateObjectTO template,
891-
VirtualMachineMO vmTemplate, VolumeObjectTO volume, DatacenterMO dcMo, DatastoreMO dsMo) throws Exception {
892+
private String cloneVMforVvols(VmwareContext context, VmwareHypervisorHost hyperHost, TemplateObjectTO template,
893+
VirtualMachineMO vmTemplate, VolumeObjectTO volume, DatacenterMO dcMo, DatastoreMO dsMo) throws Exception {
892894
ManagedObjectReference morDatastore = dsMo.getMor();
893895
ManagedObjectReference morPool = hyperHost.getHyperHostOwnerResourcePool();
894896
ManagedObjectReference morCluster = hyperHost.getHyperHostCluster();
895897
if (template.getSize() != null) {
896898
_fullCloneFlag = volume.getSize() > template.getSize() ? true : _fullCloneFlag;
897899
}
900+
String vmName = volume.getVmName();
901+
if (volume.getVolumeType() == Volume.Type.DATADISK)
902+
vmName = volume.getName();
898903
if (!_fullCloneFlag) {
899-
createVMLinkedClone(vmTemplate, dcMo, volume.getVmName(), morDatastore, morPool);
904+
createVMLinkedClone(vmTemplate, dcMo, vmName, morDatastore, morPool);
900905
} else {
901-
createVMFullClone(vmTemplate, dcMo, dsMo, volume.getVmName(), morDatastore, morPool);
906+
createVMFullClone(vmTemplate, dcMo, dsMo, vmName, morDatastore, morPool);
902907
}
903908

904-
VirtualMachineMO vmMo = new ClusterMO(context, morCluster).findVmOnHyperHost(volume.getVmName());
909+
VirtualMachineMO vmMo = new ClusterMO(context, morCluster).findVmOnHyperHost(vmName);
905910
assert (vmMo != null);
906-
907-
return vmMo.getVmdkFileBaseNames().get(0);
911+
String vmdkFileBaseName = vmMo.getVmdkFileBaseNames().get(0);
912+
if (volume.getVolumeType() == Volume.Type.DATADISK) {
913+
s_logger.info("detach disks from volume-wrapper VM " + vmName);
914+
vmMo.detachAllDisks();
915+
vmMo.destroy();
916+
}
917+
return vmdkFileBaseName;
908918
}
909919

910920
private String createVMFolderWithVMName(VmwareContext context, VmwareHypervisorHost hyperHost, TemplateObjectTO template,

0 commit comments

Comments
 (0)