1818 */
1919package org .apache .cloudstack .storage .image ;
2020
21+ import com .cloud .dc .DataCenterVO ;
22+ import com .cloud .dc .dao .DataCenterDao ;
23+ import com .cloud .exception .ResourceAllocationException ;
24+ import com .cloud .exception .StorageUnavailableException ;
2125import com .cloud .storage .template .TemplateProp ;
26+ import com .cloud .template .TemplateManager ;
2227import org .apache .cloudstack .engine .orchestration .service .StorageOrchestrationService ;
2328import org .apache .cloudstack .engine .subsystem .api .storage .DataStore ;
2429import org .apache .cloudstack .engine .subsystem .api .storage .DataStoreManager ;
@@ -82,6 +87,12 @@ public class TemplateServiceImplTest {
8287 @ Mock
8388 StorageOrchestrationService storageOrchestrator ;
8489
90+ @ Mock
91+ DataCenterDao _dcDao ;
92+
93+ @ Mock
94+ TemplateManager _tmpltMgr ;
95+
8596 Map <String , TemplateProp > templatesInSourceStore = new HashMap <>();
8697
8798 @ Before
@@ -167,6 +178,11 @@ public void tryCopyingTemplateToImageStoreTestReturnsFalseWhenInstallPathIsNull(
167178 templatesInSourceStore .put (tmpltMock .getUniqueName (), tmpltPropMock );
168179 Mockito .doReturn (null ).when (templateInfoMock ).getInstallPath ();
169180
181+ Scope scopeMock = Mockito .mock (Scope .class );
182+ Mockito .doReturn (scopeMock ).when (destStoreMock ).getScope ();
183+ Mockito .doReturn (1L ).when (scopeMock ).getScopeId ();
184+ Mockito .doReturn (List .of (1L )).when (_dcDao ).listAllIds ();
185+
170186 boolean result = templateService .tryCopyingTemplateToImageStore (tmpltMock , destStoreMock );
171187
172188 Assert .assertFalse (result );
@@ -183,4 +199,92 @@ public void tryCopyingTemplateToImageStoreTestReturnsTrueWhenTemplateExistsInAno
183199 Assert .assertTrue (result );
184200 Mockito .verify (storageOrchestrator ).orchestrateTemplateCopyToImageStore (Mockito .any (), Mockito .any ());
185201 }
202+
203+ @ Test
204+ public void tryCopyingTemplateToImageStoreTestReturnsTrueWhenTemplateExistsInAnotherZone () throws StorageUnavailableException , ResourceAllocationException {
205+ Scope scopeMock = Mockito .mock (Scope .class );
206+ Mockito .doReturn (scopeMock ).when (destStoreMock ).getScope ();
207+ Mockito .doReturn (1L ).when (scopeMock ).getScopeId ();
208+ Mockito .doReturn (List .of (sourceStoreMock )).when (dataStoreManagerMock ).getImageStoresByZoneIds (1L );
209+ Mockito .doReturn (null ).when (templateService ).listTemplate (sourceStoreMock );
210+ Mockito .doReturn (List .of (1L , 2L )).when (_dcDao ).listAllIds ();
211+
212+ DataStore otherZoneStoreMock = Mockito .mock (DataStore .class );
213+ Mockito .doReturn (List .of (otherZoneStoreMock )).when (dataStoreManagerMock ).getImageStoresByZoneIds (2L );
214+
215+ Map <String , TemplateProp > templatesInOtherZone = new HashMap <>();
216+ templatesInOtherZone .put (tmpltMock .getUniqueName (), tmpltPropMock );
217+ Mockito .doReturn (templatesInOtherZone ).when (templateService ).listTemplate (otherZoneStoreMock );
218+
219+ DataCenterVO dstZoneMock = Mockito .mock (DataCenterVO .class );
220+ Mockito .doReturn (dstZoneMock ).when (_dcDao ).findById (1L );
221+ Mockito .doReturn (true ).when (_tmpltMgr ).copy (Mockito .anyLong (), Mockito .eq (tmpltMock ), Mockito .eq (otherZoneStoreMock ), Mockito .eq (dstZoneMock ));
222+
223+ boolean result = templateService .tryCopyingTemplateToImageStore (tmpltMock , destStoreMock );
224+
225+ Assert .assertTrue (result );
226+ }
227+
228+ @ Test
229+ public void tryCopyingTemplateToImageStoreTestReturnsFalseWhenDestinationZoneIsMissing () {
230+ Scope scopeMock = Mockito .mock (Scope .class );
231+ Mockito .doReturn (scopeMock ).when (destStoreMock ).getScope ();
232+ Mockito .doReturn (1L ).when (scopeMock ).getScopeId ();
233+ Mockito .doReturn (List .of (1L , 2L )).when (_dcDao ).listAllIds ();
234+ Mockito .doReturn (List .of ()).when (dataStoreManagerMock ).getImageStoresByZoneIds (1L );
235+
236+ DataStore otherZoneStoreMock = Mockito .mock (DataStore .class );
237+ Mockito .doReturn (List .of (otherZoneStoreMock )).when (dataStoreManagerMock ).getImageStoresByZoneIds (2L );
238+
239+ Map <String , TemplateProp > templates = new HashMap <>();
240+ templates .put (tmpltMock .getUniqueName (), tmpltPropMock );
241+ Mockito .doReturn (templates ).when (templateService ).listTemplate (otherZoneStoreMock );
242+ Mockito .doReturn (null ).when (_dcDao ).findById (1L );
243+
244+ boolean result = templateService .tryCopyingTemplateToImageStore (tmpltMock , destStoreMock );
245+
246+ Assert .assertFalse (result );
247+ }
248+
249+ @ Test
250+ public void tryCopyingTemplateToImageStoreTestReturnsFalseWhenCrossZoneCopyThrowsException () throws StorageUnavailableException , ResourceAllocationException {
251+ Scope scopeMock = Mockito .mock (Scope .class );
252+ Mockito .doReturn (scopeMock ).when (destStoreMock ).getScope ();
253+ Mockito .doReturn (1L ).when (scopeMock ).getScopeId ();
254+ Mockito .doReturn (List .of (1L , 2L )).when (_dcDao ).listAllIds ();
255+ Mockito .doReturn (List .of ()).when (dataStoreManagerMock ).getImageStoresByZoneIds (1L );
256+
257+ DataStore otherZoneStoreMock = Mockito .mock (DataStore .class );
258+ Mockito .doReturn (List .of (otherZoneStoreMock )).when (dataStoreManagerMock ).getImageStoresByZoneIds (2L );
259+
260+ Map <String , TemplateProp > templates = new HashMap <>();
261+ templates .put (tmpltMock .getUniqueName (), tmpltPropMock );
262+ Mockito .doReturn (templates ).when (templateService ).listTemplate (otherZoneStoreMock );
263+
264+ DataCenterVO dstZoneMock = Mockito .mock (DataCenterVO .class );
265+ Mockito .doReturn (dstZoneMock ).when (_dcDao ).findById (1L );
266+ Mockito .doThrow (new RuntimeException ("copy failed" )).when (_tmpltMgr ).copy (Mockito .anyLong (), Mockito .any (), Mockito .any (), Mockito .any ());
267+
268+ Scope sourceScopeMock = Mockito .mock (Scope .class );
269+ Mockito .doReturn (sourceScopeMock ).when (otherZoneStoreMock ).getScope ();
270+ Mockito .doReturn (2L ).when (sourceScopeMock ).getScopeId ();
271+
272+ boolean result = templateService .tryCopyingTemplateToImageStore (tmpltMock , destStoreMock );
273+
274+ Assert .assertFalse (result );
275+ }
276+
277+ @ Test
278+ public void tryCopyingTemplateToImageStoreTestReturnsFalseWhenTemplateNotFoundInAnyZone () {
279+ Scope scopeMock = Mockito .mock (Scope .class );
280+ Mockito .doReturn (scopeMock ).when (destStoreMock ).getScope ();
281+ Mockito .doReturn (1L ).when (scopeMock ).getScopeId ();
282+ Mockito .doReturn (List .of (1L , 2L )).when (_dcDao ).listAllIds ();
283+ Mockito .doReturn (List .of (sourceStoreMock )).when (dataStoreManagerMock ).getImageStoresByZoneIds (Mockito .anyLong ());
284+ Mockito .doReturn (null ).when (templateService ).listTemplate (Mockito .any ());
285+
286+ boolean result = templateService .tryCopyingTemplateToImageStore (tmpltMock , destStoreMock );
287+
288+ Assert .assertFalse (result );
289+ }
186290}
0 commit comments