Skip to content

Commit 4a121d6

Browse files
continue listIacTemplates API
1 parent 21d8a11 commit 4a121d6

6 files changed

Lines changed: 98 additions & 23 deletions

File tree

plugins/iac/nimble/src/main/java/org/apache/cloudstack/api/response/NimbleResponseBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ public IacTemplateResponse createIacTemplateResponse(IacTemplate iacTemplate, bo
6262
response.setId(iacTemplate.getUuid());
6363
response.setName(iacTemplate.getName());
6464
response.setDescription(iacTemplate.getDescription());
65-
response.setRecursiveDomains(iacTemplate.isRecursiveDomains());
6665
response.setCreated(iacTemplate.getCreated());
6766
response.setRemoved(iacTemplate.getRemoved());
6867
if (showIacTemplateContent) {
@@ -117,6 +116,7 @@ private void populateIacTemplateOwnerFields(IacTemplateResponse response, Accoun
117116

118117
private void populateIacTemplateSharedEntitiesFields(IacTemplateResponse response, IacTemplate iacTemplate, Account caller, Account owner) {
119118
if (verifyCallerAccessToIacTemplateOwner(caller, owner)) {
119+
response.setRecursiveDomains(iacTemplate.isRecursiveDomains());
120120
response.setSharedDomains(getSharedDomainResponses(iacTemplate.getDomainMappings()));
121121
Pair<List<IacTemplateResponse.SharedAccountResponse>, List<IacTemplateResponse.SharedProjectResponse>> sharedAccountAndProjectResponses = getSharedAccountAndProjectResponses(iacTemplate.getAccountMappings());
122122
response.setSharedAccounts(sharedAccountAndProjectResponses.first());

plugins/iac/nimble/src/main/java/org/apache/cloudstack/persistence/iactemplates/IacTemplateAccountMapDao.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
public interface IacTemplateAccountMapDao extends GenericDao<IacTemplateAccountMapVO, Long> {
2424

2525
List<IacTemplateAccountMapVO> listByIacTemplateId(long iacTemplateId);
26+
List<IacTemplateAccountMapVO> listByIacTemplateIds(List<Long> iacTemplateIds);
2627
List<IacTemplateAccountMapVO> listByAccountId(long accountId);
2728
void removeByIacTemplateId(long iacTemplateId);
2829
void removeByAccountId(long accountId);

plugins/iac/nimble/src/main/java/org/apache/cloudstack/persistence/iactemplates/IacTemplateAccountMapDaoImpl.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,24 +19,32 @@
1919
import com.cloud.utils.db.GenericDaoBase;
2020
import com.cloud.utils.db.SearchBuilder;
2121
import com.cloud.utils.db.SearchCriteria;
22+
import org.apache.commons.collections.CollectionUtils;
2223
import org.springframework.stereotype.Component;
2324

25+
import java.util.ArrayList;
2426
import java.util.List;
2527

2628
@Component
2729
public class IacTemplateAccountMapDaoImpl extends GenericDaoBase<IacTemplateAccountMapVO, Long> implements IacTemplateAccountMapDao {
30+
private static final String IAC_TEMPLATE_IDS = "iacTemplateIds";
2831
private static final String IAC_TEMPLATE_ID = "iacTemplateId";
2932
private static final String ACCOUNT_ID = "accountId";
3033
private static final String IS_PROJECT_ACCOUNT = "isProjectAccount";
3134

3235
private final SearchBuilder<IacTemplateAccountMapVO> accountMappingSearch;
36+
private final SearchBuilder<IacTemplateAccountMapVO> accountMappingSearchByIacTemplateIds;
3337

3438
public IacTemplateAccountMapDaoImpl() {
3539
accountMappingSearch = createSearchBuilder();
3640
accountMappingSearch.and(IAC_TEMPLATE_ID, accountMappingSearch.entity().getIacTemplateId(), SearchCriteria.Op.EQ);
3741
accountMappingSearch.and(ACCOUNT_ID, accountMappingSearch.entity().getAccountId(), SearchCriteria.Op.EQ);
3842
accountMappingSearch.and(IS_PROJECT_ACCOUNT, accountMappingSearch.entity().isProjectAccount(), SearchCriteria.Op.EQ);
3943
accountMappingSearch.done();
44+
45+
accountMappingSearchByIacTemplateIds = createSearchBuilder();
46+
accountMappingSearchByIacTemplateIds.and(IAC_TEMPLATE_IDS, accountMappingSearchByIacTemplateIds.entity().getIacTemplateId(), SearchCriteria.Op.IN);
47+
accountMappingSearchByIacTemplateIds.done();
4048
}
4149

4250
@Override
@@ -46,6 +54,17 @@ public List<IacTemplateAccountMapVO> listByIacTemplateId(long iacTemplateId) {
4654
return listBy(searchCriteria);
4755
}
4856

57+
@Override
58+
public List<IacTemplateAccountMapVO> listByIacTemplateIds(List<Long> iacTemplateIds) {
59+
if (CollectionUtils.isEmpty(iacTemplateIds)) {
60+
return new ArrayList<>();
61+
}
62+
63+
SearchCriteria<IacTemplateAccountMapVO> searchCriteria = accountMappingSearchByIacTemplateIds.create();
64+
searchCriteria.setParameters(IAC_TEMPLATE_IDS, iacTemplateIds.toArray());
65+
return listBy(searchCriteria);
66+
}
67+
4968
@Override
5069
public List<IacTemplateAccountMapVO> listByAccountId(long accountId) {
5170
SearchCriteria<IacTemplateAccountMapVO> searchCriteria = accountMappingSearch.create();

plugins/iac/nimble/src/main/java/org/apache/cloudstack/persistence/iactemplates/IacTemplateDaoImpl.java

Lines changed: 57 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,15 @@
2222
import com.cloud.utils.db.GenericDaoBase;
2323
import com.cloud.utils.db.SearchBuilder;
2424
import com.cloud.utils.db.SearchCriteria;
25+
import org.apache.commons.collections.CollectionUtils;
2526
import org.springframework.stereotype.Component;
2627

2728
import javax.inject.Inject;
29+
import java.util.ArrayList;
2830
import java.util.List;
31+
import java.util.Map;
2932
import java.util.Set;
33+
import java.util.stream.Collectors;
3034

3135
@Component
3236
public class IacTemplateDaoImpl extends GenericDaoBase<IacTemplateVO, Long> implements IacTemplateDao {
@@ -47,26 +51,8 @@ public class IacTemplateDaoImpl extends GenericDaoBase<IacTemplateVO, Long> impl
4751
private final SearchBuilder<IacTemplateVO> iacTemplatesSearch;
4852

4953
public IacTemplateDaoImpl() {
50-
/**
51-
* WHERE id = <id> AND name = <name> AND name LIKE %<keyword>%
52-
* AND (id IN (<shareddomainid1>, <shareddomainid2>) OR (domain_id IN (<domain1>, <domain2>, <domain3>) AND account_id = <account-id>)))
53-
54-
./engine/schema/src/main/java/org/apache/cloudstack/gui/theme/dao/GuiThemeDetailsDaoImpl.java: detailsDaoSearchBuilder.and().op("firstReplace", detailsDaoSearchBuilder.entity().getValue(), SearchCriteria.Op.LIKE_REPLACE);
55-
./engine/schema/src/main/java/com/cloud/gpu/dao/GpuDeviceDaoImpl.java: sb.op("cardNameKeyword", cardSb.entity().getName(), SearchCriteria.Op.LIKE);
56-
grep: ./engine/service/target/engine/WEB-INF/lib/jaxb-impl-2.3.9.jar: binary file matches
57-
./engine/schema/src/main/java/com/cloud/gpu/dao/GpuDeviceDaoImpl.java: sb.op("profileNameKeyword", profileSb.entity().getName(), SearchCriteria.Op.LIKE);
58-
./engine/schema/src/main/java/com/cloud/gpu/dao/GpuDeviceDaoImpl.java: sb.op("profileDescriptionKeyword", profileSb.entity().getDescription(), SearchCriteria.Op.LIKE);
59-
./engine/schema/src/main/java/com/cloud/gpu/dao/GpuCardDaoImpl.java: sb.op("nameKeyword", sb.entity().getName(), SearchCriteria.Op.LIKE);
60-
61-
*/
6254
iacTemplatesSearch = createSearchBuilder();
63-
iacTemplatesSearch.and(ID, iacTemplatesSearch.entity().getId(), SearchCriteria.Op.EQ);
64-
iacTemplatesSearch.and(NAME, iacTemplatesSearch.entity().getName(), SearchCriteria.Op.EQ);
65-
iacTemplatesSearch.and(NAME_LIKE_KEYWORD, iacTemplatesSearch.entity().getName(), SearchCriteria.Op.LIKE);
66-
iacTemplatesSearch.and().op(SHARED_IAC_TEMPLATE_IDS, iacTemplatesSearch.entity().getId(), SearchCriteria.Op.IN);
67-
iacTemplatesSearch.or().op(DOMAIN_IDS, iacTemplatesSearch.entity().getDomainId(), SearchCriteria.Op.IN);
6855
iacTemplatesSearch.and(ACCOUNT_ID, iacTemplatesSearch.entity().getAccountId(), SearchCriteria.Op.EQ);
69-
iacTemplatesSearch.cp().cp();
7056
iacTemplatesSearch.done();
7157
}
7258

@@ -111,17 +97,66 @@ public List<IacTemplateVO> listByAccountId(long accountId) {
11197
@Override
11298
public Pair<List<IacTemplateVO>, Integer> listIacTemplates(Long id, String name, List<Long> domainIds, Long accountId,
11399
Set<Long> sharedIacTemplateIds, String keyword, Long pageSizeVal, Long startIndex) {
114-
SearchCriteria<IacTemplateVO> searchCriteria = iacTemplatesSearch.create();
100+
boolean listSharedIacTemplates = CollectionUtils.isNotEmpty(sharedIacTemplateIds);
101+
SearchCriteria<IacTemplateVO> searchCriteria = createListIacTemplatesSearchCriteria(id, name, domainIds, accountId, sharedIacTemplateIds, keyword, listSharedIacTemplates);
102+
Filter filter = new Filter(IacTemplateVO.class, CREATED, false, startIndex, pageSizeVal);
103+
Pair<List<IacTemplateVO>, Integer> iacTemplates = searchAndCount(searchCriteria, filter);
104+
populateSharedEntitiesMappings(iacTemplates.first());
105+
return iacTemplates;
106+
}
107+
108+
private void populateSharedEntitiesMappings(List<IacTemplateVO> iacTemplates) {
109+
if (CollectionUtils.isEmpty(iacTemplates)) {
110+
return;
111+
}
112+
113+
List<Long> iacTemplateIds = iacTemplates.stream().map(IacTemplateVO::getId).collect(Collectors.toList());
114+
Map<Long, List<IacTemplateAccountMapVO>> accountMappings = iacTemplateAccountMapDao.listByIacTemplateIds(iacTemplateIds)
115+
.stream().collect(Collectors.groupingBy(IacTemplateAccountMapVO::getIacTemplateId));
116+
Map<Long, List<IacTemplateDomainMapVO>> domainMappings = iacTemplateDomainMapDao.listByIacTemplateIds(iacTemplateIds)
117+
.stream().collect(Collectors.groupingBy(IacTemplateDomainMapVO::getIacTemplateId));
118+
119+
for (IacTemplateVO iacTemplate : iacTemplates) {
120+
iacTemplate.setAccountMappings(accountMappings.getOrDefault(iacTemplate.getId(), new ArrayList<>()));
121+
iacTemplate.setDomainMappings(domainMappings.getOrDefault(iacTemplate.getId(), new ArrayList<>()));
122+
}
123+
}
124+
125+
private SearchCriteria<IacTemplateVO> createListIacTemplatesSearchCriteria(Long id, String name, List<Long> domainIds, Long accountId,
126+
Set<Long> sharedIacTemplateIds, String keyword, boolean listSharedIacTemplates) {
127+
SearchCriteria<IacTemplateVO> searchCriteria = createListIacTemplatesSearchBuilder(listSharedIacTemplates).create();
128+
115129
searchCriteria.setParametersIfNotNull(ID, id);
116130
searchCriteria.setParametersIfNotNull(NAME, name);
117131
if (keyword != null) {
118132
searchCriteria.setParameters(NAME_LIKE_KEYWORD, "%" + keyword + "%");
119133
}
120-
searchCriteria.setParameters(SHARED_IAC_TEMPLATE_IDS, sharedIacTemplateIds.toArray());
134+
if (listSharedIacTemplates) {
135+
searchCriteria.setParameters(SHARED_IAC_TEMPLATE_IDS, sharedIacTemplateIds.toArray());
136+
}
121137
searchCriteria.setParameters(DOMAIN_IDS, domainIds.toArray());
122138
searchCriteria.setParametersIfNotNull(ACCOUNT_ID, accountId);
123139

124-
Filter filter = new Filter(IacTemplateVO.class, CREATED, false, startIndex, pageSizeVal);
125-
return searchAndCount(searchCriteria, filter);
140+
return searchCriteria;
141+
}
142+
143+
private SearchBuilder<IacTemplateVO> createListIacTemplatesSearchBuilder(boolean listSharedIacTemplates) {
144+
SearchBuilder<IacTemplateVO> searchBuilder = createSearchBuilder();
145+
146+
searchBuilder.and(ID, searchBuilder.entity().getId(), SearchCriteria.Op.EQ);
147+
searchBuilder.and(NAME, searchBuilder.entity().getName(), SearchCriteria.Op.EQ);
148+
searchBuilder.and(NAME_LIKE_KEYWORD, searchBuilder.entity().getName(), SearchCriteria.Op.LIKE);
149+
if (listSharedIacTemplates) {
150+
searchBuilder.and().op(SHARED_IAC_TEMPLATE_IDS, searchBuilder.entity().getId(), SearchCriteria.Op.IN);
151+
searchBuilder.or().op(DOMAIN_IDS, searchBuilder.entity().getDomainId(), SearchCriteria.Op.IN);
152+
searchBuilder.and(ACCOUNT_ID, searchBuilder.entity().getAccountId(), SearchCriteria.Op.EQ);
153+
searchBuilder.cp().cp();
154+
} else {
155+
searchBuilder.and(DOMAIN_IDS, searchBuilder.entity().getDomainId(), SearchCriteria.Op.IN);
156+
searchBuilder.and(ACCOUNT_ID, searchBuilder.entity().getAccountId(), SearchCriteria.Op.EQ);
157+
}
158+
searchBuilder.done();
159+
160+
return searchBuilder;
126161
}
127162
}

plugins/iac/nimble/src/main/java/org/apache/cloudstack/persistence/iactemplates/IacTemplateDomainMapDao.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
public interface IacTemplateDomainMapDao extends GenericDao<IacTemplateDomainMapVO, Long> {
2424
List<IacTemplateDomainMapVO> listByIacTemplateId(long iacTemplateId);
25+
List<IacTemplateDomainMapVO> listByIacTemplateIds(List<Long> iacTemplateIds);
2526
List<IacTemplateDomainMapVO> listByDomainId(long domainId);
2627
void removeByIacTemplateId(long iacTemplateId);
2728
void removeByDomainId(long domainId);

plugins/iac/nimble/src/main/java/org/apache/cloudstack/persistence/iactemplates/IacTemplateDomainMapDaoImpl.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,30 @@
1919
import com.cloud.utils.db.GenericDaoBase;
2020
import com.cloud.utils.db.SearchBuilder;
2121
import com.cloud.utils.db.SearchCriteria;
22+
import org.apache.commons.collections.CollectionUtils;
2223
import org.springframework.stereotype.Component;
2324

25+
import java.util.ArrayList;
2426
import java.util.List;
2527

2628
@Component
2729
public class IacTemplateDomainMapDaoImpl extends GenericDaoBase<IacTemplateDomainMapVO, Long> implements IacTemplateDomainMapDao {
30+
private static final String IAC_TEMPLATE_IDS = "iacTemplateIds";
2831
private static final String IAC_TEMPLATE_ID = "iacTemplateId";
2932
private static final String DOMAIN_ID = "domainId";
3033

3134
private final SearchBuilder<IacTemplateDomainMapVO> domainMappingSearch;
35+
private final SearchBuilder<IacTemplateDomainMapVO> domainMappingSearchByIacTemplateIds;
3236

3337
public IacTemplateDomainMapDaoImpl() {
3438
domainMappingSearch = createSearchBuilder();
3539
domainMappingSearch.and(IAC_TEMPLATE_ID, domainMappingSearch.entity().getIacTemplateId(), SearchCriteria.Op.EQ);
3640
domainMappingSearch.and(DOMAIN_ID, domainMappingSearch.entity().getDomainId(), SearchCriteria.Op.EQ);
3741
domainMappingSearch.done();
42+
43+
domainMappingSearchByIacTemplateIds = createSearchBuilder();
44+
domainMappingSearchByIacTemplateIds.and(IAC_TEMPLATE_IDS, domainMappingSearchByIacTemplateIds.entity().getIacTemplateId(), SearchCriteria.Op.IN);
45+
domainMappingSearchByIacTemplateIds.done();
3846
}
3947

4048
@Override
@@ -44,6 +52,17 @@ public List<IacTemplateDomainMapVO> listByIacTemplateId(long iacTemplateId) {
4452
return listBy(searchCriteria);
4553
}
4654

55+
@Override
56+
public List<IacTemplateDomainMapVO> listByIacTemplateIds(List<Long> iacTemplateIds) {
57+
if (CollectionUtils.isEmpty(iacTemplateIds)) {
58+
return new ArrayList<>();
59+
}
60+
61+
SearchCriteria<IacTemplateDomainMapVO> searchCriteria = domainMappingSearchByIacTemplateIds.create();
62+
searchCriteria.setParameters(IAC_TEMPLATE_IDS, iacTemplateIds.toArray());
63+
return listBy(searchCriteria);
64+
}
65+
4766
@Override
4867
public List<IacTemplateDomainMapVO> listByDomainId(long domainId) {
4968
SearchCriteria<IacTemplateDomainMapVO> searchCriteria = domainMappingSearch.create();

0 commit comments

Comments
 (0)