2121import static org .mockito .Mockito .when ;
2222
2323import java .lang .reflect .Field ;
24+ import java .lang .reflect .InvocationTargetException ;
25+ import java .lang .reflect .Method ;
2426
2527import static org .mockito .Mockito .verify ;
2628import static org .mockito .Mockito .never ;
2729import static org .mockito .Mockito .any ;
2830
31+ import com .cloud .storage .Storage ;
2932import com .cloud .storage .StorageManager ;
3033import com .cloud .storage .StoragePool ;
34+ import org .apache .cloudstack .engine .subsystem .api .storage .DataObject ;
35+ import org .apache .cloudstack .engine .subsystem .api .storage .DataStore ;
36+ import org .apache .cloudstack .engine .subsystem .api .storage .ClusterScope ;
37+ import org .apache .cloudstack .engine .subsystem .api .storage .HostScope ;
38+ import org .apache .cloudstack .engine .subsystem .api .storage .StorageCacheManager ;
39+ import org .apache .cloudstack .engine .subsystem .api .storage .ZoneScope ;
3140import org .apache .cloudstack .framework .config .ConfigKey ;
41+ import org .apache .cloudstack .framework .config .dao .ConfigurationDao ;
42+ import org .apache .cloudstack .storage .image .store .TemplateObject ;
3243import org .apache .cloudstack .storage .to .PrimaryDataStoreTO ;
44+ import org .apache .cloudstack .storage .volume .VolumeObject ;
45+ import org .junit .Assert ;
3346import org .junit .Before ;
3447import org .junit .Test ;
3548import org .junit .runner .RunWith ;
3649import org .mockito .InjectMocks ;
3750import org .mockito .Mock ;
51+ import org .mockito .Mockito ;
3852import org .mockito .Spy ;
3953import org .mockito .junit .MockitoJUnitRunner ;
4054
@@ -57,6 +71,10 @@ public class AncientDataMotionStrategyTest {
5771 StorageManager storageManager ;
5872 @ Mock
5973 StoragePool storagePool ;
74+ @ Mock
75+ StorageCacheManager cacheMgr ;
76+ @ Mock
77+ ConfigurationDao configDao ;
6078
6179 private static final long POOL_ID = 1l ;
6280 private static final Boolean FULL_CLONE_FLAG = true ;
@@ -88,4 +106,186 @@ public void testAddFullCloneFlagOnNotVmwareDest(){
88106 verify (dataStoreTO , never ()).setFullCloneFlag (any (Boolean .class ));
89107 }
90108
109+ @ Test
110+ public void testCanBypassSecondaryStorageForDirectDownload () throws NoSuchMethodException , InvocationTargetException , IllegalAccessException {
111+ VolumeObject srcVolumeInfo = Mockito .spy (new VolumeObject ());
112+ Mockito .doReturn (true ).when (srcVolumeInfo ).isDirectDownload ();
113+
114+ VolumeObject destVolumeInfo = Mockito .spy (new VolumeObject ());
115+
116+ Method method ;
117+ method = AncientDataMotionStrategy .class .getDeclaredMethod ("canBypassSecondaryStorage" , DataObject .class , DataObject .class );
118+ method .setAccessible (true );
119+ boolean canBypassSecondaryStorage = (boolean ) method .invoke (strategy , srcVolumeInfo , destVolumeInfo );
120+ Assert .assertTrue (canBypassSecondaryStorage );
121+ }
122+
123+ @ Test
124+ public void testCanBypassSecondaryStorageForUnsupportedDataObject () throws NoSuchMethodException , InvocationTargetException , IllegalAccessException {
125+ VolumeObject srcVolumeInfo = Mockito .spy (new VolumeObject ());
126+
127+ TemplateObject destTemplateInfo = Mockito .spy (new TemplateObject ());
128+
129+ Method method ;
130+ method = AncientDataMotionStrategy .class .getDeclaredMethod ("canBypassSecondaryStorage" , DataObject .class , DataObject .class );
131+ method .setAccessible (true );
132+ boolean canBypassSecondaryStorage = (boolean ) method .invoke (strategy , srcVolumeInfo , destTemplateInfo );
133+ Assert .assertFalse (canBypassSecondaryStorage );
134+ }
135+
136+ @ Test
137+ public void testCanBypassSecondaryStorageForUnsupportedSrcPoolType () throws NoSuchMethodException , InvocationTargetException , IllegalAccessException {
138+ VolumeObject srcVolumeInfo = Mockito .spy (new VolumeObject ());
139+ DataStore srcDataStore = Mockito .mock (DataStore .class );
140+ Mockito .doReturn (new ZoneScope (1L )).when (srcDataStore ).getScope ();
141+ Mockito .doReturn (srcDataStore ).when (srcVolumeInfo ).getDataStore ();
142+ Mockito .doReturn (Storage .StoragePoolType .PowerFlex ).when (srcVolumeInfo ).getStoragePoolType ();
143+
144+ VolumeObject destVolumeInfo = Mockito .spy (new VolumeObject ());
145+ DataStore destDataStore = Mockito .mock (DataStore .class );
146+ Mockito .doReturn (new ZoneScope (1L )).when (destDataStore ).getScope ();
147+ Mockito .doReturn (destDataStore ).when (destVolumeInfo ).getDataStore ();
148+ Mockito .doReturn (Storage .StoragePoolType .NetworkFilesystem ).when (destVolumeInfo ).getStoragePoolType ();
149+
150+ Method method ;
151+ method = AncientDataMotionStrategy .class .getDeclaredMethod ("canBypassSecondaryStorage" , DataObject .class , DataObject .class );
152+ method .setAccessible (true );
153+ boolean canBypassSecondaryStorage = (boolean ) method .invoke (strategy , srcVolumeInfo , destVolumeInfo );
154+ Assert .assertFalse (canBypassSecondaryStorage );
155+ }
156+
157+ @ Test
158+ public void testCanBypassSecondaryStorageForUnsupportedDestPoolType () throws NoSuchMethodException , InvocationTargetException , IllegalAccessException {
159+ VolumeObject srcVolumeInfo = Mockito .spy (new VolumeObject ());
160+ DataStore srcDataStore = Mockito .mock (DataStore .class );
161+ Mockito .doReturn (new ZoneScope (1L )).when (srcDataStore ).getScope ();
162+ Mockito .doReturn (srcDataStore ).when (srcVolumeInfo ).getDataStore ();
163+ Mockito .doReturn (Storage .StoragePoolType .NetworkFilesystem ).when (srcVolumeInfo ).getStoragePoolType ();
164+
165+ VolumeObject destVolumeInfo = Mockito .spy (new VolumeObject ());
166+ DataStore destDataStore = Mockito .mock (DataStore .class );
167+ Mockito .doReturn (new ZoneScope (1L )).when (destDataStore ).getScope ();
168+ Mockito .doReturn (destDataStore ).when (destVolumeInfo ).getDataStore ();
169+ Mockito .doReturn (Storage .StoragePoolType .Iscsi ).when (destVolumeInfo ).getStoragePoolType ();
170+
171+ Method method ;
172+ method = AncientDataMotionStrategy .class .getDeclaredMethod ("canBypassSecondaryStorage" , DataObject .class , DataObject .class );
173+ method .setAccessible (true );
174+ boolean canBypassSecondaryStorage = (boolean ) method .invoke (strategy , srcVolumeInfo , destVolumeInfo );
175+ Assert .assertFalse (canBypassSecondaryStorage );
176+ }
177+
178+ @ Test
179+ public void testCanBypassSecondaryStorageWithZoneWideNFSPoolsInSameZone () throws NoSuchMethodException , InvocationTargetException , IllegalAccessException {
180+ VolumeObject srcVolumeInfo = Mockito .spy (new VolumeObject ());
181+ DataStore srcDataStore = Mockito .mock (DataStore .class );
182+ Mockito .doReturn (new ZoneScope (1L )).when (srcDataStore ).getScope ();
183+ Mockito .doReturn (srcDataStore ).when (srcVolumeInfo ).getDataStore ();
184+ Mockito .doReturn (Storage .StoragePoolType .NetworkFilesystem ).when (srcVolumeInfo ).getStoragePoolType ();
185+
186+ VolumeObject destVolumeInfo = Mockito .spy (new VolumeObject ());
187+ DataStore destDataStore = Mockito .mock (DataStore .class );
188+ Mockito .doReturn (new ZoneScope (1L )).when (destDataStore ).getScope ();
189+ Mockito .doReturn (destDataStore ).when (destVolumeInfo ).getDataStore ();
190+ Mockito .doReturn (Storage .StoragePoolType .NetworkFilesystem ).when (destVolumeInfo ).getStoragePoolType ();
191+
192+ Method method ;
193+ method = AncientDataMotionStrategy .class .getDeclaredMethod ("canBypassSecondaryStorage" , DataObject .class , DataObject .class );
194+ method .setAccessible (true );
195+ boolean canBypassSecondaryStorage = (boolean ) method .invoke (strategy , srcVolumeInfo , destVolumeInfo );
196+ Assert .assertTrue (canBypassSecondaryStorage );
197+ }
198+
199+ @ Test
200+ public void testCanBypassSecondaryStorageWithClusterWideNFSPoolsInSameCluster () throws NoSuchMethodException , InvocationTargetException , IllegalAccessException {
201+ VolumeObject srcVolumeInfo = Mockito .spy (new VolumeObject ());
202+ DataStore srcDataStore = Mockito .mock (DataStore .class );
203+ Mockito .doReturn (new ClusterScope (5L , 2L , 1L )).when (srcDataStore ).getScope ();
204+ Mockito .doReturn (srcDataStore ).when (srcVolumeInfo ).getDataStore ();
205+ Mockito .doReturn (Storage .StoragePoolType .NetworkFilesystem ).when (srcVolumeInfo ).getStoragePoolType ();
206+
207+ VolumeObject destVolumeInfo = Mockito .spy (new VolumeObject ());
208+ DataStore destDataStore = Mockito .mock (DataStore .class );
209+ Mockito .doReturn (new ClusterScope (5L , 2L , 1L )).when (destDataStore ).getScope ();
210+ Mockito .doReturn (destDataStore ).when (destVolumeInfo ).getDataStore ();
211+ Mockito .doReturn (Storage .StoragePoolType .NetworkFilesystem ).when (destVolumeInfo ).getStoragePoolType ();
212+
213+ Method method ;
214+ method = AncientDataMotionStrategy .class .getDeclaredMethod ("canBypassSecondaryStorage" , DataObject .class , DataObject .class );
215+ method .setAccessible (true );
216+ boolean canBypassSecondaryStorage = (boolean ) method .invoke (strategy , srcVolumeInfo , destVolumeInfo );
217+ Assert .assertTrue (canBypassSecondaryStorage );
218+ }
219+
220+ @ Test
221+ public void testCanBypassSecondaryStorageWithLocalAndClusterWideNFSPoolsInSameCluster () throws NoSuchMethodException , InvocationTargetException , IllegalAccessException {
222+ VolumeObject srcVolumeInfo = Mockito .spy (new VolumeObject ());
223+ DataStore srcDataStore = Mockito .mock (DataStore .class );
224+ Mockito .doReturn (new HostScope (1L , 1L , 1L )).when (srcDataStore ).getScope ();
225+ Mockito .doReturn (srcDataStore ).when (srcVolumeInfo ).getDataStore ();
226+ Mockito .doReturn (Storage .StoragePoolType .Filesystem ).when (srcVolumeInfo ).getStoragePoolType ();
227+
228+ VolumeObject destVolumeInfo = Mockito .spy (new VolumeObject ());
229+ DataStore destDataStore = Mockito .mock (DataStore .class );
230+ Mockito .doReturn (new ClusterScope (1L , 1L , 1L )).when (destDataStore ).getScope ();
231+ Mockito .doReturn (destDataStore ).when (destVolumeInfo ).getDataStore ();
232+ Mockito .doReturn (Storage .StoragePoolType .NetworkFilesystem ).when (destVolumeInfo ).getStoragePoolType ();
233+
234+ Method method ;
235+ method = AncientDataMotionStrategy .class .getDeclaredMethod ("canBypassSecondaryStorage" , DataObject .class , DataObject .class );
236+ method .setAccessible (true );
237+ boolean canBypassSecondaryStorage = (boolean ) method .invoke (strategy , srcVolumeInfo , destVolumeInfo );
238+ Assert .assertTrue (canBypassSecondaryStorage );
239+
240+ canBypassSecondaryStorage = (boolean ) method .invoke (strategy , destVolumeInfo , srcVolumeInfo );
241+ Assert .assertTrue (canBypassSecondaryStorage );
242+ }
243+
244+ @ Test
245+ public void testCanBypassSecondaryStorageWithLocalAndZoneWideNFSPoolsInSameZone () throws NoSuchMethodException , InvocationTargetException , IllegalAccessException {
246+ VolumeObject srcVolumeInfo = Mockito .spy (new VolumeObject ());
247+ DataStore srcDataStore = Mockito .mock (DataStore .class );
248+ Mockito .doReturn (new HostScope (1L , 1L , 1L )).when (srcDataStore ).getScope ();
249+ Mockito .doReturn (srcDataStore ).when (srcVolumeInfo ).getDataStore ();
250+ Mockito .doReturn (Storage .StoragePoolType .Filesystem ).when (srcVolumeInfo ).getStoragePoolType ();
251+
252+ VolumeObject destVolumeInfo = Mockito .spy (new VolumeObject ());
253+ DataStore destDataStore = Mockito .mock (DataStore .class );
254+ Mockito .doReturn (new ZoneScope (1L )).when (destDataStore ).getScope ();
255+ Mockito .doReturn (destDataStore ).when (destVolumeInfo ).getDataStore ();
256+ Mockito .doReturn (Storage .StoragePoolType .NetworkFilesystem ).when (destVolumeInfo ).getStoragePoolType ();
257+
258+ Method method ;
259+ method = AncientDataMotionStrategy .class .getDeclaredMethod ("canBypassSecondaryStorage" , DataObject .class , DataObject .class );
260+ method .setAccessible (true );
261+ boolean canBypassSecondaryStorage = (boolean ) method .invoke (strategy , srcVolumeInfo , destVolumeInfo );
262+ Assert .assertTrue (canBypassSecondaryStorage );
263+
264+ canBypassSecondaryStorage = (boolean ) method .invoke (strategy , destVolumeInfo , srcVolumeInfo );
265+ Assert .assertTrue (canBypassSecondaryStorage );
266+ }
267+
268+ @ Test
269+ public void testCanBypassSecondaryStorageWithClusterWideNFSAndZoneWideNFSPoolsInSameZone () throws NoSuchMethodException , InvocationTargetException , IllegalAccessException {
270+ VolumeObject srcVolumeInfo = Mockito .spy (new VolumeObject ());
271+ DataStore srcDataStore = Mockito .mock (DataStore .class );
272+ Mockito .doReturn (new ClusterScope (5L , 2L , 1L )).when (srcDataStore ).getScope ();
273+ Mockito .doReturn (srcDataStore ).when (srcVolumeInfo ).getDataStore ();
274+ Mockito .doReturn (Storage .StoragePoolType .NetworkFilesystem ).when (srcVolumeInfo ).getStoragePoolType ();
275+
276+ VolumeObject destVolumeInfo = Mockito .spy (new VolumeObject ());
277+ DataStore destDataStore = Mockito .mock (DataStore .class );
278+ Mockito .doReturn (new ZoneScope (1L )).when (destDataStore ).getScope ();
279+ Mockito .doReturn (destDataStore ).when (destVolumeInfo ).getDataStore ();
280+ Mockito .doReturn (Storage .StoragePoolType .NetworkFilesystem ).when (destVolumeInfo ).getStoragePoolType ();
281+
282+ Method method ;
283+ method = AncientDataMotionStrategy .class .getDeclaredMethod ("canBypassSecondaryStorage" , DataObject .class , DataObject .class );
284+ method .setAccessible (true );
285+ boolean canBypassSecondaryStorage = (boolean ) method .invoke (strategy , srcVolumeInfo , destVolumeInfo );
286+ Assert .assertTrue (canBypassSecondaryStorage );
287+
288+ canBypassSecondaryStorage = (boolean ) method .invoke (strategy , destVolumeInfo , srcVolumeInfo );
289+ Assert .assertTrue (canBypassSecondaryStorage );
290+ }
91291}
0 commit comments