Skip to content

Commit 5e5d194

Browse files
authored
server: do not check zone imagestores for directdownload template delete (#7607)
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
1 parent 1275db4 commit 5e5d194

File tree

2 files changed

+43
-12
lines changed

2 files changed

+43
-12
lines changed

server/src/main/java/com/cloud/template/HypervisorTemplateAdapter.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,10 @@ private Long performDirectDownloadUrlValidation(final String format, final Strin
177177
return ans.getTemplateSize();
178178
}
179179

180-
private void checkZoneImageStores(final List<Long> zoneIdList) {
180+
protected void checkZoneImageStores(final VMTemplateVO template, final List<Long> zoneIdList) {
181+
if (template.isDirectDownload()) {
182+
return;
183+
}
181184
if (zoneIdList != null && CollectionUtils.isEmpty(storeMgr.getImageStoresByScope(new ZoneScope(zoneIdList.get(0))))) {
182185
throw new InvalidParameterValueException("Failed to find a secondary storage in the specified zone.");
183186
}
@@ -677,14 +680,14 @@ public TemplateProfile prepareDelete(DeleteTemplateCmd cmd) {
677680
if (template.getTemplateType() == TemplateType.SYSTEM) {
678681
throw new InvalidParameterValueException("The DomR template cannot be deleted.");
679682
}
680-
checkZoneImageStores(profile.getZoneIdList());
683+
checkZoneImageStores(profile.getTemplate(), profile.getZoneIdList());
681684
return profile;
682685
}
683686

684687
@Override
685688
public TemplateProfile prepareDelete(DeleteIsoCmd cmd) {
686689
TemplateProfile profile = super.prepareDelete(cmd);
687-
checkZoneImageStores(profile.getZoneIdList());
690+
checkZoneImageStores(profile.getTemplate(), profile.getZoneIdList());
688691
return profile;
689692
}
690693
}

server/src/test/java/com/cloud/template/HypervisorTemplateAdapterTest.java

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@
1818

1919
package com.cloud.template;
2020

21+
import static org.mockito.Mockito.any;
22+
import static org.mockito.Mockito.anyLong;
23+
import static org.mockito.Mockito.doAnswer;
24+
import static org.mockito.Mockito.eq;
25+
import static org.mockito.Mockito.mock;
26+
import static org.mockito.Mockito.when;
27+
2128
import java.lang.reflect.Field;
2229
import java.lang.reflect.InvocationTargetException;
2330
import java.lang.reflect.Method;
@@ -29,6 +36,7 @@
2936
import java.util.concurrent.ExecutionException;
3037

3138
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
39+
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
3240
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory;
3341
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
3442
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService;
@@ -44,7 +52,7 @@
4452
import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
4553
import org.junit.Assert;
4654
import org.junit.Before;
47-
//import org.junit.Test;
55+
import org.junit.Test;
4856
import org.junit.runner.RunWith;
4957
import org.mockito.InjectMocks;
5058
import org.mockito.Mock;
@@ -61,23 +69,17 @@
6169
import com.cloud.event.UsageEventUtils;
6270
import com.cloud.event.UsageEventVO;
6371
import com.cloud.event.dao.UsageEventDao;
72+
import com.cloud.exception.InvalidParameterValueException;
6473
import com.cloud.storage.Storage.ImageFormat;
6574
import com.cloud.storage.TemplateProfile;
6675
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
67-
import com.cloud.storage.dao.VMTemplateZoneDao;
6876
import com.cloud.storage.VMTemplateVO;
77+
import com.cloud.storage.dao.VMTemplateZoneDao;
6978
import com.cloud.user.AccountVO;
7079
import com.cloud.user.ResourceLimitService;
7180
import com.cloud.user.dao.AccountDao;
7281
import com.cloud.utils.component.ComponentContext;
7382

74-
import static org.mockito.Mockito.any;
75-
import static org.mockito.Mockito.anyLong;
76-
import static org.mockito.Mockito.when;
77-
import static org.mockito.Mockito.eq;
78-
import static org.mockito.Mockito.doAnswer;
79-
import static org.mockito.Mockito.mock;
80-
8183
@RunWith(PowerMockRunner.class)
8284
@PrepareForTest(ComponentContext.class)
8385
public class HypervisorTemplateAdapterTest {
@@ -118,6 +120,9 @@ public class HypervisorTemplateAdapterTest {
118120
@Mock
119121
ConfigurationDao _configDao;
120122

123+
@Mock
124+
DataStoreManager storeMgr;
125+
121126
@InjectMocks
122127
HypervisorTemplateAdapter _adapter;
123128

@@ -282,4 +287,27 @@ public void testEmitDeleteEventUuid() throws InterruptedException, ExecutionExce
282287

283288
cleanupUsageUtils();
284289
}
290+
291+
@Test
292+
public void testCheckZoneImageStoresDirectDownloadTemplate() {
293+
VMTemplateVO templateVO = Mockito.mock(VMTemplateVO.class);
294+
Mockito.when(templateVO.isDirectDownload()).thenReturn(true);
295+
_adapter.checkZoneImageStores(templateVO, List.of(1L));
296+
}
297+
298+
@Test
299+
public void testCheckZoneImageStoresRegularTemplateWithStore() {
300+
VMTemplateVO templateVO = Mockito.mock(VMTemplateVO.class);
301+
Mockito.when(templateVO.isDirectDownload()).thenReturn(false);
302+
Mockito.when(storeMgr.getImageStoresByScope(Mockito.any())).thenReturn(List.of(Mockito.mock(DataStore.class)));
303+
_adapter.checkZoneImageStores(templateVO, List.of(1L));
304+
}
305+
306+
@Test(expected = InvalidParameterValueException.class)
307+
public void testCheckZoneImageStoresRegularTemplateNoStore() {
308+
VMTemplateVO templateVO = Mockito.mock(VMTemplateVO.class);
309+
Mockito.when(templateVO.isDirectDownload()).thenReturn(false);
310+
Mockito.when(storeMgr.getImageStoresByScope(Mockito.any())).thenReturn(new ArrayList<>());
311+
_adapter.checkZoneImageStores(templateVO, List.of(1L));
312+
}
285313
}

0 commit comments

Comments
 (0)