4545import org .apache .cloudstack .storage .RemoteHostEndPoint ;
4646import org .apache .cloudstack .storage .command .CopyCommand ;
4747import org .apache .cloudstack .storage .image .datastore .ImageStoreEntity ;
48+ import org .apache .cloudstack .storage .to .PrimaryDataStoreTO ;
4849import org .apache .log4j .Logger ;
4950import org .springframework .stereotype .Component ;
5051
5657import com .cloud .agent .api .to .DataTO ;
5758import com .cloud .agent .api .to .NfsTO ;
5859import com .cloud .agent .api .to .VirtualMachineTO ;
60+ import com .cloud .capacity .CapacityManager ;
5961import com .cloud .configuration .Config ;
6062import com .cloud .host .Host ;
63+ import com .cloud .hypervisor .Hypervisor ;
6164import com .cloud .storage .DataStoreRole ;
6265import com .cloud .storage .Storage .StoragePoolType ;
6366import com .cloud .storage .StoragePool ;
@@ -153,7 +156,7 @@ protected Answer copyObject(DataObject srcData, DataObject destData, Host destHo
153156 srcForCopy = cacheData = cacheMgr .createCacheObject (srcData , destScope );
154157 }
155158
156- CopyCommand cmd = new CopyCommand (srcForCopy .getTO (), destData .getTO (), _primaryStorageDownloadWait , VirtualMachineManager .ExecuteInSequence .value ());
159+ CopyCommand cmd = new CopyCommand (srcForCopy .getTO (), addFullCloneFlagOnVMwareDest ( destData .getTO () ), _primaryStorageDownloadWait , VirtualMachineManager .ExecuteInSequence .value ());
157160 EndPoint ep = destHost != null ? RemoteHostEndPoint .getHypervisorHostEndPoint (destHost ) : selector .select (srcForCopy , destData );
158161 if (ep == null ) {
159162 String errMsg = "No remote endpoint to send command, check if host or ssvm is down?" ;
@@ -201,6 +204,23 @@ protected Answer copyObject(DataObject srcData, DataObject destData, Host destHo
201204 }
202205 }
203206
207+ /**
208+ * Adds {@code 'vmware.create.full.clone'} value for a given primary storage, whose HV is VMware, on datastore's {@code fullCloneFlag} field
209+ * @param dataTO Dest data store TO
210+ * @return dataTO including fullCloneFlag, if provided
211+ */
212+ protected DataTO addFullCloneFlagOnVMwareDest (DataTO dataTO ) {
213+ if (dataTO != null && dataTO .getHypervisorType ().equals (Hypervisor .HypervisorType .VMware )){
214+ DataStoreTO dataStoreTO = dataTO .getDataStore ();
215+ if (dataStoreTO != null && dataStoreTO instanceof PrimaryDataStoreTO ){
216+ PrimaryDataStoreTO primaryDataStoreTO = (PrimaryDataStoreTO ) dataStoreTO ;
217+ Boolean value = CapacityManager .VmwareCreateCloneFull .valueIn (primaryDataStoreTO .getId ());
218+ primaryDataStoreTO .setFullCloneFlag (value );
219+ }
220+ }
221+ return dataTO ;
222+ }
223+
204224 protected Answer copyObject (DataObject srcData , DataObject destData ) {
205225 return copyObject (srcData , destData , null );
206226 }
@@ -257,7 +277,7 @@ protected Answer copyVolumeFromSnapshot(DataObject snapObj, DataObject volObj) {
257277 ep = selector .select (srcData , volObj );
258278 }
259279
260- CopyCommand cmd = new CopyCommand (srcData .getTO (), volObj .getTO (), _createVolumeFromSnapshotWait , VirtualMachineManager .ExecuteInSequence .value ());
280+ CopyCommand cmd = new CopyCommand (srcData .getTO (), addFullCloneFlagOnVMwareDest ( volObj .getTO () ), _createVolumeFromSnapshotWait , VirtualMachineManager .ExecuteInSequence .value ());
261281 Answer answer = null ;
262282 if (ep == null ) {
263283 String errMsg = "No remote endpoint to send command, check if host or ssvm is down?" ;
@@ -280,7 +300,7 @@ protected Answer copyVolumeFromSnapshot(DataObject snapObj, DataObject volObj) {
280300 }
281301
282302 protected Answer cloneVolume (DataObject template , DataObject volume ) {
283- CopyCommand cmd = new CopyCommand (template .getTO (), volume .getTO (), 0 , VirtualMachineManager .ExecuteInSequence .value ());
303+ CopyCommand cmd = new CopyCommand (template .getTO (), addFullCloneFlagOnVMwareDest ( volume .getTO () ), 0 , VirtualMachineManager .ExecuteInSequence .value ());
284304 try {
285305 EndPoint ep = selector .select (volume .getDataStore ());
286306 Answer answer = null ;
@@ -330,7 +350,7 @@ protected Answer copyVolumeBetweenPools(DataObject srcData, DataObject destData)
330350
331351 objOnImageStore .processEvent (Event .CopyingRequested );
332352
333- CopyCommand cmd = new CopyCommand (objOnImageStore .getTO (), destData .getTO (), _copyvolumewait , VirtualMachineManager .ExecuteInSequence .value ());
353+ CopyCommand cmd = new CopyCommand (objOnImageStore .getTO (), addFullCloneFlagOnVMwareDest ( destData .getTO () ), _copyvolumewait , VirtualMachineManager .ExecuteInSequence .value ());
334354 EndPoint ep = selector .select (objOnImageStore , destData );
335355 if (ep == null ) {
336356 String errMsg = "No remote endpoint to send command, check if host or ssvm is down?" ;
@@ -477,7 +497,7 @@ protected Answer createTemplateFromSnapshot(DataObject srcData, DataObject destD
477497 ep = selector .select (srcData , destData );
478498 }
479499
480- CopyCommand cmd = new CopyCommand (srcData .getTO (), destData .getTO (), _createprivatetemplatefromsnapshotwait , VirtualMachineManager .ExecuteInSequence .value ());
500+ CopyCommand cmd = new CopyCommand (srcData .getTO (), addFullCloneFlagOnVMwareDest ( destData .getTO () ), _createprivatetemplatefromsnapshotwait , VirtualMachineManager .ExecuteInSequence .value ());
481501 Answer answer = null ;
482502 if (ep == null ) {
483503 String errMsg = "No remote endpoint to send command, check if host or ssvm is down?" ;
@@ -513,7 +533,7 @@ protected Answer copySnapshot(DataObject srcData, DataObject destData) {
513533 Scope selectedScope = pickCacheScopeForCopy (srcData , destData );
514534 cacheData = cacheMgr .getCacheObject (srcData , selectedScope );
515535
516- CopyCommand cmd = new CopyCommand (srcData .getTO (), destData .getTO (), _backupsnapshotwait , VirtualMachineManager .ExecuteInSequence .value ());
536+ CopyCommand cmd = new CopyCommand (srcData .getTO (), addFullCloneFlagOnVMwareDest ( destData .getTO () ), _backupsnapshotwait , VirtualMachineManager .ExecuteInSequence .value ());
517537 cmd .setCacheTO (cacheData .getTO ());
518538 cmd .setOptions (options );
519539 EndPoint ep = selector .select (srcData , destData );
@@ -525,6 +545,7 @@ protected Answer copySnapshot(DataObject srcData, DataObject destData) {
525545 answer = ep .sendMessage (cmd );
526546 }
527547 } else {
548+ addFullCloneFlagOnVMwareDest (destData .getTO ());
528549 CopyCommand cmd = new CopyCommand (srcData .getTO (), destData .getTO (), _backupsnapshotwait , VirtualMachineManager .ExecuteInSequence .value ());
529550 cmd .setOptions (options );
530551 EndPoint ep = selector .select (srcData , destData , StorageAction .BACKUPSNAPSHOT );
0 commit comments