Skip to content

Commit 21d8a11

Browse files
continue listIacTemplates API
1 parent 784d1e1 commit 21d8a11

3 files changed

Lines changed: 55 additions & 46 deletions

File tree

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020
import com.cloud.utils.db.GenericDao;
2121

2222
import java.util.List;
23+
import java.util.Set;
2324

2425
public interface IacTemplateDao extends GenericDao<IacTemplateVO, Long> {
2526
void removeByAccountId(long accountId);
2627
List<IacTemplateVO> listByAccountId(long accountId);
2728
Pair<List<IacTemplateVO>, Integer> listIacTemplates(Long id, String name, List<Long> domainIds, Long accountId,
28-
boolean showIacTemplateContent, boolean showSharedIacTemplates,
29-
String keyword, Long pageSizeVal, Long startIndex);
29+
Set<Long> sharedIacTemplateIds, String keyword, Long pageSizeVal, Long startIndex);
3030
}

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

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,17 @@
2626

2727
import javax.inject.Inject;
2828
import java.util.List;
29+
import java.util.Set;
2930

3031
@Component
3132
public class IacTemplateDaoImpl extends GenericDaoBase<IacTemplateVO, Long> implements IacTemplateDao {
3233
private static final String ID = "id";
3334
private static final String NAME = "name";
35+
private static final String NAME_LIKE_KEYWORD = "nameLikeKeyword";
36+
private static final String SHARED_IAC_TEMPLATE_IDS = "sharedIacTemplateIds";
3437
private static final String DOMAIN_IDS = "domainIds";
3538
private static final String ACCOUNT_ID = "accountId";
3639
private static final String CREATED = "created";
37-
private static final String NAME_LIKE_KEYWORD = "nameLikeKeyword";
3840

3941
@Inject
4042
private IacTemplateAccountMapDao iacTemplateAccountMapDao;
@@ -45,11 +47,26 @@ public class IacTemplateDaoImpl extends GenericDaoBase<IacTemplateVO, Long> impl
4547
private final SearchBuilder<IacTemplateVO> iacTemplatesSearch;
4648

4749
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+
*/
4862
iacTemplatesSearch = createSearchBuilder();
4963
iacTemplatesSearch.and(ID, iacTemplatesSearch.entity().getId(), SearchCriteria.Op.EQ);
5064
iacTemplatesSearch.and(NAME, iacTemplatesSearch.entity().getName(), SearchCriteria.Op.EQ);
51-
iacTemplatesSearch.and(DOMAIN_IDS, iacTemplatesSearch.entity().getDomainId(), SearchCriteria.Op.IN);
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);
5268
iacTemplatesSearch.and(ACCOUNT_ID, iacTemplatesSearch.entity().getAccountId(), SearchCriteria.Op.EQ);
69+
iacTemplatesSearch.cp().cp();
5370
iacTemplatesSearch.done();
5471
}
5572

@@ -93,18 +110,18 @@ public List<IacTemplateVO> listByAccountId(long accountId) {
93110

94111
@Override
95112
public Pair<List<IacTemplateVO>, Integer> listIacTemplates(Long id, String name, List<Long> domainIds, Long accountId,
96-
boolean showIacTemplateContent, boolean showSharedIacTemplates,
97-
String keyword, Long pageSizeVal, Long startIndex) {
113+
Set<Long> sharedIacTemplateIds, String keyword, Long pageSizeVal, Long startIndex) {
98114
SearchCriteria<IacTemplateVO> searchCriteria = iacTemplatesSearch.create();
99115
searchCriteria.setParametersIfNotNull(ID, id);
100116
searchCriteria.setParametersIfNotNull(NAME, name);
101-
searchCriteria.setParameters(DOMAIN_IDS, domainIds.toArray());
102-
searchCriteria.setParametersIfNotNull(ACCOUNT_ID, accountId);
103117
if (keyword != null) {
104118
searchCriteria.setParameters(NAME_LIKE_KEYWORD, "%" + keyword + "%");
105119
}
120+
searchCriteria.setParameters(SHARED_IAC_TEMPLATE_IDS, sharedIacTemplateIds.toArray());
121+
searchCriteria.setParameters(DOMAIN_IDS, domainIds.toArray());
122+
searchCriteria.setParametersIfNotNull(ACCOUNT_ID, accountId);
106123

107124
Filter filter = new Filter(IacTemplateVO.class, CREATED, false, startIndex, pageSizeVal);
108-
return null;
125+
return searchAndCount(searchCriteria, filter);
109126
}
110127
}

plugins/iac/nimble/src/main/java/org/apache/cloudstack/service/NimbleManagerImpl.java

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
import javax.inject.Inject;
6565
import javax.naming.ConfigurationException;
6666
import java.util.ArrayList;
67+
import java.util.HashSet;
6768
import java.util.List;
6869
import java.util.Map;
6970
import java.util.Set;
@@ -118,51 +119,33 @@ public ListResponse<IacResourceTypeResponse> listIacResourceTypes(ListIacResourc
118119
return response;
119120
}
120121

121-
/**
122-
*
123-
* ok, aqui temos vários casos possíveis
124-
* 1. Caller usuario normal
125-
* 1.1. nao especificou ACL params? forca para que retorne so seus templates
126-
* 1.2. especificou ACL params -> checagem de acesso
127-
*
128-
* SE tem acesso aos ACL params
129-
* 1. Pegar lista de domain ids (considerando recursividade)
130-
* 2. lista de contas -> tipo listconsolesessions
131-
*
132-
* SO QUE, se é para listar templates compartilhados, buscar os IDs nas tabelas auxiliares (templates compartilhados tem que ser os compartilhados com a conta definida pelos ACL params)
133-
* dominios compartilhados com o dominio e com a conta do ACL
134-
*/
135122
@Override
136123
public ListResponse<IacTemplateResponse> listIacTemplates(ListIacTemplatesCmd cmd) {
137124
Account caller = CallContext.current().getCallingAccount();
138125
long domainId = getBaseDomainIdToListIacTemplatesFrom(cmd.getDomainId(), caller);
139126
List<Long> domainIds = cmd.isRecursive() ? domainDao.getDomainAndChildrenIds(domainId) : List.of(domainId);
140127
Long accountId = getAccountIdToListIacTemplatesFor(cmd.getAccountId(), cmd.getProjectId(), caller);
128+
Set<Long> sharedIacTemplateIds = cmd.isShowSharedIacTemplates() ?
129+
getListOfSharedIacTemplatesIds(domainId, ObjectUtils.defaultIfNull(accountId, caller.getId())) : new HashSet<>();
141130

142-
List<Long> sharedIacTemplateIds = new ArrayList<>();
143-
// WHERE id = blabla AND name = blabla AND name LIKE %blabla%
144-
// AND domain_id IN (domain1, domain2, domain3) OR id IN (shareddomainid1, shareddomainid2)
145-
if (cmd.isShowSharedIacTemplates()) {
146-
sharedIacTemplateIds = getListOfSharedIacTemplatesIds(domainId, ObjectUtils.defaultIfNull(accountId, caller.getId()));
147-
}
148-
149-
iacTemplateDao.listIacTemplates(cmd.getId(), cmd.getName(), domainIds, accountId,
150-
cmd.isShowIacTemplateContent(), cmd.isShowSharedIacTemplates(), cmd.getKeyword(),
151-
cmd.getPageSizeVal(), cmd.getStartIndex());
152-
153-
return null;
131+
Pair<List<IacTemplateVO>, Integer> iacTemplates = iacTemplateDao.listIacTemplates(cmd.getId(), cmd.getName(), domainIds, accountId,
132+
sharedIacTemplateIds, cmd.getKeyword(), cmd.getPageSizeVal(), cmd.getStartIndex());
133+
List<IacTemplateResponse> iacTemplateResponses = iacTemplates.first()
134+
.stream().map(iacTemplate -> responseBuilder.createIacTemplateResponse(iacTemplate, cmd.isShowIacTemplateContent()))
135+
.collect(Collectors.toList());
136+
ListResponse<IacTemplateResponse> response = new ListResponse<>();
137+
response.setResponses(iacTemplateResponses, iacTemplates.second());
138+
return response;
154139
}
155140

156-
List<Long> getListOfSharedIacTemplatesIds(long domainId, Long accountId) {
157-
List<Long> sharedIacTemplateIds = new ArrayList<>();
158-
159-
iacTemplateAccountMapDao.listByAccountId(accountId).stream()
160-
.map(IacTemplateAccountMapVO::getIacTemplateId)
141+
Set<Long> getListOfSharedIacTemplatesIds(long domainId, Long accountId) {
142+
Set<Long> sharedIacTemplateIds = new HashSet<>();
143+
iacTemplateAccountMapDao.listByAccountId(accountId)
144+
.stream().map(IacTemplateAccountMapVO::getIacTemplateId)
161145
.forEach(sharedIacTemplateIds::add);
162-
iacTemplateDomainMapDao.listByDomainId(domainId).stream()
163-
.map(IacTemplateDomainMapVO::getIacTemplateId)
146+
iacTemplateDomainMapDao.listByDomainId(domainId)
147+
.stream().map(IacTemplateDomainMapVO::getIacTemplateId)
164148
.forEach(sharedIacTemplateIds::add);
165-
166149
return sharedIacTemplateIds;
167150
}
168151

@@ -312,7 +295,8 @@ private IacTemplate persistIacTemplate(BaseIacTemplateRegistrationCmd cmd, Accou
312295
if (iacTemplateUpdate) {
313296
iacTemplateDomainMapDao.removeByIacTemplateId(iacTemplate.getId());
314297
}
315-
persistDomainMappings(cmd.getSharedDomainIds(), persistedTemplate.getId(), owner);
298+
Set<Long> sharedDomainIds = cmd.isRecursiveDomains() ? getSharedDomainIdsRecursively(cmd.getSharedDomainIds()) : cmd.getSharedDomainIds();
299+
persistDomainMappings(sharedDomainIds, persistedTemplate.getId(), owner);
316300
}
317301

318302
if (cmd.getSharedAccountIds() != null || cmd.getSharedProjectIds() != null) {
@@ -328,6 +312,14 @@ private IacTemplate persistIacTemplate(BaseIacTemplateRegistrationCmd cmd, Accou
328312
});
329313
}
330314

315+
private Set<Long> getSharedDomainIdsRecursively(Set<Long> sharedDomainIds) {
316+
Set<Long> sharedDomainIdsRecursively = new HashSet<>();
317+
for (Long domainId : sharedDomainIds) {
318+
sharedDomainIdsRecursively.addAll(domainDao.getDomainAndChildrenIds(domainId));
319+
}
320+
return sharedDomainIdsRecursively;
321+
}
322+
331323
private void persistDomainMappings(Set<Long> sharedDomainIds, long iacTemplateId, Account iacTemplateOwner) {
332324

333325

@@ -455,8 +447,8 @@ public List<Class<?>> getCommands() {
455447
if (!NimbleServiceEnabled.value()) {
456448
return commands;
457449
}
458-
return List.of(ListIacResourceTypesCmd.class, RegisterIacTemplateCmd.class, RemoveIacTemplateCmd.class,
459-
UpdateIacTemplateCmd.class, DeployIacTemplateCmd.class);
450+
return List.of(ListIacResourceTypesCmd.class, ListIacTemplatesCmd.class, RegisterIacTemplateCmd.class,
451+
RemoveIacTemplateCmd.class, UpdateIacTemplateCmd.class, DeployIacTemplateCmd.class);
460452
}
461453

462454
@Override

0 commit comments

Comments
 (0)