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