Skip to content

Commit 138c704

Browse files
committed
filter catedories for vnf templates
Signed-off-by: Abhishek Kumar <[email protected]>
1 parent bcc64cc commit 138c704

File tree

10 files changed

+64
-24
lines changed

10 files changed

+64
-24
lines changed

api/src/main/java/org/apache/cloudstack/api/command/user/guest/ListGuestOsCategoriesCmd.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,15 @@ public class ListGuestOsCategoriesCmd extends BaseListCmd {
5555

5656
@Parameter(name = ApiConstants.IS_ISO,
5757
type = CommandType.BOOLEAN,
58-
description = "List OS categories types for which an ISO is available",
58+
description = "List OS categories for which an ISO is available",
5959
since = "4.20.1")
6060
private Boolean iso;
6161

62+
@Parameter(name = ApiConstants.IS_VNF, type = CommandType.BOOLEAN,
63+
description = "List OS categories for which a VNF template is available",
64+
since = "4.21.0")
65+
private Boolean vnf;
66+
6267
@Parameter(name = ApiConstants.ZONE_ID,
6368
type = CommandType.UUID,
6469
entityType = ZoneResponse.class,
@@ -92,6 +97,10 @@ public Boolean isIso() {
9297
return iso;
9398
}
9499

100+
public Boolean isVnf() {
101+
return vnf;
102+
}
103+
95104
public Long getZoneId() {
96105
return zoneId;
97106
}

api/src/test/java/org/apache/cloudstack/api/command/user/guest/ListGuestOsCategoriesCmdTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,16 @@ public void testIsIso() {
4747
Assert.assertTrue(cmd.isIso());
4848
}
4949

50+
@Test
51+
public void testIsVnf() {
52+
ListGuestOsCategoriesCmd cmd = new ListGuestOsCategoriesCmd();
53+
Assert.assertNull(cmd.isVnf());
54+
ReflectionTestUtils.setField(cmd, "vnf", false);
55+
Assert.assertFalse(cmd.isVnf());
56+
ReflectionTestUtils.setField(cmd, "vnf", true);
57+
Assert.assertTrue(cmd.isVnf());
58+
}
59+
5060
@Test
5161
public void testGetZoneId() {
5262
ListGuestOsCategoriesCmd cmd = new ListGuestOsCategoriesCmd();

engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDao.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public interface VMTemplateDao extends GenericDao<VMTemplateVO, Long>, StateDao<
5858

5959
public List<VMTemplateVO> listInZoneByState(long dataCenterId, VirtualMachineTemplate.State... states);
6060

61-
public List<Long> listTemplateIsoByArchAndZone(Long dataCenterId, CPU.CPUArch arch, Boolean isIso);
61+
public List<Long> listTemplateIsoByArchVnfAndZone(Long dataCenterId, CPU.CPUArch arch, Boolean isIso, Boolean isVnf);
6262

6363
public List<VMTemplateVO> listAllActive();
6464

engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDaoImpl.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,8 @@ public List<VMTemplateVO> listInZoneByState(long dataCenterId, VirtualMachineTem
522522
}
523523

524524
@Override
525-
public List<Long> listTemplateIsoByArchAndZone(Long dataCenterId, CPU.CPUArch arch, Boolean isIso) {
525+
public List<Long> listTemplateIsoByArchVnfAndZone(Long dataCenterId, CPU.CPUArch arch, Boolean isIso,
526+
Boolean isVnf) {
526527
GenericSearchBuilder<VMTemplateVO, Long> sb = createSearchBuilder(Long.class);
527528
sb.select(null, Func.DISTINCT, sb.entity().getGuestOSId());
528529
sb.and("state", sb.entity().getState(), SearchCriteria.Op.IN);
@@ -535,12 +536,19 @@ public List<Long> listTemplateIsoByArchAndZone(Long dataCenterId, CPU.CPUArch ar
535536
SearchBuilder<VMTemplateZoneVO> templateZoneSearch = _templateZoneDao.createSearchBuilder();
536537
templateZoneSearch.and("removed", templateZoneSearch.entity().getRemoved(), SearchCriteria.Op.NULL);
537538
templateZoneSearch.and("zoneId", templateZoneSearch.entity().getZoneId(), SearchCriteria.Op.EQ);
538-
sb.join("templateZoneSearch", templateZoneSearch, templateZoneSearch.entity().getTemplateId(), sb.entity().getId(), JoinBuilder.JoinType.INNER);
539+
sb.join("templateZoneSearch", templateZoneSearch, templateZoneSearch.entity().getTemplateId(),
540+
sb.entity().getId(), JoinBuilder.JoinType.INNER);
539541
templateZoneSearch.done();
540542
}
541543
sb.done();
542544
SearchCriteria<Long> sc = sb.create();
543-
List<TemplateType> types = Arrays.asList(TemplateType.USER, TemplateType.BUILTIN, TemplateType.PERHOST);
545+
List<TemplateType> types = new ArrayList<>(Arrays.asList(TemplateType.USER, TemplateType.BUILTIN,
546+
TemplateType.PERHOST));
547+
if (isVnf == null) {
548+
types.add(TemplateType.VNF);
549+
} else if (isVnf) {
550+
types = Collections.singletonList(TemplateType.VNF);
551+
}
544552
sc.setParameters("type", types.toArray());
545553
sc.setParameters("state", VirtualMachineTemplate.State.Active);
546554
if (dataCenterId != null) {

engine/schema/src/test/java/com/cloud/storage/dao/VMTemplateDaoImplTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ public void testListTemplateIsoByArchAndZone_WithDataCenterId() {
217217
when(searchBuilder.create()).thenReturn(searchCriteria);
218218
mockTemplateZoneJoin();
219219
doReturn(new ArrayList<>()).when(templateDao).customSearch(searchCriteria, null);
220-
List<Long> result = templateDao.listTemplateIsoByArchAndZone(dataCenterId, arch, isIso);
220+
List<Long> result = templateDao.listTemplateIsoByArchVnfAndZone(dataCenterId, arch, isIso, false);
221221
assertNotNull(result);
222222
verify(searchBuilder, times(1)).select(null, SearchCriteria.Func.DISTINCT, templateVO.getGuestOSId());
223223
verify(searchBuilder, times(1)).and(eq("state"), any(), eq(SearchCriteria.Op.IN));
@@ -240,7 +240,7 @@ public void testListTemplateIsoByArchAndZone_WithoutDataCenterId() {
240240
when(templateDao.createSearchBuilder(Long.class)).thenReturn(searchBuilder);
241241
when(searchBuilder.create()).thenReturn(searchCriteria);
242242
doReturn(new ArrayList<>()).when(templateDao).customSearch(searchCriteria, null);
243-
List<Long> result = templateDao.listTemplateIsoByArchAndZone(dataCenterId, arch, isIso);
243+
List<Long> result = templateDao.listTemplateIsoByArchVnfAndZone(dataCenterId, arch, isIso, false);
244244
assertNotNull(result);
245245
verify(searchBuilder, times(1)).select(null, SearchCriteria.Func.DISTINCT, templateVO.getGuestOSId());
246246
verify(searchBuilder, times(1)).and(eq("state"), any(), eq(SearchCriteria.Op.IN));
@@ -264,7 +264,7 @@ public void testListTemplateIsoByArchAndZone_WithoutArch() {
264264
when(searchBuilder.create()).thenReturn(searchCriteria);
265265
mockTemplateZoneJoin();
266266
doReturn(new ArrayList<>()).when(templateDao).customSearch(searchCriteria, null);
267-
List<Long> result = templateDao.listTemplateIsoByArchAndZone(dataCenterId, arch, isIso);
267+
List<Long> result = templateDao.listTemplateIsoByArchVnfAndZone(dataCenterId, arch, isIso, false);
268268
assertNotNull(result);
269269
verify(searchBuilder, times(1)).select(null, SearchCriteria.Func.DISTINCT, templateVO.getGuestOSId());
270270
verify(searchBuilder, times(1)).and(eq("state"), any(), eq(SearchCriteria.Op.IN));
@@ -288,7 +288,7 @@ public void testListTemplateIsoByArchAndZone_WithoutIsIso() {
288288
when(searchBuilder.create()).thenReturn(searchCriteria);
289289
mockTemplateZoneJoin();
290290
doReturn(new ArrayList<>()).when(templateDao).customSearch(searchCriteria, null);
291-
List<Long> result = templateDao.listTemplateIsoByArchAndZone(dataCenterId, arch, isIso);
291+
List<Long> result = templateDao.listTemplateIsoByArchVnfAndZone(dataCenterId, arch, isIso, false);
292292
assertNotNull(result);
293293
verify(searchBuilder, times(1)).select(null, SearchCriteria.Func.DISTINCT, templateVO.getGuestOSId());
294294
verify(searchBuilder, times(1)).and(eq("state"), any(), eq(SearchCriteria.Op.IN));

server/src/main/java/com/cloud/server/ManagementServerImpl.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2735,16 +2735,17 @@ public Pair<List<? extends GuestOsCategory>, Integer> listGuestOSCategoriesByCri
27352735
final String name = cmd.getName();
27362736
final String keyword = cmd.getKeyword();
27372737
final Boolean featured = cmd.isFeatured();
2738+
final Boolean isIso = cmd.isIso();
2739+
final Boolean isVnf = cmd.isVnf();
27382740
final Long zoneId = cmd.getZoneId();
27392741
final CPU.CPUArch arch = cmd.getArch();
2740-
final Boolean isIso = cmd.isIso();
27412742

27422743
final SearchBuilder<GuestOSCategoryVO> sb = _guestOSCategoryDao.createSearchBuilder();
27432744
sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
27442745
sb.and("name", sb.entity().getId(), SearchCriteria.Op.LIKE);
27452746
sb.and("keyword", sb.entity().getId(), SearchCriteria.Op.LIKE);
27462747
sb.and("featured", sb.entity().isFeatured(), SearchCriteria.Op.EQ);
2747-
if (ObjectUtils.anyNotNull(zoneId, arch, isIso)) {
2748+
if (ObjectUtils.anyNotNull(zoneId, arch, isIso, isVnf)) {
27482749
final SearchBuilder<GuestOSVO> guestOsSearch = _guestOSDao.createSearchBuilder();
27492750
guestOsSearch.and("ids", guestOsSearch.entity().getId(), SearchCriteria.Op.IN);
27502751
sb.join("guestOsSearch", guestOsSearch, guestOsSearch.entity().getCategoryId(), sb.entity().getId(),
@@ -2766,8 +2767,8 @@ public Pair<List<? extends GuestOsCategory>, Integer> listGuestOSCategoriesByCri
27662767
if (featured != null) {
27672768
sc.setParameters("featured", featured);
27682769
}
2769-
if (ObjectUtils.anyNotNull(zoneId, arch, isIso)) {
2770-
List<Long> guestOsIds = templateDao.listTemplateIsoByArchAndZone(zoneId, arch, isIso);
2770+
if (ObjectUtils.anyNotNull(zoneId, arch, isIso, isVnf)) {
2771+
List<Long> guestOsIds = templateDao.listTemplateIsoByArchVnfAndZone(zoneId, arch, isIso, isVnf);
27712772
if (CollectionUtils.isEmpty(guestOsIds)) {
27722773
return new Pair<>(Collections.emptyList(), 0);
27732774
}

server/src/test/java/com/cloud/server/ManagementServerImplTest.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -841,19 +841,21 @@ public void testListGuestOSCategoriesByCriteria_Success() {
841841
Long zoneId = 1L;
842842
CPU.CPUArch arch = CPU.CPUArch.getDefault();
843843
Boolean isIso = true;
844+
Boolean isVnf = false;
844845
Mockito.when(listCmd.getId()).thenReturn(id);
845846
Mockito.when(listCmd.getName()).thenReturn(name);
846847
Mockito.when(listCmd.getKeyword()).thenReturn(keyword);
847848
Mockito.when(listCmd.isFeatured()).thenReturn(featured);
848849
Mockito.when(listCmd.getZoneId()).thenReturn(zoneId);
849850
Mockito.when(listCmd.getArch()).thenReturn(arch);
850851
Mockito.when(listCmd.isIso()).thenReturn(isIso);
852+
Mockito.when(listCmd.isVnf()).thenReturn(isVnf);
851853
SearchBuilder<GuestOSCategoryVO> searchBuilder = Mockito.mock(SearchBuilder.class);
852854
Mockito.when(searchBuilder.entity()).thenReturn(guestOSCategory);
853855
SearchCriteria<GuestOSCategoryVO> searchCriteria = Mockito.mock(SearchCriteria.class);
854856
Mockito.when(guestOSCategoryDao.createSearchBuilder()).thenReturn(searchBuilder);
855857
Mockito.when(searchBuilder.create()).thenReturn(searchCriteria);
856-
Mockito.when(templateDao.listTemplateIsoByArchAndZone(zoneId, arch, isIso)).thenReturn(Arrays.asList(1L, 2L));
858+
Mockito.when(templateDao.listTemplateIsoByArchVnfAndZone(zoneId, arch, isIso, isVnf)).thenReturn(Arrays.asList(1L, 2L));
857859
Pair<List<GuestOSCategoryVO>, Integer> mockResult = new Pair<>(Arrays.asList(guestOSCategory), 1);
858860
mockGuestOsJoin();
859861
Mockito.when(guestOSCategoryDao.searchAndCount(Mockito.eq(searchCriteria), Mockito.any())).thenReturn(mockResult);
@@ -862,7 +864,7 @@ public void testListGuestOSCategoriesByCriteria_Success() {
862864
Assert.assertEquals(1, result.second().intValue());
863865
Assert.assertEquals(1, result.first().size());
864866
Mockito.verify(guestOSCategoryDao, Mockito.times(1)).createSearchBuilder();
865-
Mockito.verify(templateDao, Mockito.times(1)).listTemplateIsoByArchAndZone(zoneId, arch, isIso);
867+
Mockito.verify(templateDao, Mockito.times(1)).listTemplateIsoByArchVnfAndZone(zoneId, arch, isIso, isVnf);
866868
Mockito.verify(guestOSCategoryDao, Mockito.times(1)).searchAndCount(Mockito.eq(searchCriteria), Mockito.any());
867869
}
868870

@@ -877,19 +879,21 @@ public void testListGuestOSCategoriesByCriteria_NoResults() {
877879
Long zoneId = 1L;
878880
CPU.CPUArch arch = CPU.CPUArch.getDefault();
879881
Boolean isIso = false;
882+
Boolean isVnf = false;
880883
Mockito.when(listCmd.getId()).thenReturn(id);
881884
Mockito.when(listCmd.getName()).thenReturn(name);
882885
Mockito.when(listCmd.getKeyword()).thenReturn(keyword);
883886
Mockito.when(listCmd.isFeatured()).thenReturn(featured);
884887
Mockito.when(listCmd.getZoneId()).thenReturn(zoneId);
885888
Mockito.when(listCmd.getArch()).thenReturn(arch);
886889
Mockito.when(listCmd.isIso()).thenReturn(isIso);
890+
Mockito.when(listCmd.isVnf()).thenReturn(isVnf);
887891
SearchBuilder<GuestOSCategoryVO> searchBuilder = Mockito.mock(SearchBuilder.class);
888892
Mockito.when(searchBuilder.entity()).thenReturn(guestOSCategory);
889893
SearchCriteria<GuestOSCategoryVO> searchCriteria = Mockito.mock(SearchCriteria.class);
890894
Mockito.when(guestOSCategoryDao.createSearchBuilder()).thenReturn(searchBuilder);
891895
Mockito.when(searchBuilder.create()).thenReturn(searchCriteria);
892-
Mockito.when(templateDao.listTemplateIsoByArchAndZone(zoneId, arch, isIso)).thenReturn(Arrays.asList(1L, 2L));
896+
Mockito.when(templateDao.listTemplateIsoByArchVnfAndZone(zoneId, arch, isIso, isVnf)).thenReturn(Arrays.asList(1L, 2L));
893897
Pair<List<GuestOSCategoryVO>, Integer> mockResult = new Pair<>(Arrays.asList(), 0);
894898
Mockito.when(guestOSCategoryDao.searchAndCount(Mockito.eq(searchCriteria), Mockito.any())).thenReturn(mockResult);
895899
mockGuestOsJoin();
@@ -898,7 +902,7 @@ public void testListGuestOSCategoriesByCriteria_NoResults() {
898902
Assert.assertEquals(0, result.second().intValue());
899903
Assert.assertEquals(0, result.first().size());
900904
Mockito.verify(guestOSCategoryDao, Mockito.times(1)).createSearchBuilder();
901-
Mockito.verify(templateDao, Mockito.times(1)).listTemplateIsoByArchAndZone(zoneId, arch, isIso);
905+
Mockito.verify(templateDao, Mockito.times(1)).listTemplateIsoByArchVnfAndZone(zoneId, arch, isIso, isVnf);
902906
Mockito.verify(guestOSCategoryDao, Mockito.times(1)).searchAndCount(Mockito.eq(searchCriteria), Mockito.any());
903907
}
904908

@@ -913,19 +917,21 @@ public void testListGuestOSCategoriesByCriteria_NoGuestOsIdsFound() {
913917
Long zoneId = 1L;
914918
CPU.CPUArch arch = CPU.CPUArch.getDefault();
915919
Boolean isIso = true;
920+
Boolean isVnf = false;
916921
Mockito.when(listCmd.getId()).thenReturn(id);
917922
Mockito.when(listCmd.getName()).thenReturn(name);
918923
Mockito.when(listCmd.getKeyword()).thenReturn(keyword);
919924
Mockito.when(listCmd.isFeatured()).thenReturn(featured);
920925
Mockito.when(listCmd.getZoneId()).thenReturn(zoneId);
921926
Mockito.when(listCmd.getArch()).thenReturn(arch);
922927
Mockito.when(listCmd.isIso()).thenReturn(isIso);
928+
Mockito.when(listCmd.isVnf()).thenReturn(isVnf);
923929
SearchBuilder<GuestOSCategoryVO> searchBuilder = Mockito.mock(SearchBuilder.class);
924930
Mockito.when(searchBuilder.entity()).thenReturn(guestOSCategory);
925931
SearchCriteria<GuestOSCategoryVO> searchCriteria = Mockito.mock(SearchCriteria.class);
926932
Mockito.when(guestOSCategoryDao.createSearchBuilder()).thenReturn(searchBuilder);
927933
Mockito.when(searchBuilder.create()).thenReturn(searchCriteria);
928-
Mockito.when(templateDao.listTemplateIsoByArchAndZone(zoneId, arch, isIso)).thenReturn(Arrays.asList(1L, 2L));
934+
Mockito.when(templateDao.listTemplateIsoByArchVnfAndZone(zoneId, arch, isIso, isVnf)).thenReturn(Arrays.asList(1L, 2L));
929935
Pair<List<GuestOSCategoryVO>, Integer> mockResult = new Pair<>(Arrays.asList(), 0);
930936
when(guestOSCategoryDao.searchAndCount(Mockito.eq(searchCriteria), Mockito.any())).thenReturn(mockResult);
931937
mockGuestOsJoin();
@@ -934,7 +940,7 @@ public void testListGuestOSCategoriesByCriteria_NoGuestOsIdsFound() {
934940
Assert.assertEquals(0, result.second().intValue());
935941
Assert.assertEquals(0, result.first().size());
936942
Mockito.verify(guestOSCategoryDao, Mockito.times(1)).createSearchBuilder();
937-
Mockito.verify(templateDao, Mockito.times(1)).listTemplateIsoByArchAndZone(zoneId, arch, isIso);
943+
Mockito.verify(templateDao, Mockito.times(1)).listTemplateIsoByArchVnfAndZone(zoneId, arch, isIso, isVnf);
938944
Mockito.verify(guestOSCategoryDao, Mockito.times(1)).searchAndCount(Mockito.eq(searchCriteria), Mockito.any());
939945
}
940946

@@ -946,6 +952,7 @@ public void testListGuestOSCategoriesByCriteria_FilterById() {
946952
Mockito.when(listCmd.getId()).thenReturn(id);
947953
Mockito.when(listCmd.getZoneId()).thenReturn(null);
948954
Mockito.when(listCmd.isIso()).thenReturn(null);
955+
Mockito.when(listCmd.isVnf()).thenReturn(null);
949956
SearchBuilder<GuestOSCategoryVO> searchBuilder = Mockito.mock(SearchBuilder.class);
950957
Mockito.when(searchBuilder.entity()).thenReturn(guestOSCategory);
951958
SearchCriteria<GuestOSCategoryVO> searchCriteria = Mockito.mock(SearchCriteria.class);

ui/src/views/compute/CreateAutoScaleVmGroup.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1399,7 +1399,9 @@ export default {
13991399
options: {
14001400
zoneid: _.get(this.zone, 'id'),
14011401
isfeatured: true,
1402-
isiso: _.get(this.form, 'imagetype') === 'isoid'
1402+
isiso: _.get(this.form, 'imagetype') === 'isoid',
1403+
arch: this.selectedArchitecture,
1404+
isvnf: false
14031405
},
14041406
field: 'guestoscategoryid'
14051407
}

ui/src/views/compute/DeployVM.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1259,7 +1259,8 @@ export default {
12591259
zoneid: _.get(this.zone, 'id'),
12601260
isfeatured: true,
12611261
isiso: _.get(this, 'imageType') === 'isoid',
1262-
arch: this.selectedArchitecture
1262+
arch: this.selectedArchitecture,
1263+
isvnf: false
12631264
},
12641265
field: 'guestoscategoryid'
12651266
}

ui/src/views/compute/DeployVnfAppliance.vue

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1192,7 +1192,9 @@ export default {
11921192
options: {
11931193
zoneid: _.get(this.zone, 'id'),
11941194
isfeatured: true,
1195-
isiso: _.get(this.form, 'imagetype') === 'isoid'
1195+
isiso: _.get(this.form, 'imagetype') === 'isoid',
1196+
arch: this.selectedArchitecture,
1197+
isvnf: true
11961198
},
11971199
field: 'guestoscategoryid'
11981200
}
@@ -1702,7 +1704,7 @@ export default {
17021704
}
17031705
return resolve(zones)
17041706
} else if (this.queryTemplateId) {
1705-
apiName = 'listTemplates'
1707+
apiName = 'listVnfTemplates'
17061708
params.listall = true
17071709
params.templatefilter = this.isNormalAndDomainUser ? 'executable' : 'all'
17081710
params.id = this.queryTemplateId
@@ -2550,7 +2552,7 @@ export default {
25502552
delete args.featured
25512553
25522554
return new Promise((resolve, reject) => {
2553-
api('listTemplates', args).then((response) => {
2555+
api('listVnfTemplates', args).then((response) => {
25542556
resolve(response)
25552557
}).catch((reason) => {
25562558
// ToDo: Handle errors

0 commit comments

Comments
 (0)