@@ -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 ) {
0 commit comments