Skip to content

Commit f7e593c

Browse files
finish updateIacTemplate API
1 parent fcff99c commit f7e593c

6 files changed

Lines changed: 65 additions & 36 deletions

File tree

engine/schema/src/main/resources/META-INF/db/schema-42100to42200.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ CREATE TABLE IF NOT EXISTS `cloud`.`iac_templates` (
4949
CREATE TABLE IF NOT EXISTS `cloud`.`iac_template_account_map` (
5050
`iac_template_id` BIGINT(20) UNSIGNED NOT NULL,
5151
`account_id` BIGINT(20) UNSIGNED NOT NULL,
52+
`is_project_account` TINYINT(1) NOT NULL,
5253
PRIMARY KEY (`iac_template_id`, `account_id`),
5354
CONSTRAINT `fk_iac_template_account_map__iac_template_id` FOREIGN KEY (`iac_template_id`) REFERENCES `iac_templates`(`id`),
5455
CONSTRAINT `fk_iac_template_account_map__account_id` FOREIGN KEY (`account_id`) REFERENCES `account`(`id`)

plugins/iac/nimble/src/main/java/org/apache/cloudstack/api/command/BaseIacTemplateRegistrationCmd.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@
2525
import org.apache.cloudstack.service.NimbleService;
2626

2727
import javax.inject.Inject;
28-
import java.util.ArrayList;
28+
import java.util.HashSet;
2929
import java.util.List;
30+
import java.util.Set;
3031

3132
public abstract class BaseIacTemplateRegistrationCmd extends BaseCmd {
3233
@Inject
@@ -66,19 +67,16 @@ public boolean isTemplateShared() {
6667
return sharedDomainIds != null || sharedAccountIds != null || sharedProjectIds != null;
6768
}
6869

69-
public List<Long> getSharedDomainIds() {
70-
return sharedDomainIds;
70+
public Set<Long> getSharedDomainIds() {
71+
return sharedDomainIds == null ? null : new HashSet<>(sharedDomainIds);
7172
}
7273

73-
public List<Long> getSharedAccountIds() {
74-
return sharedAccountIds;
74+
public Set<Long> getSharedAccountIds() {
75+
return sharedAccountIds == null ? null : new HashSet<>(sharedAccountIds);
7576
}
7677

77-
public List<Long> getSharedProjectIds() {
78-
if (sharedProjectIds == null) {
79-
return new ArrayList<>();
80-
}
81-
return sharedProjectIds;
78+
public Set<Long> getSharedProjectIds() {
79+
return sharedProjectIds == null ? null : new HashSet<>(sharedProjectIds);
8280
}
8381

8482
public Boolean isRecursiveDomains() {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,6 @@ public interface IacTemplateAccountMapDao extends GenericDao<IacTemplateAccountM
2525
List<IacTemplateAccountMapVO> listByIacTemplateId(long iacTemplateId);
2626
void removeByIacTemplateId(long iacTemplateId);
2727
void removeByAccountId(long accountId);
28+
void removeUserAccountMappingsByIacTemplateId(long iacTemplateId);
29+
void removeProjectAccountMappingsByIacTemplateId(long iacTemplateId);
2830
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,15 @@
2727
public class IacTemplateAccountMapDaoImpl extends GenericDaoBase<IacTemplateAccountMapVO, Long> implements IacTemplateAccountMapDao {
2828
private static final String IAC_TEMPLATE_ID = "iacTemplateId";
2929
private static final String ACCOUNT_ID = "accountId";
30+
private static final String IS_PROJECT_ACCOUNT = "isProjectAccount";
3031

3132
private final SearchBuilder<IacTemplateAccountMapVO> accountMappingSearch;
3233

3334
public IacTemplateAccountMapDaoImpl() {
3435
accountMappingSearch = createSearchBuilder();
3536
accountMappingSearch.and(IAC_TEMPLATE_ID, accountMappingSearch.entity().getIacTemplateId(), SearchCriteria.Op.EQ);
3637
accountMappingSearch.and(ACCOUNT_ID, accountMappingSearch.entity().getAccountId(), SearchCriteria.Op.EQ);
38+
accountMappingSearch.and(IS_PROJECT_ACCOUNT, accountMappingSearch.entity().isProjectAccount(), SearchCriteria.Op.EQ);
3739
accountMappingSearch.done();
3840
}
3941

@@ -51,6 +53,22 @@ public void removeByIacTemplateId(long iacTemplateId) {
5153
remove(searchCriteria);
5254
}
5355

56+
@Override
57+
public void removeUserAccountMappingsByIacTemplateId(long iacTemplateId) {
58+
SearchCriteria<IacTemplateAccountMapVO> searchCriteria = accountMappingSearch.create();
59+
searchCriteria.setParameters(IAC_TEMPLATE_ID, iacTemplateId);
60+
searchCriteria.setParameters(IS_PROJECT_ACCOUNT, false);
61+
remove(searchCriteria);
62+
}
63+
64+
@Override
65+
public void removeProjectAccountMappingsByIacTemplateId(long iacTemplateId) {
66+
SearchCriteria<IacTemplateAccountMapVO> searchCriteria = accountMappingSearch.create();
67+
searchCriteria.setParameters(IAC_TEMPLATE_ID, iacTemplateId);
68+
searchCriteria.setParameters(IS_PROJECT_ACCOUNT, true);
69+
remove(searchCriteria);
70+
}
71+
5472
@Override
5573
public void removeByAccountId(long accountId) {
5674
SearchCriteria<IacTemplateAccountMapVO> searchCriteria = accountMappingSearch.create();

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,16 @@ public class IacTemplateAccountMapVO {
2929
@Column(name = "account_id", nullable = false)
3030
private long accountId;
3131

32+
@Column(name = "is_project_account", nullable = false)
33+
private boolean projectAccount;
34+
3235
public IacTemplateAccountMapVO() {
3336
}
3437

35-
public IacTemplateAccountMapVO(long iacTemplateId, long accountId) {
38+
public IacTemplateAccountMapVO(long iacTemplateId, long accountId, boolean projectAccount) {
3639
this.iacTemplateId = iacTemplateId;
3740
this.accountId = accountId;
41+
this.projectAccount = projectAccount;
3842
}
3943

4044
public long getIacTemplateId() {
@@ -44,4 +48,8 @@ public long getIacTemplateId() {
4448
public long getAccountId() {
4549
return accountId;
4650
}
51+
52+
public boolean isProjectAccount() {
53+
return projectAccount;
54+
}
4755
}

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

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
import java.util.ArrayList;
6565
import java.util.List;
6666
import java.util.Map;
67+
import java.util.Set;
6768
import java.util.stream.Collectors;
6869

6970
public class NimbleManagerImpl extends ManagerBase implements NimbleService {
@@ -206,25 +207,23 @@ private IacTemplate persistIacTemplate(BaseIacTemplateRegistrationCmd cmd, Accou
206207
if (iacTemplateUpdate) {
207208
iacTemplateDomainMapDao.removeByIacTemplateId(iacTemplate.getId());
208209
}
209-
// convert to sets -> remove duplicates
210-
List<IacTemplateDomainMapVO> domainMappings = persistDomainMappings(cmd.getSharedDomainIds(), persistedTemplate.getId(), owner);
211-
persistedTemplate.setDomainMappings(domainMappings);
210+
persistDomainMappings(cmd.getSharedDomainIds(), persistedTemplate.getId(), owner);
212211
}
213212

214-
// add project flag to the iactemplatwaccountmapvo -> if not, when updating and removing only projects or accoutns, all of them will be removed
215-
if (cmd.getSharedAccountIds() != null) {
216-
if (iacTemplateUpdate) {
217-
iacTemplateAccountMapDao.removeByIacTemplateId(iacTemplate.getId());
213+
if (cmd.getSharedAccountIds() != null || cmd.getSharedProjectIds() != null) {
214+
if (iacTemplateUpdate && cmd.getSharedAccountIds() != null) {
215+
iacTemplateAccountMapDao.removeUserAccountMappingsByIacTemplateId(iacTemplate.getId());
216+
}
217+
if (iacTemplateUpdate && cmd.getSharedProjectIds() != null) {
218+
iacTemplateAccountMapDao.removeProjectAccountMappingsByIacTemplateId(iacTemplate.getId());
218219
}
219-
List<IacTemplateAccountMapVO> accountMappings = persistAccountMappings(cmd.getSharedAccountIds(), cmd.getSharedProjectIds(), persistedTemplate.getId(), owner);
220-
persistedTemplate.setAccountMappings(accountMappings);
220+
persistAccountMappings(cmd.getSharedAccountIds(), cmd.getSharedProjectIds(), persistedTemplate.getId(), owner);
221221
}
222-
return persistedTemplate;
222+
return iacTemplateDao.findById(persistedTemplate.getId());
223223
});
224224
}
225225

226-
private List<IacTemplateDomainMapVO> persistDomainMappings(List<Long> sharedDomainIds, long iacTemplateId, Account iacTemplateOwner) {
227-
List<IacTemplateDomainMapVO> domainMappings = new ArrayList<>();
226+
private void persistDomainMappings(Set<Long> sharedDomainIds, long iacTemplateId, Account iacTemplateOwner) {
228227
for (Long domainId : sharedDomainIds) {
229228
Domain domain = domainManager.getDomain(domainId);
230229
if (domain == null) {
@@ -237,36 +236,40 @@ private List<IacTemplateDomainMapVO> persistDomainMappings(List<Long> sharedDoma
237236
}
238237
IacTemplateDomainMapVO domainMapping = new IacTemplateDomainMapVO(iacTemplateId, domainId);
239238
iacTemplateDomainMapDao.persist(domainMapping);
240-
domainMappings.add(domainMapping);
241239
}
242-
return domainMappings;
243240
}
244241

245-
private List<IacTemplateAccountMapVO> persistAccountMappings(List<Long> sharedAccountIds, List<Long> sharedProjectIds, long iacTemplateId, Account iacTemplateOwner) {
246-
List<IacTemplateAccountMapVO> accountMappings = new ArrayList<>();
247-
persistAccountMappingsForAccounts(accountMappings, sharedAccountIds, iacTemplateId, iacTemplateOwner);
248-
persistAccountMappingsForProjects(accountMappings, sharedProjectIds, iacTemplateId, iacTemplateOwner);
249-
return accountMappings;
242+
private void persistAccountMappings(Set<Long> sharedAccountIds, Set<Long> sharedProjectIds, long iacTemplateId, Account iacTemplateOwner) {
243+
if (sharedAccountIds != null) {
244+
persistAccountMappingsForAccounts(sharedAccountIds, iacTemplateId, iacTemplateOwner);
245+
}
246+
if (sharedProjectIds != null) {
247+
persistAccountMappingsForProjects(sharedProjectIds, iacTemplateId, iacTemplateOwner);
248+
}
250249
}
251250

252-
private void persistAccountMappingsForAccounts(List<IacTemplateAccountMapVO> accountMappings, List<Long> sharedAccountIds, long iacTemplateId, Account iacTemplateOwner) {
251+
private void persistAccountMappingsForAccounts(Set<Long> sharedAccountIds, long iacTemplateId, Account iacTemplateOwner) {
253252
for (Long accountId : sharedAccountIds) {
254253
Account account = accountService.getActiveAccountById(accountId);
255254
if (account == null) {
256255
throw new InvalidParameterValueException(String.format("Unable to find account with ID [%s].", accountId));
257256
}
257+
258+
if (account.getId() == iacTemplateOwner.getId()) {
259+
throw new InvalidParameterValueException(String.format("Account [%s] cannot share IaC template with itself.", iacTemplateOwner.getAccountName()));
260+
}
261+
258262
try {
259263
accountService.checkAccess(iacTemplateOwner, null, false, account);
260264
} catch (PermissionDeniedException e) {
261265
throw new InvalidParameterValueException(String.format("Account [%s] does not have permission to share IaC template with account with ID [%s].", iacTemplateOwner.getAccountName(), account.getUuid()));
262266
}
263-
IacTemplateAccountMapVO accountMapping = new IacTemplateAccountMapVO(iacTemplateId, accountId);
267+
IacTemplateAccountMapVO accountMapping = new IacTemplateAccountMapVO(iacTemplateId, accountId, false);
264268
iacTemplateAccountMapDao.persist(accountMapping);
265-
accountMappings.add(accountMapping);
266269
}
267270
}
268271

269-
private void persistAccountMappingsForProjects(List<IacTemplateAccountMapVO> accountMappings, List<Long> sharedProjectIds, long iacTemplateId, Account iacTemplateOwner) {
272+
private void persistAccountMappingsForProjects(Set<Long> sharedProjectIds, long iacTemplateId, Account iacTemplateOwner) {
270273
for (Long projectId : sharedProjectIds) {
271274
Project project = projectManager.getProject(projectId);
272275
if (project == null) {
@@ -281,9 +284,8 @@ private void persistAccountMappingsForProjects(List<IacTemplateAccountMapVO> acc
281284
} catch (PermissionDeniedException e) {
282285
throw new InvalidParameterValueException(exceptionMessage);
283286
}
284-
IacTemplateAccountMapVO accountMapping = new IacTemplateAccountMapVO(iacTemplateId, project.getProjectAccountId());
287+
IacTemplateAccountMapVO accountMapping = new IacTemplateAccountMapVO(iacTemplateId, project.getProjectAccountId(), true);
285288
iacTemplateAccountMapDao.persist(accountMapping);
286-
accountMappings.add(accountMapping);
287289
}
288290
}
289291

0 commit comments

Comments
 (0)