@@ -3705,10 +3705,12 @@ public synchronized CreateAnswer execute(CreateCommand cmd) {
37053705 ManagedObjectReference morDatastore = HypervisorHostHelper .findDatastoreWithBackwardsCompatibility (hyperHost , pool .getUuid ());
37063706 if (morDatastore == null )
37073707 throw new Exception ("Unable to find datastore in vSphere" );
3708-
3708+
37093709 DatastoreMO dsMo = new DatastoreMO (context , morDatastore );
37103710
3711- if (cmd .getDiskCharacteristics ().getType () == Volume .Type .ROOT ) {
3711+ if (dskch .getType () == Volume .Type .ROOT ) {
3712+ // attach volume id to make the name unique
3713+ String vmdkName = dskch .getName () + "-" + dskch .getVolumeId ();
37123714 if (cmd .getTemplateUrl () == null ) {
37133715 // create a root volume for blank VM
37143716 String dummyVmName = getWorkerName (context , cmd , 0 );
@@ -3720,16 +3722,15 @@ public synchronized CreateAnswer execute(CreateCommand cmd) {
37203722 throw new Exception ("Unable to create a dummy VM for volume creation" );
37213723 }
37223724
3723- String volumeDatastorePath = String .format ("[%s] %s.vmdk" , dsMo .getName (), cmd . getDiskCharacteristics (). getName () );
3725+ String volumeDatastorePath = String .format ("[%s] %s.vmdk" , dsMo .getName (), vmdkName );
37243726 synchronized (this ) {
37253727 s_logger .info ("Delete file if exists in datastore to clear the way for creating the volume. file: " + volumeDatastorePath );
3726- VmwareHelper .deleteVolumeVmdkFiles (dsMo , cmd . getDiskCharacteristics (). getName () , dcMo );
3727- vmMo .createDisk (volumeDatastorePath , (int ) (cmd . getDiskCharacteristics () .getSize () / (1024L * 1024L )), morDatastore , -1 );
3728+ VmwareHelper .deleteVolumeVmdkFiles (dsMo , vmdkName , dcMo );
3729+ vmMo .createDisk (volumeDatastorePath , (int ) (dskch .getSize () / (1024L * 1024L )), morDatastore , -1 );
37283730 vmMo .detachDisk (volumeDatastorePath , false );
37293731 }
37303732
3731- VolumeTO vol = new VolumeTO (cmd .getVolumeId (), dskch .getType (), pool .getType (), pool .getUuid (), cmd .getDiskCharacteristics ().getName (), pool .getPath (), cmd
3732- .getDiskCharacteristics ().getName (), cmd .getDiskCharacteristics ().getSize (), null );
3733+ VolumeTO vol = new VolumeTO (cmd .getVolumeId (), dskch .getType (), pool .getType (), pool .getUuid (), dskch .getName (), pool .getPath (), vmdkName , dskch .getSize (), null );
37333734 return new CreateAnswer (cmd , vol );
37343735 } finally {
37353736 vmMo .detachAllDisks ();
@@ -3753,41 +3754,40 @@ public synchronized CreateAnswer execute(CreateCommand cmd) {
37533754 throw new Exception (msg );
37543755 }
37553756
3756- String name = cmd .getDiskCharacteristics ().getName ();
3757- if (dsMo .folderExists (String .format ("[%s]" , dsMo .getName ()), name ))
3758- dsMo .deleteFile (String .format ("[%s] %s/" , dsMo .getName (), name ), dcMo .getMor (), false );
3757+ if (dsMo .folderExists (String .format ("[%s]" , dsMo .getName ()), vmdkName ))
3758+ dsMo .deleteFile (String .format ("[%s] %s/" , dsMo .getName (), vmdkName ), dcMo .getMor (), false );
37593759
37603760 s_logger .info ("create linked clone from template" );
3761- if (!vmTemplate .createLinkedClone (name , morBaseSnapshot , dcMo .getVmFolder (), morPool , morDatastore )) {
3761+ if (!vmTemplate .createLinkedClone (vmdkName , morBaseSnapshot , dcMo .getVmFolder (), morPool , morDatastore )) {
37623762 String msg = "Unable to clone from the template" ;
37633763 s_logger .error (msg );
37643764 throw new Exception (msg );
37653765 }
37663766
3767- VirtualMachineMO vmMo = new ClusterMO (context , morCluster ).findVmOnHyperHost (name );
3767+ VirtualMachineMO vmMo = new ClusterMO (context , morCluster ).findVmOnHyperHost (vmdkName );
37683768 assert (vmMo != null );
37693769
37703770 // we can't rely on un-offical API (VirtualMachineMO.moveAllVmDiskFiles() any more, use hard-coded disk names that we know
37713771 // to move files
37723772 s_logger .info ("Move volume out of volume-wrapper VM " );
3773- dsMo .moveDatastoreFile (String .format ("[%s] %s/%s.vmdk" , dsMo .getName (), name , name ),
3774- dcMo .getMor (), dsMo .getMor (),
3775- String .format ("[%s] %s.vmdk" , dsMo .getName (), name ), dcMo .getMor (), true );
3773+ dsMo .moveDatastoreFile (String .format ("[%s] %s/%s.vmdk" , dsMo .getName (), vmdkName , vmdkName ),
3774+ dcMo .getMor (), dsMo .getMor (),
3775+ String .format ("[%s] %s.vmdk" , dsMo .getName (), vmdkName ), dcMo .getMor (), true );
37763776
3777- dsMo .moveDatastoreFile (String .format ("[%s] %s/%s-delta.vmdk" , dsMo .getName (), name , name ),
3778- dcMo .getMor (), dsMo .getMor (),
3779- String .format ("[%s] %s-delta.vmdk" , dsMo .getName (), name ), dcMo .getMor (), true );
3777+ dsMo .moveDatastoreFile (String .format ("[%s] %s/%s-delta.vmdk" , dsMo .getName (), vmdkName , vmdkName ),
3778+ dcMo .getMor (), dsMo .getMor (),
3779+ String .format ("[%s] %s-delta.vmdk" , dsMo .getName (), vmdkName ), dcMo .getMor (), true );
37803780
3781- s_logger .info ("detach disks from volume-wrapper VM " + name );
3781+ s_logger .info ("detach disks from volume-wrapper VM " + vmdkName );
37823782 vmMo .detachAllDisks ();
37833783
3784- s_logger .info ("destroy volume-wrapper VM " + name );
3784+ s_logger .info ("destroy volume-wrapper VM " + vmdkName );
37853785 vmMo .destroy ();
37863786
3787- String srcFile = String .format ("[%s] %s/" , dsMo .getName (), name );
3787+ String srcFile = String .format ("[%s] %s/" , dsMo .getName (), vmdkName );
37883788 dsMo .deleteFile (srcFile , dcMo .getMor (), true );
37893789
3790- VolumeTO vol = new VolumeTO (cmd .getVolumeId (), dskch .getType (), pool .getType (), pool .getUuid (), name , pool .getPath (), name , cmd . getDiskCharacteristics () .getSize (), null );
3790+ VolumeTO vol = new VolumeTO (cmd .getVolumeId (), dskch .getType (), pool .getType (), pool .getUuid (), dskch . getName () , pool .getPath (), vmdkName , dskch .getSize (), null );
37913791 return new CreateAnswer (cmd , vol );
37923792 }
37933793 } else {
@@ -3806,12 +3806,11 @@ public synchronized CreateAnswer execute(CreateCommand cmd) {
38063806 // s_logger.info("Delete file if exists in datastore to clear the way for creating the volume. file: " + volumeDatastorePath);
38073807 VmwareHelper .deleteVolumeVmdkFiles (dsMo , volumeUuid .toString (), dcMo );
38083808
3809- vmMo .createDisk (volumeDatastorePath , (int ) (cmd . getDiskCharacteristics () .getSize () / (1024L * 1024L )), morDatastore , vmMo .getScsiDeviceControllerKey ());
3809+ vmMo .createDisk (volumeDatastorePath , (int ) (dskch .getSize () / (1024L * 1024L )), morDatastore , vmMo .getScsiDeviceControllerKey ());
38103810 vmMo .detachDisk (volumeDatastorePath , false );
38113811 }
38123812
3813- VolumeTO vol = new VolumeTO (cmd .getVolumeId (), dskch .getType (), pool .getType (), pool .getUuid (), cmd .getDiskCharacteristics ().getName (), pool .getPath (), volumeUuid , cmd
3814- .getDiskCharacteristics ().getSize (), null );
3813+ VolumeTO vol = new VolumeTO (cmd .getVolumeId (), dskch .getType (), pool .getType (), pool .getUuid (), dskch .getName (), pool .getPath (), volumeUuid , dskch .getSize (), null );
38153814 return new CreateAnswer (cmd , vol );
38163815 } finally {
38173816 s_logger .info ("Destroy dummy VM after volume creation" );
0 commit comments