1 package org.openecomp.sdc.be.components.csar;
3 import com.google.gson.Gson;
4 import com.google.gson.JsonElement;
5 import com.google.gson.JsonObject;
7 import org.apache.commons.codec.binary.Base64;
8 import org.apache.commons.collections.CollectionUtils;
9 import org.apache.commons.lang3.tuple.ImmutablePair;
10 import org.openecomp.sdc.be.components.impl.ArtifactsBusinessLogic;
11 import org.openecomp.sdc.be.components.impl.ArtifactsBusinessLogic.ArtifactOperationEnum;
12 import org.openecomp.sdc.be.components.impl.ArtifactsBusinessLogic.ArtifactOperationInfo;
13 import org.openecomp.sdc.be.components.impl.BaseBusinessLogic;
14 import org.openecomp.sdc.be.components.impl.CsarValidationUtils;
15 import org.openecomp.sdc.be.components.impl.ImportUtils;
16 import org.openecomp.sdc.be.components.impl.ImportUtils.ResultStatusEnum;
17 import org.openecomp.sdc.be.config.BeEcompErrorManager;
18 import org.openecomp.sdc.be.config.BeEcompErrorManager.ErrorSeverity;
19 import org.openecomp.sdc.be.config.Configuration.VfModuleProperty;
20 import org.openecomp.sdc.be.config.ConfigurationManager;
21 import org.openecomp.sdc.be.dao.api.ActionStatus;
22 import org.openecomp.sdc.be.datamodel.utils.ArtifactUtils;
23 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
24 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
25 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
26 import org.openecomp.sdc.be.impl.ComponentsUtils;
27 import org.openecomp.sdc.be.info.ArtifactTemplateInfo;
28 import org.openecomp.sdc.be.info.MergedArtifactInfo;
29 import org.openecomp.sdc.be.model.*;
30 import org.openecomp.sdc.be.model.heat.HeatParameterType;
31 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
32 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
33 import org.openecomp.sdc.be.servlets.RepresentationUtils;
34 import org.openecomp.sdc.be.tosca.CsarUtils;
35 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
36 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
37 import org.openecomp.sdc.common.api.Constants;
38 import org.openecomp.sdc.common.log.wrappers.Logger;
39 import org.openecomp.sdc.common.util.GeneralUtility;
40 import org.openecomp.sdc.exception.ResponseFormat;
41 import org.springframework.beans.factory.annotation.Autowired;
44 import java.util.Map.Entry;
45 import java.util.regex.Matcher;
46 import java.util.regex.Pattern;
47 import java.util.stream.Collectors;
49 import static org.openecomp.sdc.be.tosca.CsarUtils.ARTIFACTS_PATH;
52 @org.springframework.stereotype.Component("csarArtifactsAndGroupsBusinessLogic")
53 public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
55 private static final Logger log = Logger.getLogger(CsarArtifactsAndGroupsBusinessLogic.class.getName());
56 public static final String ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMATR_FILE_NAME = "Artifact file is not in expected formatr, fileName {}";
57 public static final String ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMAT_FILE_NAME = "Artifact file is not in expected format, fileName {}";
58 public static final String ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMATR_FILE_NAME1 = "Artifact file is not in expected formatr, fileName ";
59 public static final String ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMAT_FILE_NAME1 = "Artifact file is not in expected format, fileName ";
60 public static final String ARTIFACT_INTERNALS_ARE_INVALID = "Artifact internals are invalid";
61 public static final String ARTIFACT_WITH_NAME_AND_TYPE_ALREADY_EXIST_WITH_TYPE = "Artifact with name {} and type {} already exist with type {}";
62 private final Gson gson = new Gson();
63 private static final Pattern pattern = Pattern.compile("\\..(.*?)\\..");
65 protected ArtifactsBusinessLogic artifactsBusinessLogic;
67 public Either<Resource, ResponseFormat> createResourceArtifactsFromCsar(CsarInfo csarInfo, Resource resource,
68 String artifactsMetaFile, String artifactsMetaFileName, List<ArtifactDefinition> createdArtifacts,
69 boolean shouldLock, boolean inTransaction) {
71 log.debug("parseResourceArtifactsInfoFromFile start");
72 return parseResourceArtifactsInfoFromFile(resource, artifactsMetaFile, artifactsMetaFileName)
74 .bind( p-> createResourceArtifacts(csarInfo, resource, p, createdArtifacts,shouldLock, inTransaction))
76 .map(rf -> { componentsUtils.auditResource(rf, csarInfo.getModifier(), resource, AuditingActionEnum.IMPORT_RESOURCE); return rf;})
78 .bind(this::getResourcetFromGraph);
82 public Either<Resource, ResponseFormat> updateResourceArtifactsFromCsar(CsarInfo csarInfo, Resource resource,
83 String artifactsMetaFile, String artifactsMetaFileName, List<ArtifactDefinition> createdNewArtifacts,
84 boolean shouldLock, boolean inTransaction){
86 Resource updatedResource = resource;
88 Either<Map<String, List<ArtifactTemplateInfo>>, ResponseFormat> parseResourceInfoFromYamlEither = parseResourceArtifactsInfoFromFile(
89 updatedResource, artifactsMetaFile, artifactsMetaFileName);
90 if (parseResourceInfoFromYamlEither.isRight()) {
91 ResponseFormat responseFormat = parseResourceInfoFromYamlEither.right().value();
92 componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), resource, AuditingActionEnum.IMPORT_RESOURCE);
93 return Either.right(responseFormat);
96 List<GroupDefinition> groups = updatedResource.getGroups();
97 Map<String, ArtifactDefinition> deplymentArtifact = updatedResource.getDeploymentArtifacts();
98 if (deplymentArtifact == null || deplymentArtifact.isEmpty()) {
100 List<GroupDefinition> listToDelete = groups.stream().filter(g -> g.getType().equals(Constants.DEFAULT_GROUP_VF_MODULE)).collect(Collectors.toList());
101 groupBusinessLogic.deleteGroups(updatedResource, listToDelete);
103 return createResourceArtifacts(csarInfo, updatedResource, parseResourceInfoFromYamlEither.left().value(),
104 createdNewArtifacts, shouldLock, inTransaction);
107 List<ArtifactDefinition> createdDeplymentArtifactsAfterDelete = deplymentArtifact.values().stream().collect(Collectors.toList());
109 int labelCounter = createdDeplymentArtifactsAfterDelete.size();
112 ////////////////////////////////////// create set parsed
113 ////////////////////////////////////// artifacts///////////////////////////////////////////
114 Map<String, List<ArtifactTemplateInfo>> parsedArtifactsMap = parseResourceInfoFromYamlEither.left().value();
117 List<ArtifactTemplateInfo> artifactsWithoutGroups = null;
118 if (parsedArtifactsMap.containsKey(ArtifactTemplateInfo.CSAR_ARTIFACT)) {
119 artifactsWithoutGroups = parsedArtifactsMap.get(ArtifactTemplateInfo.CSAR_ARTIFACT);
120 parsedArtifactsMap.remove(ArtifactTemplateInfo.CSAR_ARTIFACT);
122 Collection<List<ArtifactTemplateInfo>> parsedArifactsCollection = parsedArtifactsMap.values();
124 Either<Map<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>>, ResponseFormat> parsedArtifactsPerGroupEither = createArtifactsTemplateCollection(csarInfo, updatedResource, createdNewArtifacts, shouldLock, inTransaction,
125 createdDeplymentArtifactsAfterDelete, labelCounter, parsedArifactsCollection);
126 if(parsedArtifactsPerGroupEither.isRight()){
127 log.error("Failed to parse artifacts. Status is {} ", parsedArtifactsPerGroupEither.right().value());
128 return Either.right(parsedArtifactsPerGroupEither.right().value());
131 Map<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>> parsedGroup = parsedArtifactsPerGroupEither.left().value();
133 // find master in group
134 Map<GroupDefinition, Map<ArtifactDefinition, List<ArtifactDefinition>>> groupArtifact = findMasterArtifactInGroup(
135 groups, deplymentArtifact);
137 ///////////////////////////////// find artifacts to
138 ///////////////////////////////// delete////////////////////////////////////////////////////
141 Map<String, List<ArtifactDefinition>> groupToDelete = new HashMap<>();
142 Set<ArtifactDefinition> artifactsToDelete = findArtifactThatNotInGroupToDelete(parsedGroup, createdDeplymentArtifactsAfterDelete);
144 Set<ArtifactTemplateInfo> jsonMasterArtifacts = parsedGroup.keySet();
145 Map<GroupDefinition, MergedArtifactInfo> mergedgroup = mergeGroupInUpdateFlow(groupArtifact, parsedGroup,
146 artifactsToDelete, groupToDelete, jsonMasterArtifacts, createdDeplymentArtifactsAfterDelete);
148 List<ArtifactDefinition> deletedArtifacts = new ArrayList<>();;
149 Either<Resource, ResponseFormat> deletedArtifactsEither = deleteArtifactsInUpdateCsarFlow(
150 updatedResource, csarInfo.getModifier(), shouldLock, inTransaction, artifactsToDelete, groupToDelete, deletedArtifacts);
151 if (deletedArtifactsEither.isRight()) {
152 log.debug("Failed to delete artifacts. Status is {} ", deletedArtifactsEither.right().value());
154 return Either.right(deletedArtifactsEither.right().value());
157 updatedResource = deletedArtifactsEither.left().value();
159 // need to update resource if we updated artifacts
160 if (!deletedArtifacts.isEmpty()) {
161 for (ArtifactDefinition deletedArtifact : deletedArtifacts) {
162 ArtifactDefinition artToRemove = null;
163 for (ArtifactDefinition artFromResource : createdDeplymentArtifactsAfterDelete) {
164 if (deletedArtifact.getUniqueId().equalsIgnoreCase(artFromResource.getUniqueId())) {
165 artToRemove = artFromResource;
169 if (artToRemove != null) {
170 createdDeplymentArtifactsAfterDelete.remove(artToRemove);
176 ////////////// dissociate, associate or create
177 ////////////// artifacts////////////////////////////
178 Either<Resource, ResponseFormat> assDissotiateEither = associateAndDissociateArtifactsToGroup(csarInfo,
179 updatedResource, createdNewArtifacts, labelCounter, inTransaction,
180 createdDeplymentArtifactsAfterDelete, mergedgroup, deletedArtifacts);
181 groups = updatedResource.getGroups();
182 if (assDissotiateEither.isRight()) {
183 log.debug("Failed to delete artifacts. Status is {} ", assDissotiateEither.right().value());
185 return Either.right(assDissotiateEither.right().value());
188 updatedResource = assDissotiateEither.left().value();
189 deplymentArtifact = updatedResource.getDeploymentArtifacts();
190 createdDeplymentArtifactsAfterDelete.clear();
191 if (deplymentArtifact != null && !deplymentArtifact.isEmpty()) {
192 for (Entry<String, ArtifactDefinition> entry : deplymentArtifact.entrySet()) {
193 createdDeplymentArtifactsAfterDelete.add(entry.getValue());
197 // update vfModule names
198 Set<GroupDefinition> groupForAssociateWithMembers = mergedgroup.keySet();
199 if (groups != null && !groups.isEmpty()) {
200 Either<List<GroupDefinition>, ResponseFormat> validateUpdateVfGroupNamesRes = groupBusinessLogic
201 .validateUpdateVfGroupNamesOnGraph(groups, updatedResource);
202 if (validateUpdateVfGroupNamesRes.isRight()) {
203 return Either.right(validateUpdateVfGroupNamesRes.right().value());
205 List<GroupDefinition> heatGroups = null;
207 heatGroups = groups.stream().filter(e -> e.getMembers() != null).collect(Collectors.toList());
209 for (GroupDefinition updatedGroupDef : groupForAssociateWithMembers) {
211 if (updatedGroupDef.getMembers() != null && !updatedGroupDef.getMembers().isEmpty()) {
212 updatedGroupDef.getMembers().clear();
214 Map<String, String> members = new HashMap<>();
215 Set<String> artifactsGroup = new HashSet<>();
216 artifactsGroup.addAll(updatedGroupDef.getArtifacts());
217 associateMembersToArtifacts(createdNewArtifacts, createdDeplymentArtifactsAfterDelete, heatGroups,
218 artifactsGroup, members);
219 if (!members.isEmpty()) {
220 updatedGroupDef.setMembers(members);
228 //////////////// create new artifacts in update
229 //////////////// flow////////////////////////////
230 List<ArtifactTemplateInfo> newArtifactsGroup = new ArrayList<>();
232 for (Entry<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>> parsedGroupSetEntry : parsedGroup.entrySet()) {
233 ArtifactTemplateInfo parsedArtifactMaster = parsedGroupSetEntry.getKey();
234 boolean isNewGroup = true;
235 for (Entry<GroupDefinition, Map<ArtifactDefinition, List<ArtifactDefinition>>> groupListEntry : groupArtifact
237 Map<ArtifactDefinition, List<ArtifactDefinition>> groupArtifacts = groupListEntry.getValue();
238 Set<ArtifactDefinition> group = groupArtifacts.keySet();
239 for (ArtifactDefinition artifactInfo : group) {
240 if (parsedArtifactMaster.getFileName().equalsIgnoreCase(artifactInfo.getArtifactName())) {
241 parsedArtifactMaster.setGroupName(groupListEntry.getKey().getName());
247 newArtifactsGroup.add(parsedArtifactMaster);
251 if (!newArtifactsGroup.isEmpty()) {
252 Collections.sort(newArtifactsGroup, ArtifactTemplateInfo::compareByGroupName);
253 int startGroupCounter = groupBusinessLogic.getNextVfModuleNameCounter(groups);
254 Either<Boolean, ResponseFormat> validateGroupNamesRes = groupBusinessLogic
255 .validateGenerateVfModuleGroupNames(newArtifactsGroup, updatedResource.getSystemName(), startGroupCounter);
256 if (validateGroupNamesRes.isRight()) {
257 return Either.right(validateGroupNamesRes.right().value());
259 Either<Resource, ResponseFormat> resStatus = createGroupDeploymentArtifactsFromCsar(csarInfo, updatedResource,
260 newArtifactsGroup, createdNewArtifacts, createdDeplymentArtifactsAfterDelete, labelCounter,
261 shouldLock, inTransaction);
262 if (resStatus.isRight()) {
268 if (!groupForAssociateWithMembers.isEmpty()) {
270 List<GroupDefinition> groupsId = groupForAssociateWithMembers.stream().map(e -> e)
271 .collect(Collectors.toList());
273 Either<List<GroupDefinition>, ResponseFormat> updateVersionEither = groupBusinessLogic
274 .updateGroups(updatedResource, groupsId, true);
275 if (updateVersionEither.isRight()) {
276 log.debug("Failed to update groups version. Status is {} ", updateVersionEither.right().value());
278 return Either.right(updateVersionEither.right().value());
282 if (artifactsWithoutGroups != null && !artifactsWithoutGroups.isEmpty()) {
283 for (ArtifactTemplateInfo t : artifactsWithoutGroups) {
284 List<ArtifactTemplateInfo> arrtifacts = new ArrayList<>();
286 Either<Resource, ResponseFormat> resStatus = createGroupDeploymentArtifactsFromCsar(csarInfo, updatedResource,
287 arrtifacts, createdNewArtifacts, createdDeplymentArtifactsAfterDelete, labelCounter, shouldLock,
289 if (resStatus.isRight()) {
296 Either<Resource, StorageOperationStatus> eitherGerResource = toscaOperationFacade
297 .getToscaElement(updatedResource.getUniqueId());
298 if (eitherGerResource.isRight()) {
299 ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(
300 componentsUtils.convertFromStorageResponse(eitherGerResource.right().value()), updatedResource);
302 return Either.right(responseFormat);
305 return Either.left(eitherGerResource.left().value());
308 private Set<ArtifactDefinition> findArtifactThatNotInGroupToDelete(
309 Map<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>> parsedGroup,
310 List<ArtifactDefinition> createdDeplymentArtifactsAfterDelete) {
311 Set<ArtifactDefinition> artifactsToDelete = new HashSet<>();
312 for (Entry<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>> parsedGroupSetEntry : parsedGroup.entrySet()) {
313 Set<ArtifactTemplateInfo> artifactsNames = parsedGroupSetEntry.getValue();
314 for (ArtifactTemplateInfo template : artifactsNames) {
315 if(template.getType().equals(ArtifactTypeEnum.HEAT_ARTIFACT.getType())){
316 Optional<ArtifactDefinition> op = createdDeplymentArtifactsAfterDelete.stream().filter(a -> a.getArtifactName().equalsIgnoreCase(template.getFileName())).findAny();
318 if(!op.get().getArtifactType().equalsIgnoreCase(template.getType())){
319 artifactsToDelete.add(op.get());
327 return artifactsToDelete;
331 private Either<Resource, ResponseFormat> createResourceArtifacts(CsarInfo csarInfo, Resource resource,
332 Map<String, List<ArtifactTemplateInfo>> artifactsMap,
333 List<ArtifactDefinition> createdArtifacts, boolean shouldLock, boolean inTransaction) {
335 Either<Resource, ResponseFormat> resStatus = Either.left(resource);
337 Collection<List<ArtifactTemplateInfo>> arifactsCollection = artifactsMap.values();
339 for (List<ArtifactTemplateInfo> groupTemplateList : arifactsCollection) {
340 if (groupTemplateList != null) {
341 resStatus = createGroupDeploymentArtifactsFromCsar(csarInfo, resource, groupTemplateList,
342 createdArtifacts, 0, shouldLock, inTransaction);
343 if (resStatus.isRight()) {
354 private Either<Map<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>>, ResponseFormat> createArtifactsTemplateCollection(CsarInfo csarInfo, Resource resource,
355 List<ArtifactDefinition> createdNewArtifacts, boolean shouldLock, boolean inTransaction,
356 List<ArtifactDefinition> createdDeplymentArtifactsAfterDelete, int labelCounter,
357 Collection<List<ArtifactTemplateInfo>> parsedArifactsCollection) {
359 Map<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>> parsedGroup = new HashMap<>();
361 for (List<ArtifactTemplateInfo> parsedGroupTemplateList : parsedArifactsCollection) {
363 for (ArtifactTemplateInfo parsedGroupTemplate : parsedGroupTemplateList) {
364 if (parsedGroupTemplate.getGroupName() != null) {
365 parsedGroupTemplate.setGroupName("");
366 Set<ArtifactTemplateInfo> parsedArtifactsNames = new HashSet<>();
367 parsedArtifactsNames.add(parsedGroupTemplate);
368 List<ArtifactTemplateInfo> relatedGroupTemplateList = parsedGroupTemplate.getRelatedArtifactsInfo();
369 if (relatedGroupTemplateList != null && !relatedGroupTemplateList.isEmpty()) {
370 createArtifactsGroupSet(parsedGroupTemplateList, parsedArtifactsNames);
372 parsedGroup.put(parsedGroupTemplate, parsedArtifactsNames);
374 List<ArtifactTemplateInfo> arrtifacts = new ArrayList<>();
375 arrtifacts.add(parsedGroupTemplate);
376 Either<Resource, ResponseFormat> resStatus = createGroupDeploymentArtifactsFromCsar(csarInfo,
377 resource, arrtifacts, createdNewArtifacts, createdDeplymentArtifactsAfterDelete,
378 labelCounter, shouldLock, inTransaction);
379 if (resStatus.isRight()) {
380 return Either.right(resStatus.right().value());
387 return Either.left(parsedGroup);
390 @SuppressWarnings({ "unchecked", "static-access" })
391 public Either<Map<String, List<ArtifactTemplateInfo>>, ResponseFormat> parseResourceArtifactsInfoFromFile(
392 Resource resource, String artifactsMetaFile, String artifactFileName) {
395 JsonObject jsonElement = new JsonObject();
396 jsonElement = gson.fromJson(artifactsMetaFile, jsonElement.getClass());
398 JsonElement importStructureElement = jsonElement.get(Constants.IMPORT_STRUCTURE);
399 if (importStructureElement == null || importStructureElement.isJsonNull()) {
400 log.debug(ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMATR_FILE_NAME, artifactFileName);
401 BeEcompErrorManager.getInstance().logInternalDataError(
402 ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMATR_FILE_NAME1 + artifactFileName,
403 ARTIFACT_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
405 .right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, artifactFileName));
408 Map<String, List<Map<String, Object>>> artifactTemplateMap = new HashMap<>();
409 artifactTemplateMap = ComponentsUtils.parseJsonToObject(importStructureElement.toString(), HashMap.class);
410 if (artifactTemplateMap.isEmpty()) {
411 log.debug(ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMATR_FILE_NAME, artifactFileName);
412 BeEcompErrorManager.getInstance().logInternalDataError(
413 ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMATR_FILE_NAME1 + artifactFileName,
414 ARTIFACT_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
416 .right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, artifactFileName));
419 Set<String> artifactsTypeKeys = artifactTemplateMap.keySet();
420 Map<String, List<ArtifactTemplateInfo>> artifactsMap = new HashMap<>();
421 List<ArtifactTemplateInfo> allGroups = new ArrayList<>();
422 for (String artifactsTypeKey : artifactsTypeKeys) {
424 Either <List<ArtifactTemplateInfo>, ResponseFormat> artifactTemplateInfoListEither = parseArtifactTemplateList(artifactFileName,
425 artifactTemplateMap, allGroups, artifactsTypeKey);
426 if(artifactTemplateInfoListEither.isRight()){
427 return Either.right(artifactTemplateInfoListEither.right().value());
429 artifactsMap.put(artifactsTypeKey, artifactTemplateInfoListEither.left().value());
431 int counter = groupBusinessLogic.getNextVfModuleNameCounter(resource.getGroups());
432 Either<Boolean, ResponseFormat> validateGroupNamesRes = groupBusinessLogic
433 .validateGenerateVfModuleGroupNames(allGroups, resource.getSystemName(), counter);
434 if (validateGroupNamesRes.isRight()) {
435 return Either.right(validateGroupNamesRes.right().value());
437 return Either.left(artifactsMap);
438 } catch (Exception e) {
439 log.debug(ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMAT_FILE_NAME, artifactFileName);
440 log.debug("failed with exception.", e);
441 BeEcompErrorManager.getInstance().logInternalDataError(
442 ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMAT_FILE_NAME1 + artifactFileName,
443 ARTIFACT_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
444 return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, artifactFileName));
449 private Either< List<ArtifactTemplateInfo>, ResponseFormat> parseArtifactTemplateList(String artifactFileName,
450 Map<String, List<Map<String, Object>>> artifactTemplateMap, List<ArtifactTemplateInfo> allGroups,
451 String artifactsTypeKey) {
452 List<Map<String, Object>> o = artifactTemplateMap.get(artifactsTypeKey);
453 Either<List<ArtifactTemplateInfo>, ResponseFormat> artifactTemplateInfoListPairStatus = createArtifactTemplateInfoModule(
454 artifactsTypeKey, o);
455 if (artifactTemplateInfoListPairStatus.isRight()) {
456 log.debug(ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMATR_FILE_NAME, artifactFileName);
457 BeEcompErrorManager.getInstance().logInternalDataError(
458 ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMAT_FILE_NAME1 + artifactFileName,
459 ARTIFACT_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
460 return Either.right(artifactTemplateInfoListPairStatus.right().value());
462 List<ArtifactTemplateInfo> artifactTemplateInfoList = artifactTemplateInfoListPairStatus.left().value();
463 if (artifactTemplateInfoList == null) {
464 log.debug(ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMATR_FILE_NAME, artifactFileName);
465 BeEcompErrorManager.getInstance().logInternalDataError(
466 ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMAT_FILE_NAME1 + artifactFileName,
467 ARTIFACT_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
469 componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, artifactFileName));
472 if (!artifactsTypeKey.equalsIgnoreCase(ArtifactTemplateInfo.CSAR_ARTIFACT)) {
473 allGroups.addAll(artifactTemplateInfoList);
475 return Either.left(artifactTemplateInfoList);
478 private Either<List<ArtifactTemplateInfo>, ResponseFormat> createArtifactTemplateInfoModule(String artifactsTypeKey,
479 List<Map<String, Object>> jsonObject) {
480 List<ArtifactTemplateInfo> artifactTemplateInfoList = new ArrayList<>();
481 for (Map<String, Object> o : jsonObject) {
482 Either<ArtifactTemplateInfo, ResponseFormat> artifacttemplateInfoStatus = ArtifactTemplateInfo
483 .createArtifactTemplateInfoFromJson(componentsUtils, artifactsTypeKey, o, artifactTemplateInfoList,
485 if (artifacttemplateInfoStatus.isRight()) {
486 return Either.right(artifacttemplateInfoStatus.right().value());
489 ArtifactTemplateInfo artifacttemplateInfo = artifacttemplateInfoStatus.left().value();
490 if (artifacttemplateInfo != null) {
491 artifactTemplateInfoList.add(artifacttemplateInfo);
495 return Either.left(artifactTemplateInfoList);
500 private Either<Resource, ResponseFormat> createGroupDeploymentArtifactsFromCsar(CsarInfo csarInfo,
501 Resource resource, List<ArtifactTemplateInfo> artifactsTemplateList,
502 List<ArtifactDefinition> createdArtifacts, int labelCounter, boolean shouldLock, boolean inTransaction) {
503 Either<Resource, ResponseFormat> resStatus = Either.left(resource);
504 List<GroupDefinition> createdGroups = resource.getGroups();
505 List<GroupDefinition> heatGroups = null;
506 if (createdGroups != null && !createdGroups.isEmpty()) {
508 heatGroups = createdGroups.stream().filter(e -> e.getMembers() != null).collect(Collectors.toList());
511 List<GroupDefinition> needToCreate = new ArrayList<>();
512 for (ArtifactTemplateInfo groupTemplateInfo : artifactsTemplateList) {
513 String groupName = groupTemplateInfo.getGroupName();
514 Set<String> artifactsGroup = new HashSet<>();
515 Set<String> artifactsUUIDGroup = new HashSet<>();
517 log.debug("createDeploymentArtifactsFromCsar start");
518 resStatus = createDeploymentArtifactFromCsar(csarInfo, ARTIFACTS_PATH, resource, artifactsGroup,
519 artifactsUUIDGroup, groupTemplateInfo, createdArtifacts, labelCounter, shouldLock, inTransaction);
520 log.debug("createDeploymentArtifactsFromCsar end");
521 if (resStatus.isRight()) {
524 if (groupName != null && !groupName.isEmpty()) {
526 Either<GroupDefinition, ResponseFormat> groupDefinitionEither = buildGroupDefinition(createdArtifacts, heatGroups, groupTemplateInfo,
527 groupName, artifactsGroup, artifactsUUIDGroup);
528 if (groupDefinitionEither.isRight()) {
529 return Either.right(groupDefinitionEither.right().value());
531 needToCreate.add(groupDefinitionEither.left().value());
535 ComponentParametersView componentParametersView = new ComponentParametersView();
536 componentParametersView.disableAll();
537 componentParametersView.setIgnoreUsers(false);
538 componentParametersView.setIgnoreArtifacts(false);
539 componentParametersView.setIgnoreGroups(false);
541 componentParametersView.setIgnoreComponentInstances(false);
543 Either<Resource, StorageOperationStatus> component = toscaOperationFacade
544 .getToscaElement(resource.getUniqueId(), componentParametersView);
546 if (component.isRight()) {
547 return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
550 Either<List<GroupDefinition>, ResponseFormat> createGroups = groupBusinessLogic
551 .addGroups(component.left().value(), needToCreate, false);
552 if (createGroups.isRight()) {
553 return Either.right(createGroups.right().value());
556 return Either.left(component.left().value());
559 private Either<GroupDefinition, ResponseFormat> buildGroupDefinition(List<ArtifactDefinition> createdArtifacts,
560 List<GroupDefinition> heatGroups, ArtifactTemplateInfo groupTemplateInfo, String groupName,
561 Set<String> artifactsGroup, Set<String> artifactsUUIDGroup) {
563 Map<String, String> members = new HashMap<>();
565 associateMembersToArtifacts(createdArtifacts, null, heatGroups, artifactsGroup, members);
567 List<String> artifactsList = new ArrayList<>(artifactsGroup);
568 List<String> artifactsUUIDList = new ArrayList<>(artifactsUUIDGroup);
570 GroupDefinition groupDefinition = new GroupDefinition();
571 groupDefinition.setName(groupName);
572 groupDefinition.setType(Constants.DEFAULT_GROUP_VF_MODULE);
573 groupDefinition.setArtifacts(artifactsList);
574 groupDefinition.setArtifactsUuid(artifactsUUIDList);
576 if (!members.isEmpty()) {
577 groupDefinition.setMembers(members);
579 List<GroupProperty> properties = new ArrayList<>();
580 GroupProperty prop = new GroupProperty();
581 prop.setName(Constants.IS_BASE);
582 prop.setValue(Boolean.toString(groupTemplateInfo.isBase()));
583 properties.add(prop);
584 Either<GroupTypeDefinition, StorageOperationStatus> getLatestGroupTypeRes = groupTypeOperation
585 .getLatestGroupTypeByType(Constants.DEFAULT_GROUP_VF_MODULE, true);
586 if (getLatestGroupTypeRes.isRight()) {
587 return Either.right(componentsUtils.getResponseFormat(
588 componentsUtils.convertFromStorageResponse(getLatestGroupTypeRes.right().value())));
590 properties = createVfModuleAdditionalProperties(groupTemplateInfo.isBase(), groupName, properties,
591 createdArtifacts, artifactsList, getLatestGroupTypeRes.left().value());
592 groupDefinition.convertFromGroupProperties(properties);
593 log.debug("createGroup start");
594 return Either.left(groupDefinition);
597 private Either<Resource, ResponseFormat> createDeploymentArtifactFromCsar(CsarInfo csarInfo, String artifactPath,
598 Resource resource, Set<String> artifactsGroup, Set<String> artifactsUUIDGroup,
599 ArtifactTemplateInfo artifactTemplateInfo, List<ArtifactDefinition> createdArtifacts, int labelCounter,
600 boolean shoudLock, boolean inTransaction) {
601 Either<Resource, ResponseFormat> resStatus = Either.left(resource);
603 String artifactUid = "";
604 String artifactEnvUid = "";
605 String artifactUUID = "";
608 // check if artifacts already exist
609 Either<ArtifactDefinition, ResponseFormat> createdArtifactEther = checkIfArtifactAlreadyExist(artifactTemplateInfo, createdArtifacts);
610 if(createdArtifactEther.isRight()){
611 return Either.right(createdArtifactEther.right().value());
613 ArtifactDefinition createdArtifact = createdArtifactEther.left().value();
614 if(createdArtifact == null){
616 Either<ArtifactDefinition, ResponseFormat> newArtifactEither = createDeploymentArtifact(csarInfo, resource,
617 artifactPath, artifactTemplateInfo, createdArtifacts, labelCounter);
618 if (newArtifactEither.isRight()) {
619 resStatus = Either.right(newArtifactEither.right().value());
622 ArtifactDefinition newArtifact = newArtifactEither.left().value();
623 artifactUid = newArtifact.getUniqueId();
624 artifactUUID = newArtifact.getArtifactUUID();
626 ArtifactTypeEnum artifactType = ArtifactTypeEnum.findType(newArtifact.getArtifactType());
627 if (artifactType == ArtifactTypeEnum.HEAT || artifactType == ArtifactTypeEnum.HEAT_NET
628 || artifactType == ArtifactTypeEnum.HEAT_VOL) {
629 Either<ArtifactDefinition, ResponseFormat> createHeatEnvPlaceHolder = artifactsBusinessLogic
630 .createHeatEnvPlaceHolder(newArtifact, ArtifactsBusinessLogic.HEAT_VF_ENV_NAME,
631 resource.getUniqueId(), NodeTypeEnum.Resource, resource.getName(),
632 csarInfo.getModifier(), resource, null);
633 if (createHeatEnvPlaceHolder.isRight()) {
634 return Either.right(createHeatEnvPlaceHolder.right().value());
636 artifactEnvUid = createHeatEnvPlaceHolder.left().value().getUniqueId();
639 artifactUid = createdArtifact.getUniqueId();
640 artifactUUID = createdArtifact.getArtifactUUID();
641 artifactEnvUid = checkAndGetHeatEnvId(createdArtifact);
643 artifactsGroup.add(artifactUid);
644 artifactsUUIDGroup.add(artifactUUID);
645 if (!artifactEnvUid.isEmpty()) {
646 artifactsGroup.add(artifactEnvUid);
649 List<ArtifactTemplateInfo> relatedArtifacts = artifactTemplateInfo.getRelatedArtifactsInfo();
650 if (relatedArtifacts != null) {
651 for (ArtifactTemplateInfo relatedArtifactTemplateInfo : relatedArtifacts) {
652 resStatus = createDeploymentArtifactFromCsar(csarInfo, artifactPath, resource, artifactsGroup,
653 artifactsUUIDGroup, relatedArtifactTemplateInfo, createdArtifacts, labelCounter, shoudLock,
655 if (resStatus.isRight()) {
663 private String checkAndGetHeatEnvId(ArtifactDefinition createdArtifact) {
664 String artifactEnvUid = "";
665 ArtifactTypeEnum artifactType = ArtifactTypeEnum.findType(createdArtifact.getArtifactType());
666 if (artifactType == ArtifactTypeEnum.HEAT || artifactType == ArtifactTypeEnum.HEAT_NET
667 || artifactType == ArtifactTypeEnum.HEAT_VOL) {
668 artifactEnvUid = createdArtifact.getUniqueId() + ArtifactsBusinessLogic.HEAT_ENV_SUFFIX;
670 return artifactEnvUid;
673 private Either<ArtifactDefinition, ResponseFormat> checkIfArtifactAlreadyExist(ArtifactTemplateInfo artifactTemplateInfo, List<ArtifactDefinition> createdArtifacts){
675 ArtifactDefinition res = null;
676 String artifactFileName = artifactTemplateInfo.getFileName();
677 Optional<ArtifactDefinition> op = createdArtifacts.stream().filter(a -> a.getArtifactName().equals(artifactFileName)).findAny();
680 if (!res.getArtifactType().equalsIgnoreCase(artifactTemplateInfo.getType())) {
681 log.debug(ARTIFACT_WITH_NAME_AND_TYPE_ALREADY_EXIST_WITH_TYPE, artifactFileName,
682 artifactTemplateInfo.getType(), res.getArtifactType());
683 BeEcompErrorManager.getInstance().logInternalDataError(
684 ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMATR_FILE_NAME1 + artifactFileName,
685 ARTIFACT_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
686 return Either.right(componentsUtils.getResponseFormat(
687 ActionStatus.ARTIFACT_ALREADY_EXIST_IN_DIFFERENT_TYPE_IN_CSAR, artifactFileName,
688 artifactTemplateInfo.getType(), res.getArtifactType()));
691 return Either.left(res);
696 private Either<ArtifactDefinition, ResponseFormat> createDeploymentArtifact(CsarInfo csarInfo, Resource resource,
697 String artifactPath, ArtifactTemplateInfo artifactTemplateInfo, List<ArtifactDefinition> createdArtifacts,
699 int updatedlabel = label;
700 final String artifactFileName = artifactTemplateInfo.getFileName();
701 Either<ImmutablePair<String, byte[]>, ResponseFormat> artifactContententStatus = CsarValidationUtils
702 .getArtifactsContent(csarInfo.getCsarUUID(), csarInfo.getCsar(), artifactPath + artifactFileName,
703 artifactFileName, componentsUtils);
704 if (artifactContententStatus.isRight()) {
705 return Either.right(artifactContententStatus.right().value());
707 updatedlabel += createdArtifacts.size();
709 Map<String, Object> json = ArtifactUtils.buildJsonForArtifact(artifactTemplateInfo,
710 artifactContententStatus.left().value().getValue(), updatedlabel, true);
712 Either<Either<ArtifactDefinition, Operation>, ResponseFormat> uploadArtifactToService = createOrUpdateCsarArtifactFromJson(
713 resource, csarInfo.getModifier(), json,
714 artifactsBusinessLogic.new ArtifactOperationInfo(false, false, ArtifactOperationEnum.CREATE));
716 if (uploadArtifactToService.isRight()) {
717 return Either.right(uploadArtifactToService.right().value());
720 ArtifactDefinition currentInfo = uploadArtifactToService.left().value().left().value();
721 if (currentInfo.getHeatParameters() != null) {
723 Either<ArtifactDefinition, ResponseFormat> updateEnvEither = updateHeatParamsFromCsar(resource, csarInfo,
724 artifactTemplateInfo, currentInfo, false);
725 if (updateEnvEither.isRight()) {
726 log.debug("failed to update parameters to artifact {}", artifactFileName);
727 return Either.right(updateEnvEither.right().value());
730 currentInfo = updateEnvEither.left().value();
734 createdArtifacts.add(currentInfo);
736 return Either.left(currentInfo);
742 private Either<ArtifactDefinition, ResponseFormat> updateHeatParamsFromCsar(Resource resource, CsarInfo csarInfo,
743 ArtifactTemplateInfo artifactTemplateInfo, ArtifactDefinition currentInfo, boolean isUpdateEnv) {
745 Resource updatedResource = resource;
746 Either<ArtifactDefinition, ResponseFormat> resStatus = Either.left(currentInfo);
747 if (artifactTemplateInfo.getEnv() != null && !artifactTemplateInfo.getEnv().isEmpty()) {
749 Either<ImmutablePair<String, byte[]>, ResponseFormat> artifactparamsStatus = CsarValidationUtils
750 .getArtifactsContent(csarInfo.getCsarUUID(), csarInfo.getCsar(),
751 CsarUtils.ARTIFACTS_PATH + artifactTemplateInfo.getEnv(), artifactTemplateInfo.getEnv(),
753 if (artifactparamsStatus.isRight()) {
754 resStatus = Either.right(artifactparamsStatus.right().value());
757 Either<List<HeatParameterDefinition>, ResponseFormat> propsStatus = extractHeatParameters(
758 ArtifactTypeEnum.HEAT_ENV.getType(), artifactTemplateInfo.getEnv(),
759 artifactparamsStatus.left().value().getValue(), false);
761 if (propsStatus.isLeft()) {
762 List<HeatParameterDefinition> updatedHeatEnvParams = propsStatus.left().value();
763 resStatus = updateHeatParams(updatedResource, currentInfo, updatedHeatEnvParams);
764 if (resStatus.isRight()) {
771 ComponentParametersView parametersView = new ComponentParametersView();
772 parametersView.disableAll();
773 parametersView.setIgnoreComponentInstances(false);
774 parametersView.setIgnoreUsers(false);
775 parametersView.setIgnoreArtifacts(false);
776 parametersView.setIgnoreGroups(false);
778 Either<Resource, StorageOperationStatus> eitherGerResource = toscaOperationFacade
779 .getToscaElement(updatedResource.getUniqueId(), parametersView);
781 if (eitherGerResource.isRight()) {
782 ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(
783 componentsUtils.convertFromStorageResponse(eitherGerResource.right().value()), updatedResource);
785 resStatus = Either.right(responseFormat);
790 updatedResource = eitherGerResource.left().value();
791 Map<String, ArtifactDefinition> artifacts = updatedResource.getDeploymentArtifacts();
792 Optional<ArtifactDefinition> op = artifacts.values().stream().filter(
793 p -> p.getGeneratedFromId() != null && p.getGeneratedFromId().equals(currentInfo.getUniqueId()))
795 if (op.isPresent()) {
796 ArtifactDefinition artifactInfoHeatEnv = op.get();
797 Either<ArtifactDefinition, StorageOperationStatus> updateArifactOnResource = artifactToscaOperation
798 .updateArtifactOnResource(artifactInfoHeatEnv, updatedResource.getUniqueId(),
799 artifactInfoHeatEnv.getUniqueId(), null, null);
800 if (updateArifactOnResource.isRight()) {
801 log.debug("Failed to update heat env on CSAR flow for component {} artifact {} label {}",
802 updatedResource.getUniqueId(), artifactInfoHeatEnv.getUniqueId(),
803 artifactInfoHeatEnv.getArtifactLabel());
804 return Either.right(componentsUtils.getResponseFormat(
805 componentsUtils.convertFromStorageResponse(updateArifactOnResource.right().value())));
807 resStatus = Either.left(updateArifactOnResource.left().value());
813 private Either<List<HeatParameterDefinition>, ResponseFormat> extractHeatParameters(String artifactType,
814 String fileName, byte[] content, boolean is64Encoded) {
815 // extract heat parameters
816 String heatDecodedPayload = is64Encoded ? new String(Base64.decodeBase64(content)) : new String(content);
817 Either<List<HeatParameterDefinition>, ResultStatusEnum> heatParameters = ImportUtils
818 .getHeatParamsWithoutImplicitTypes(heatDecodedPayload, artifactType);
819 if (heatParameters.isRight()) {
820 log.debug("File {} is not in expected key-value form in csar ", fileName);
821 BeEcompErrorManager.getInstance().logInternalDataError(
822 "File " + fileName + " is not in expected key-value form in csar ", "CSAR internals are invalid",
823 ErrorSeverity.ERROR);
825 .right(componentsUtils.getResponseFormat(ActionStatus.INVALID_DEPLOYMENT_ARTIFACT_HEAT, fileName));
828 return Either.left(heatParameters.left().value());
832 private Either<ArtifactDefinition, ResponseFormat> updateHeatParams(Resource resource,
833 ArtifactDefinition currentInfo, List<HeatParameterDefinition> updatedHeatEnvParams) {
835 Either<ArtifactDefinition, ResponseFormat> resStatus = Either.left(currentInfo);
836 List<HeatParameterDefinition> currentHeatEnvParams = currentInfo.getListHeatParameters();
838 if (updatedHeatEnvParams != null && !updatedHeatEnvParams.isEmpty() && currentHeatEnvParams != null
839 && !currentHeatEnvParams.isEmpty()) {
842 for (HeatParameterDefinition heatEnvParam : updatedHeatEnvParams) {
844 paramName = heatEnvParam.getName();
845 for (HeatParameterDefinition currHeatParam : currentHeatEnvParams) {
846 if (paramName.equalsIgnoreCase(currHeatParam.getName())) {
848 String updatedParamValue = heatEnvParam.getCurrentValue();
849 if (updatedParamValue == null) {
850 updatedParamValue = heatEnvParam.getDefaultValue();
852 HeatParameterType paramType = HeatParameterType.isValidType(currHeatParam.getType());
853 if (!paramType.getValidator().isValid(updatedParamValue, null)) {
854 ActionStatus status = ActionStatus.INVALID_HEAT_PARAMETER_VALUE;
855 ResponseFormat responseFormat = componentsUtils.getResponseFormat(status,
856 ArtifactTypeEnum.HEAT_ENV.getType(), paramType.getType(), paramName);
857 resStatus = Either.right(responseFormat);
860 currHeatParam.setCurrentValue(
861 paramType.getConverter().convert(updatedParamValue, null, null));
867 currentInfo.setListHeatParameters(currentHeatEnvParams);
868 Either<ArtifactDefinition, StorageOperationStatus> updateArifactOnResource = artifactToscaOperation
869 .updateArtifactOnResource(currentInfo, resource.getUniqueId(), currentInfo.getUniqueId(),
871 if (updateArifactOnResource.isRight()) {
873 "Failed to update heat paratemers of heat on CSAR flow for component {} artifact {} label {}",
874 resource.getUniqueId(), currentInfo.getUniqueId(), currentInfo.getArtifactLabel());
875 return Either.right(componentsUtils.getResponseFormat(
876 componentsUtils.convertFromStorageResponse(updateArifactOnResource.right().value())));
878 resStatus = Either.left(updateArifactOnResource.left().value());
886 public Either<Either<ArtifactDefinition, Operation>, ResponseFormat> createOrUpdateCsarArtifactFromJson(
887 Resource resource, User user, Map<String, Object> json, ArtifactOperationInfo operation) {
889 String jsonStr = gson.toJson(json);
891 String origMd5 = GeneralUtility.calculateMD5Base64EncodedByString(jsonStr);
892 ArtifactDefinition artifactDefinitionFromJson = RepresentationUtils.convertJsonToArtifactDefinition(jsonStr,
893 ArtifactDefinition.class);
895 String artifactUniqueId = artifactDefinitionFromJson == null ? null : artifactDefinitionFromJson.getUniqueId();
896 Either<Either<ArtifactDefinition, Operation>, ResponseFormat> uploadArtifactToService = artifactsBusinessLogic
897 .validateAndHandleArtifact(resource.getUniqueId(), ComponentTypeEnum.RESOURCE, operation,
898 artifactUniqueId, artifactDefinitionFromJson, origMd5, jsonStr, null, null, user,
899 resource, false, true, false);
900 if (uploadArtifactToService.isRight()) {
901 return Either.right(uploadArtifactToService.right().value());
904 return Either.left(uploadArtifactToService.left().value());
907 private void associateMembersToArtifacts(List<ArtifactDefinition> createdArtifacts,
908 List<ArtifactDefinition> artifactsFromResource, List<GroupDefinition> heatGroups,
909 Set<String> artifactsGroup, Map<String, String> members) {
910 if (heatGroups != null && !heatGroups.isEmpty()) {
911 for (GroupDefinition heatGroup : heatGroups) {
912 List<GroupProperty> grpoupProps = heatGroup.convertToGroupProperties();
913 if (grpoupProps != null) {
914 associatemembersToVFgroups(createdArtifacts, artifactsFromResource, grpoupProps, artifactsGroup, heatGroup, members);
921 private void associatemembersToVFgroups(List<ArtifactDefinition> createdArtifacts,List<ArtifactDefinition> artifactsFromResource, List<GroupProperty> grpoupProps, Set<String> artifactsGroup, GroupDefinition heatGroup, Map<String, String> members){
922 Optional<GroupProperty> op = grpoupProps.stream()
923 .filter(p -> p.getName().equals(Constants.HEAT_FILE_PROPS)).findAny();
924 if (op.isPresent()) {
925 GroupProperty prop = op.get();
926 String heatFileNAme = prop.getValue();
927 if (null == heatFileNAme || heatFileNAme.isEmpty()) {
930 List<ArtifactDefinition> artifacts = new ArrayList<>();
931 for (String artifactId : artifactsGroup) {
932 Optional<ArtifactDefinition> opArt = createdArtifacts.stream()
933 .filter(p -> p.getUniqueId().equals(artifactId)).findAny();
934 if (opArt.isPresent()) {
935 artifacts.add(opArt.get());
937 if (artifactsFromResource != null) {
938 opArt = artifactsFromResource.stream().filter(p -> p.getUniqueId().equals(artifactId))
940 if (opArt.isPresent()) {
941 artifacts.add(opArt.get());
945 Optional<ArtifactDefinition> resOp = artifacts.stream()
946 .filter(p -> heatFileNAme.contains(p.getArtifactName())).findAny();
947 if (resOp.isPresent()) {
948 members.putAll(heatGroup.getMembers());
953 public List<GroupProperty> createVfModuleAdditionalProperties(boolean isBase, String moduleName,
954 List<GroupProperty> properties, List<ArtifactDefinition> deploymentArtifacts, List<String> artifactsInGroup,
955 GroupTypeDefinition groupType) {
956 Map<String, VfModuleProperty> vfModuleProperties = ConfigurationManager.getConfigurationManager()
957 .getConfiguration().getVfModuleProperties();
958 vfModuleProperties.entrySet().forEach(p -> {
959 GroupProperty prop = new GroupProperty();
960 prop.setName(p.getKey());
962 prop.setValue(p.getValue().getForBaseModule());
963 prop.setDefaultValue(p.getValue().getForBaseModule());
965 prop.setValue(p.getValue().getForNonBaseModule());
966 prop.setDefaultValue(p.getValue().getForNonBaseModule());
968 properties.add(prop);
971 GroupProperty proplabel = new GroupProperty();
972 proplabel.setName("vf_module_label");
974 Matcher matcher = pattern.matcher(moduleName);
976 if (matcher.find()) {
977 proplabel.setValue(matcher.group(1));
978 proplabel.setDefaultValue(matcher.group(1));
980 proplabel.setValue(moduleName);
981 proplabel.setDefaultValue(moduleName);
983 properties.add(proplabel);
985 GroupProperty propvolume = new GroupProperty();
986 propvolume.setName("volume_group");
987 boolean isVolume = false;
988 for (String artifactId : artifactsInGroup) {
989 ArtifactDefinition artifactDef = null;
990 artifactDef = ArtifactUtils.findArtifactInList(deploymentArtifacts, artifactId);
991 if (artifactDef != null
992 && artifactDef.getArtifactType().equalsIgnoreCase(ArtifactTypeEnum.HEAT_VOL.getType())) {
997 propvolume.setValue(String.valueOf(isVolume));
998 propvolume.setDefaultValue(String.valueOf(isVolume));
999 properties.add(propvolume);
1000 mergeWithGroupTypeProperties(properties, groupType.getProperties());
1004 private void mergeWithGroupTypeProperties(List<GroupProperty> properties,
1005 List<PropertyDefinition> groupTypeProperties) {
1007 Map<String, GroupProperty> propertiesMap = properties.stream()
1008 .collect(Collectors.toMap(PropertyDataDefinition::getName, p -> p));
1009 for (PropertyDefinition groupTypeProperty : groupTypeProperties) {
1010 if (!propertiesMap.containsKey(groupTypeProperty.getName())) {
1011 properties.add(new GroupProperty(groupTypeProperty));
1016 private Map<GroupDefinition, MergedArtifactInfo> mergeGroupInUpdateFlow(
1017 Map<GroupDefinition, Map<ArtifactDefinition, List<ArtifactDefinition>>> groupArtifact,
1018 Map<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>> parsedGroup, Set<ArtifactDefinition> artifactsToDelete,
1019 Map<String, List<ArtifactDefinition>> groupToDelete, Set<ArtifactTemplateInfo> jsonMasterArtifacts,
1020 List<ArtifactDefinition> createdDeplymentArtifacts) {
1021 Map<GroupDefinition, MergedArtifactInfo> mergedgroup = new HashMap<>();
1022 for (Entry<GroupDefinition, Map<ArtifactDefinition, List<ArtifactDefinition>>> groupListEntry : groupArtifact
1024 Map<ArtifactDefinition, List<ArtifactDefinition>> createdArtifactMap = groupListEntry.getValue();
1025 boolean isNeedToDeleteGroup = true;
1026 List<ArtifactDefinition> listToDelete = null;
1027 for (ArtifactDefinition maserArtifact : createdArtifactMap.keySet()) {
1028 listToDelete = createdArtifactMap.get(maserArtifact);
1029 for (ArtifactDefinition artToDelete : listToDelete) {
1030 findArtifactToDelete(parsedGroup, artifactsToDelete, artToDelete, createdDeplymentArtifacts);
1032 if (artifactsToDelete != null && !artifactsToDelete.isEmpty()) {
1033 GroupDefinition group = groupListEntry.getKey();
1034 for (ArtifactDefinition artifactDefinition : artifactsToDelete) {
1035 if (CollectionUtils.isNotEmpty(group.getArtifacts())
1036 && group.getArtifacts().contains(artifactDefinition.getUniqueId())) {
1037 group.getArtifacts().remove(artifactDefinition.getUniqueId());
1040 if (CollectionUtils.isNotEmpty(group.getArtifactsUuid())
1041 && group.getArtifactsUuid().contains(artifactDefinition.getArtifactUUID())) {
1042 group.getArtifactsUuid().remove(artifactDefinition.getArtifactUUID());
1049 for (ArtifactTemplateInfo jsonMasterArtifact : jsonMasterArtifacts) {
1050 if (maserArtifact.getArtifactName().equalsIgnoreCase(jsonMasterArtifact.getFileName())) {
1051 MergedArtifactInfo mergedGroup = new MergedArtifactInfo();
1052 mergedGroup.setJsonArtifactTemplate(jsonMasterArtifact);
1053 mergedGroup.setCreatedArtifact(createdArtifactMap.get(maserArtifact));
1054 mergedgroup.put(groupListEntry.getKey(), mergedGroup);
1055 isNeedToDeleteGroup = false;
1061 if (isNeedToDeleteGroup) {
1062 groupToDelete.put(groupListEntry.getKey().getUniqueId(), listToDelete);
1069 private void findArtifactToDelete(Map<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>> parsedGroup,
1070 Set<ArtifactDefinition> artifactsToDelete, ArtifactDefinition artifact,
1071 List<ArtifactDefinition> createdDeplymentArtifacts) {
1072 boolean isNeedToDeleteArtifact = true;
1073 String artifactType = artifact.getArtifactType();
1074 ArtifactDefinition generatedFromArt = null;
1075 if (artifact.getGeneratedFromId() != null && !artifact.getGeneratedFromId().isEmpty()) {
1076 Optional<ArtifactDefinition> op = createdDeplymentArtifacts.stream()
1077 .filter(p -> p.getUniqueId().equals(artifact.getGeneratedFromId())).findAny();
1078 if (op.isPresent()) {
1079 generatedFromArt = op.get();
1084 for (Entry<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>> parsedGroupSetEntry : parsedGroup.entrySet()) {
1085 Set<ArtifactTemplateInfo> artifactsNames = parsedGroupSetEntry.getValue();
1086 for (ArtifactTemplateInfo template : artifactsNames) {
1087 if (artifact.getArtifactName().equalsIgnoreCase(template.getFileName())
1088 && artifactType.equalsIgnoreCase(template.getType())) {
1089 isNeedToDeleteArtifact = false;
1094 if (generatedFromArt != null) {
1095 if (generatedFromArt.getArtifactName().equalsIgnoreCase(template.getFileName())
1096 && generatedFromArt.getArtifactType().equalsIgnoreCase(template.getType())) {
1097 isNeedToDeleteArtifact = false;
1105 if (isNeedToDeleteArtifact) {
1106 artifactsToDelete.add(artifact);
1111 private Map<GroupDefinition, Map<ArtifactDefinition, List<ArtifactDefinition>>> findMasterArtifactInGroup(
1112 List<GroupDefinition> groups, Map<String, ArtifactDefinition> deplymentArtifact) {
1113 Map<GroupDefinition, Map<ArtifactDefinition, List<ArtifactDefinition>>> groupArtifact = new HashMap<>();
1115 for (GroupDefinition group : groups) {
1116 Map<ArtifactDefinition, List<ArtifactDefinition>> gupsMap = new HashMap<>();
1117 List<ArtifactDefinition> artifacts = new ArrayList<>();
1118 List<String> artifactsList = group.getArtifacts();
1119 if (artifactsList != null && !artifactsList.isEmpty()) {
1121 ArtifactDefinition masterArtifact = ArtifactUtils.findMasterArtifact(deplymentArtifact, artifacts,
1123 if (masterArtifact != null) {
1124 gupsMap.put(masterArtifact, artifacts);
1126 groupArtifact.put(group, gupsMap);
1130 return groupArtifact;
1133 private Either<Resource, ResponseFormat> deleteArtifactsInUpdateCsarFlow(Resource resource,
1134 User user, boolean shouldLock, boolean inTransaction, Set<ArtifactDefinition> artifactsToDelete,
1135 Map<String, List<ArtifactDefinition>> groupToDelete, List<ArtifactDefinition> deletedArtifacts) {
1137 Resource updatedResource = resource;
1139 String resourceId = updatedResource.getUniqueId();
1140 if (!artifactsToDelete.isEmpty()) {
1141 for (ArtifactDefinition artifact : artifactsToDelete) {
1142 String artifactType = artifact.getArtifactType();
1143 ArtifactTypeEnum artifactTypeEnum = ArtifactTypeEnum.findType(artifactType);
1144 if (artifactTypeEnum != ArtifactTypeEnum.HEAT_ENV) {
1145 Either<Either<ArtifactDefinition, Operation>, ResponseFormat> handleDelete = artifactsBusinessLogic
1146 .handleDelete(resourceId, artifact.getUniqueId(), user, AuditingActionEnum.ARTIFACT_DELETE,
1147 ComponentTypeEnum.RESOURCE, updatedResource, shouldLock, inTransaction);
1148 if (handleDelete.isRight()) {
1149 return Either.right(handleDelete.right().value());
1152 deletedArtifacts.add(handleDelete.left().value().left().value());
1157 if (!groupToDelete.isEmpty()) {
1158 log.debug("try to delete group");
1159 List<GroupDefinition> groupDefinitionstoDelete = new ArrayList<>();
1160 List<GroupDefinition> groups = updatedResource.getGroups();
1161 for (Entry<String, List<ArtifactDefinition>> deleteGroup : groupToDelete.entrySet()) {
1162 Optional<GroupDefinition> op = groups.stream()
1163 .filter(gr -> gr.getUniqueId().equals(deleteGroup.getKey())).findAny();
1164 if (op.isPresent()) {
1165 groupDefinitionstoDelete.add(op.get());
1169 if (!groupDefinitionstoDelete.isEmpty()) {
1170 Either<List<GroupDefinition>, ResponseFormat> prepareGroups = groupBusinessLogic.deleteGroups(resource, groupDefinitionstoDelete);
1171 if (prepareGroups.isRight()) {
1172 return Either.right(prepareGroups.right().value());
1176 List<GroupDefinition> oldGroups = updatedResource.getGroups();
1177 Either<Resource, StorageOperationStatus> eitherGerResource = toscaOperationFacade
1178 .getToscaElement(updatedResource.getUniqueId());
1179 if (eitherGerResource.isRight()) {
1180 ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(
1181 componentsUtils.convertFromStorageResponse(eitherGerResource.right().value()), updatedResource);
1183 return Either.right(responseFormat);
1186 updatedResource = eitherGerResource.left().value();
1187 updatedResource.setGroups(oldGroups);
1188 return Either.left(updatedResource);
1191 private void createArtifactsGroupSet(List<ArtifactTemplateInfo> parsedGroupTemplateList,
1192 Set<ArtifactTemplateInfo> parsedArtifactsName) {
1194 for (ArtifactTemplateInfo parsedGroupTemplate : parsedGroupTemplateList) {
1195 parsedArtifactsName.add(parsedGroupTemplate);
1196 List<ArtifactTemplateInfo> relatedArtifacts = parsedGroupTemplate.getRelatedArtifactsInfo();
1197 if (relatedArtifacts != null && !relatedArtifacts.isEmpty()) {
1198 createArtifactsGroupSet(relatedArtifacts, parsedArtifactsName);
1203 private Either<Resource, ResponseFormat> createGroupDeploymentArtifactsFromCsar(CsarInfo csarInfo,
1204 Resource resource, List<ArtifactTemplateInfo> artifactsTemplateList,
1205 List<ArtifactDefinition> createdNewArtifacts, List<ArtifactDefinition> artifactsFromResource,
1206 int labelCounter, boolean shouldLock, boolean inTransaction) {
1208 Resource updatedResource = resource;
1210 Either<Resource, ResponseFormat> resStatus = Either.left(updatedResource);
1211 List<GroupDefinition> createdGroups = updatedResource.getGroups();
1212 List<GroupDefinition> heatGroups = null;
1213 if (createdGroups != null && !createdGroups.isEmpty()) {
1214 heatGroups = createdGroups.stream().filter(e -> e.getMembers() != null).collect(Collectors.toList());
1217 List<GroupDefinition> needToAdd = new ArrayList<>();
1218 for (ArtifactTemplateInfo groupTemplateInfo : artifactsTemplateList) {
1219 String groupName = groupTemplateInfo.getGroupName();
1220 Set<String> artifactsGroup = new HashSet<>();
1221 Set<String> artifactsUUIDGroup = new HashSet<>();
1223 resStatus = createDeploymentArtifactsFromCsar(csarInfo, updatedResource, artifactsGroup, artifactsUUIDGroup,
1224 groupTemplateInfo, createdNewArtifacts, artifactsFromResource, labelCounter, shouldLock,
1226 if (resStatus.isRight()) {
1229 if (groupName != null && !groupName.isEmpty()) {
1230 Map<String, String> members = new HashMap<>();
1231 associateMembersToArtifacts(createdNewArtifacts, artifactsFromResource, heatGroups, artifactsGroup,
1234 List<String> artifactsList = new ArrayList<>(artifactsGroup);
1235 List<String> artifactsUUIDList = new ArrayList<>(artifactsUUIDGroup);
1237 GroupDefinition groupDefinition = new GroupDefinition();
1238 groupDefinition.setName(groupName);
1239 groupDefinition.setType(Constants.DEFAULT_GROUP_VF_MODULE);
1240 groupDefinition.setArtifacts(artifactsList);
1241 groupDefinition.setArtifactsUuid(artifactsUUIDList);
1243 if (!members.isEmpty()) {
1244 groupDefinition.setMembers(members);
1247 List<GroupProperty> properties = new ArrayList<>();
1248 GroupProperty prop = new GroupProperty();
1249 prop.setName(Constants.IS_BASE);
1250 prop.setValue(Boolean.toString(groupTemplateInfo.isBase()));
1251 properties.add(prop);
1253 List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
1254 createdArtifacts.addAll(createdNewArtifacts);
1255 createdArtifacts.addAll(artifactsFromResource);
1256 Either<GroupTypeDefinition, StorageOperationStatus> getLatestGroupTypeRes = groupTypeOperation
1257 .getLatestGroupTypeByType(Constants.DEFAULT_GROUP_VF_MODULE, true);
1258 if (getLatestGroupTypeRes.isRight()) {
1259 return Either.right(componentsUtils.getResponseFormat(
1260 componentsUtils.convertFromStorageResponse(getLatestGroupTypeRes.right().value())));
1262 properties = createVfModuleAdditionalProperties(groupTemplateInfo.isBase(), groupName, properties,
1263 createdArtifacts, artifactsList, getLatestGroupTypeRes.left().value());
1264 groupDefinition.convertFromGroupProperties(properties);
1266 needToAdd.add(groupDefinition);
1269 ComponentParametersView componentParametersView = new ComponentParametersView();
1270 componentParametersView.disableAll();
1271 componentParametersView.setIgnoreArtifacts(false);
1272 componentParametersView.setIgnoreGroups(false);
1273 componentParametersView.setIgnoreComponentInstances(false);
1275 Either<Resource, StorageOperationStatus> component = toscaOperationFacade
1276 .getToscaElement(updatedResource.getUniqueId(), componentParametersView);
1277 if (component.isRight()) {
1278 return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
1280 updatedResource = component.left().value();
1282 Either<List<GroupDefinition>, ResponseFormat> addGroups = groupBusinessLogic.addGroups(updatedResource, needToAdd, false);
1283 if (addGroups.isRight()) {
1284 return Either.right(addGroups.right().value());
1290 private Either<Resource, ResponseFormat> createDeploymentArtifactsFromCsar(CsarInfo csarInfo, Resource resource,
1291 Set<String> artifactsGroup, Set<String> artifactsUUIDGroup, ArtifactTemplateInfo artifactTemplateInfo,
1292 List<ArtifactDefinition> createdArtifacts, List<ArtifactDefinition> artifactsFromResource, int labelCounter,
1293 boolean shoudLock, boolean inTransaction) {
1294 Either<Resource, ResponseFormat> resStatus = Either.left(resource);
1295 String artifactFileName = artifactTemplateInfo.getFileName();
1296 String artifactUid = "";
1297 String artifactUUID = "";
1298 String artifactEnvUid = "";
1299 boolean alreadyExist = false;
1301 // check if artifacts already exist
1302 if (artifactsFromResource != null && !artifactsFromResource.isEmpty()) {
1303 for (ArtifactDefinition artifactFromResource : artifactsFromResource) {
1304 if (artifactFromResource.getArtifactName().equals(artifactFileName)) {
1305 artifactUid = artifactFromResource.getUniqueId();
1306 artifactUUID = artifactFromResource.getArtifactUUID();
1307 if (!artifactFromResource.getArtifactType().equalsIgnoreCase(artifactTemplateInfo.getType())) {
1308 log.debug(ARTIFACT_WITH_NAME_AND_TYPE_ALREADY_EXIST_WITH_TYPE, artifactFileName,
1309 artifactTemplateInfo.getType(), artifactFromResource.getArtifactType());
1310 BeEcompErrorManager.getInstance().logInternalDataError(
1311 ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMATR_FILE_NAME1 + artifactFileName,
1312 ARTIFACT_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
1313 return Either.right(componentsUtils.getResponseFormat(
1314 ActionStatus.ARTIFACT_ALREADY_EXIST_IN_DIFFERENT_TYPE_IN_CSAR, artifactFileName,
1315 artifactTemplateInfo.getType(), artifactFromResource.getArtifactType()));
1317 alreadyExist = true;
1318 artifactEnvUid = checkAndGetHeatEnvId(artifactFromResource);
1325 if (!alreadyExist) {
1326 for (ArtifactDefinition createdArtifact : createdArtifacts) {
1327 if (createdArtifact.getArtifactName().equals(artifactFileName)) {
1328 artifactUid = createdArtifact.getUniqueId();
1329 artifactUUID = createdArtifact.getArtifactUUID();
1331 if (!createdArtifact.getArtifactType().equalsIgnoreCase(artifactTemplateInfo.getType())) {
1332 log.debug(ARTIFACT_WITH_NAME_AND_TYPE_ALREADY_EXIST_WITH_TYPE, artifactFileName,
1333 artifactTemplateInfo.getType(), createdArtifact.getArtifactType());
1334 BeEcompErrorManager.getInstance().logInternalDataError(
1335 ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMATR_FILE_NAME1 + artifactFileName,
1336 ARTIFACT_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
1337 return Either.right(componentsUtils.getResponseFormat(
1338 ActionStatus.ARTIFACT_ALREADY_EXIST_IN_DIFFERENT_TYPE_IN_CSAR, artifactFileName,
1339 artifactTemplateInfo.getType(), createdArtifact.getArtifactType()));
1341 alreadyExist = true;
1342 artifactEnvUid = checkAndGetHeatEnvId(createdArtifact);
1348 // if not exist need to create
1349 if (!alreadyExist) {
1351 Either<ArtifactDefinition, ResponseFormat> newArtifactEither = createDeploymentArtifact(csarInfo, resource,
1352 ARTIFACTS_PATH, artifactTemplateInfo, createdArtifacts, labelCounter);
1353 if (newArtifactEither.isRight()) {
1354 resStatus = Either.right(newArtifactEither.right().value());
1357 ArtifactDefinition newArtifact = newArtifactEither.left().value();
1358 artifactUid = newArtifact.getUniqueId();
1359 artifactUUID = newArtifact.getArtifactUUID();
1360 ArtifactTypeEnum artifactType = ArtifactTypeEnum.findType(newArtifact.getArtifactType());
1361 if (artifactType == ArtifactTypeEnum.HEAT || artifactType == ArtifactTypeEnum.HEAT_NET
1362 || artifactType == ArtifactTypeEnum.HEAT_VOL) {
1363 Either<ArtifactDefinition, ResponseFormat> createHeatEnvPlaceHolder = artifactsBusinessLogic
1364 .createHeatEnvPlaceHolder(newArtifact, ArtifactsBusinessLogic.HEAT_VF_ENV_NAME,
1365 resource.getUniqueId(), NodeTypeEnum.Resource, resource.getName(),
1366 csarInfo.getModifier(), resource, null);
1367 if (createHeatEnvPlaceHolder.isRight()) {
1368 return Either.right(createHeatEnvPlaceHolder.right().value());
1370 artifactEnvUid = createHeatEnvPlaceHolder.left().value().getUniqueId();
1374 artifactsGroup.add(artifactUid);
1375 artifactsUUIDGroup.add(artifactUUID);
1376 if (!artifactEnvUid.isEmpty()) {
1377 artifactsGroup.add(artifactEnvUid);
1380 List<ArtifactTemplateInfo> relatedArtifacts = artifactTemplateInfo.getRelatedArtifactsInfo();
1381 if (relatedArtifacts != null) {
1382 for (ArtifactTemplateInfo relatedArtifactTemplateInfo : relatedArtifacts) {
1383 resStatus = createDeploymentArtifactsFromCsar(csarInfo, resource, artifactsGroup, artifactsUUIDGroup,
1384 relatedArtifactTemplateInfo, createdArtifacts, artifactsFromResource, labelCounter, shoudLock,
1386 if (resStatus.isRight()) {
1394 private Either<Resource, ResponseFormat> associateAndDissociateArtifactsToGroup(CsarInfo csarInfo,
1395 Resource resource, List<ArtifactDefinition> createdNewArtifacts, int labelCounter,
1396 boolean inTransaction, List<ArtifactDefinition> createdDeplymentArtifactsAfterDelete,
1397 Map<GroupDefinition, MergedArtifactInfo> mergedgroup, List<ArtifactDefinition> deletedArtifacts) {
1398 Map<GroupDefinition, List<ArtifactTemplateInfo>> artifactsToAssotiate = new HashMap<>();
1399 Map<GroupDefinition, List<ImmutablePair<ArtifactDefinition, ArtifactTemplateInfo>>> artifactsToUpdateMap = new HashMap<>();
1400 Either<Resource, ResponseFormat> resEither = Either.left(resource);
1401 for (Entry<GroupDefinition, MergedArtifactInfo> entry : mergedgroup.entrySet()) {
1402 List<ArtifactDefinition> dissArtifactsInGroup = entry.getValue()
1403 .getListToDissotiateArtifactFromGroup(deletedArtifacts);
1404 GroupDefinition grDef = entry.getKey();
1405 if (dissArtifactsInGroup != null && !dissArtifactsInGroup.isEmpty()) {
1406 for (ArtifactDefinition art : dissArtifactsInGroup) {
1407 grDef.getArtifacts().remove(art.getUniqueId());
1408 grDef.getArtifactsUuid().remove(art.getArtifactUUID());
1412 List<ArtifactTemplateInfo> newArtifactsInGroup = entry.getValue().getListToAssociateArtifactToGroup();
1413 if (newArtifactsInGroup != null && !newArtifactsInGroup.isEmpty()) {
1414 artifactsToAssotiate.put(entry.getKey(), newArtifactsInGroup);
1417 List<ImmutablePair<ArtifactDefinition, ArtifactTemplateInfo>> artifactsToUpdate = entry.getValue()
1418 .getListToUpdateArtifactInGroup();
1419 if (artifactsToUpdate != null && !artifactsToUpdate.isEmpty()) {
1420 artifactsToUpdateMap.put(entry.getKey(), artifactsToUpdate);
1424 if (!artifactsToUpdateMap.isEmpty()) {
1425 List<ArtifactDefinition> updatedArtifacts = new ArrayList<>();
1426 for (Entry<GroupDefinition, List<ImmutablePair<ArtifactDefinition, ArtifactTemplateInfo>>> artifactsToUpdateEntry : artifactsToUpdateMap
1428 List<ImmutablePair<ArtifactDefinition, ArtifactTemplateInfo>> artifactsToUpdateList = artifactsToUpdateEntry
1430 GroupDefinition groupToUpdate = artifactsToUpdateEntry.getKey();
1432 for (ImmutablePair<ArtifactDefinition, ArtifactTemplateInfo> artifact : artifactsToUpdateList) {
1433 String prevUUID = artifact.getKey().getArtifactUUID();
1434 String prevId = artifact.getKey().getUniqueId();
1435 String prevHeatEnvId = checkAndGetHeatEnvId(artifact.getKey());
1436 Either<ArtifactDefinition, ResponseFormat> updateArtifactEither = updateDeploymentArtifactsFromCsar(
1437 csarInfo, resource, artifact.getKey(), artifact.getValue(), updatedArtifacts,
1438 artifact.getRight().getRelatedArtifactsInfo());
1439 if (updateArtifactEither.isRight()) {
1440 log.debug("failed to update artifacts. status is {}", updateArtifactEither.right().value());
1441 resEither = Either.right(updateArtifactEither.right().value());
1444 ArtifactDefinition artAfterUpdate = updateArtifactEither.left().value();
1445 if (!prevUUID.equals(artAfterUpdate.getArtifactUUID())
1446 || !prevId.equals(artAfterUpdate.getUniqueId())) {
1447 groupToUpdate.getArtifacts().remove(prevId);
1448 groupToUpdate.getArtifactsUuid().remove(prevUUID);
1449 groupToUpdate.getArtifacts().add(artAfterUpdate.getUniqueId());
1450 groupToUpdate.getArtifactsUuid().add(artAfterUpdate.getArtifactUUID());
1452 Optional<ArtifactDefinition> op = updatedArtifacts.stream()
1453 .filter(p -> p.getGeneratedFromId() != null
1454 && p.getGeneratedFromId().equals(artAfterUpdate.getUniqueId()))
1456 if (op.isPresent()) {
1457 ArtifactDefinition artifactInfoHeatEnv = op.get();
1458 groupToUpdate.getArtifacts().remove(prevHeatEnvId);
1459 groupToUpdate.getArtifacts().add(artifactInfoHeatEnv.getUniqueId());
1466 for (Entry<GroupDefinition, List<ArtifactTemplateInfo>> associateEntry : artifactsToAssotiate.entrySet()) {
1467 List<ArtifactTemplateInfo> associatedArtifact = associateEntry.getValue();
1468 Set<String> arifactsUids = new HashSet<>();
1469 Set<String> arifactsUuids = new HashSet<>();
1470 for (ArtifactTemplateInfo artifactTemplate : associatedArtifact) { // try
1476 boolean isCreate = true;
1477 for (ArtifactDefinition createdArtifact : createdDeplymentArtifactsAfterDelete) {
1478 if (artifactTemplate.getFileName().equalsIgnoreCase(createdArtifact.getArtifactName())) {
1479 arifactsUids.add(createdArtifact.getUniqueId());
1480 arifactsUuids.add(createdArtifact.getArtifactUUID());
1482 String heatEnvId = checkAndGetHeatEnvId(createdArtifact);
1483 if (!heatEnvId.isEmpty()) {
1484 arifactsUids.add(heatEnvId);
1485 Optional<ArtifactDefinition> op = createdDeplymentArtifactsAfterDelete.stream()
1486 .filter(p -> p.getUniqueId().equals(heatEnvId)).findAny();
1487 if (op.isPresent()) {
1488 this.artifactToscaOperation.updateHeatEnvPlaceholder(op.get(), resource.getUniqueId(),
1489 resource.getComponentType().getNodeType());
1498 if (isCreate) { // check if already created
1499 for (ArtifactDefinition createdNewArtifact : createdNewArtifacts) {
1500 if (artifactTemplate.getFileName().equalsIgnoreCase(createdNewArtifact.getArtifactName())) {
1501 arifactsUids.add(createdNewArtifact.getUniqueId());
1502 arifactsUuids.add(createdNewArtifact.getArtifactUUID());
1504 String heatEnvId = checkAndGetHeatEnvId(createdNewArtifact);
1505 if (!heatEnvId.isEmpty()) {
1506 arifactsUids.add(heatEnvId);
1514 Either<ArtifactDefinition, ResponseFormat> createArtifactEither = createDeploymentArtifact(csarInfo,
1515 resource, ARTIFACTS_PATH, artifactTemplate, createdNewArtifacts, labelCounter);
1516 if (createArtifactEither.isRight()) {
1517 resEither = Either.right(createArtifactEither.right().value());
1520 ArtifactDefinition createdArtifact = createArtifactEither.left().value();
1521 arifactsUids.add(createdArtifact.getUniqueId());
1522 arifactsUuids.add(createdArtifact.getArtifactUUID());
1523 ArtifactTypeEnum artifactType = ArtifactTypeEnum.findType(createdArtifact.getArtifactType());
1524 if (artifactType == ArtifactTypeEnum.HEAT || artifactType == ArtifactTypeEnum.HEAT_NET
1525 || artifactType == ArtifactTypeEnum.HEAT_VOL) {
1526 Either<ArtifactDefinition, ResponseFormat> createHeatEnvPlaceHolder = artifactsBusinessLogic
1527 .createHeatEnvPlaceHolder(createdArtifact, ArtifactsBusinessLogic.HEAT_VF_ENV_NAME,
1528 resource.getUniqueId(), NodeTypeEnum.Resource, resource.getName(),
1529 csarInfo.getModifier(), resource, null);
1530 if (createHeatEnvPlaceHolder.isRight()) {
1531 return Either.right(createHeatEnvPlaceHolder.right().value());
1533 String heatEnvId = createHeatEnvPlaceHolder.left().value().getUniqueId();
1534 arifactsUids.add(heatEnvId);
1539 if (arifactsUids != null && !arifactsUids.isEmpty()) {
1540 List<String> artifactsToAssociate = new ArrayList<>();
1541 artifactsToAssociate.addAll(arifactsUids);
1542 GroupDefinition assotiateGroup = associateEntry.getKey();
1543 assotiateGroup.getArtifacts().addAll(arifactsUids);
1544 assotiateGroup.getArtifactsUuid().addAll(arifactsUuids);
1548 ComponentParametersView parametersView = new ComponentParametersView();
1549 parametersView.disableAll();
1550 parametersView.setIgnoreComponentInstances(false);
1551 parametersView.setIgnoreUsers(false);
1552 parametersView.setIgnoreArtifacts(false);
1553 parametersView.setIgnoreGroups(false);
1555 Either<Resource, StorageOperationStatus> eitherGerResource = toscaOperationFacade
1556 .getToscaElement(resource.getUniqueId(), parametersView);
1558 if (eitherGerResource.isRight()) {
1559 ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(
1560 componentsUtils.convertFromStorageResponse(eitherGerResource.right().value()), resource);
1562 resEither = Either.right(responseFormat);
1566 resEither = Either.left(eitherGerResource.left().value());
1570 private Either<ArtifactDefinition, ResponseFormat> updateDeploymentArtifactsFromCsar(CsarInfo csarInfo,
1571 Resource resource, ArtifactDefinition oldArtifact, ArtifactTemplateInfo artifactTemplateInfo,
1572 List<ArtifactDefinition> updatedArtifacts, List<ArtifactTemplateInfo> updatedRequiredArtifacts) {
1574 Either<ArtifactDefinition, ResponseFormat> resStatus = null;
1575 String artifactFileName = artifactTemplateInfo.getFileName();
1577 // check if artifacts already exist
1578 for (ArtifactDefinition updatedArtifact : updatedArtifacts) {
1579 if (updatedArtifact.getArtifactName().equals(artifactFileName)) {
1580 if (!updatedArtifact.getArtifactType().equalsIgnoreCase(artifactTemplateInfo.getType())) {
1581 log.debug("Artifact with name {} and type {} already updated with type {}", artifactFileName,
1582 artifactTemplateInfo.getType(), updatedArtifact.getArtifactType());
1583 BeEcompErrorManager.getInstance().logInternalDataError(
1584 ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMATR_FILE_NAME1 + artifactFileName,
1585 ARTIFACT_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
1586 resStatus = Either.right(componentsUtils.getResponseFormat(
1587 ActionStatus.ARTIFACT_ALREADY_EXIST_IN_DIFFERENT_TYPE_IN_CSAR, artifactFileName,
1588 artifactTemplateInfo.getType(), updatedArtifact.getArtifactType()));
1591 resStatus = Either.left(updatedArtifact);
1597 Either<ImmutablePair<String, byte[]>, ResponseFormat> artifactContententStatus = CsarValidationUtils
1598 .getArtifactsContent(csarInfo.getCsarUUID(), csarInfo.getCsar(),
1599 CsarUtils.ARTIFACTS_PATH + artifactFileName, artifactFileName, componentsUtils);
1600 if (artifactContententStatus.isRight()) {
1601 resStatus = Either.right(artifactContententStatus.right().value());
1605 Map<String, Object> json = ArtifactUtils.buildJsonForUpdateArtifact(oldArtifact.getUniqueId(), artifactFileName,
1606 oldArtifact.getArtifactType(), ArtifactGroupTypeEnum.DEPLOYMENT, oldArtifact.getArtifactLabel(),
1607 oldArtifact.getArtifactDisplayName(), oldArtifact.getDescription(),
1608 artifactContententStatus.left().value().getRight(), updatedRequiredArtifacts, oldArtifact.getIsFromCsar());
1610 Either<Either<ArtifactDefinition, Operation>, ResponseFormat> uploadArtifactToService = createOrUpdateCsarArtifactFromJson(
1611 resource, csarInfo.getModifier(), json,
1612 artifactsBusinessLogic.new ArtifactOperationInfo(false, false, ArtifactOperationEnum.UPDATE));
1614 if (uploadArtifactToService.isRight()) {
1615 resStatus = Either.right(uploadArtifactToService.right().value());
1618 ArtifactDefinition currentInfo = uploadArtifactToService.left().value().left().value();
1619 updatedArtifacts.add(currentInfo);
1621 Either<ArtifactDefinition, ResponseFormat> updateEnvEither = updateHeatParamsFromCsar(resource, csarInfo,
1622 artifactTemplateInfo, currentInfo, true);
1623 if (updateEnvEither.isRight()) {
1624 log.debug("failed to update parameters to artifact {}", artifactFileName);
1625 resStatus = Either.right(updateEnvEither.right().value());
1629 updatedArtifacts.add(updateEnvEither.left().value());
1630 resStatus = Either.left(currentInfo);
1636 public Either<Resource, ResponseFormat> deleteVFModules(Resource resource, CsarInfo csarInfo, boolean shouldLock, boolean inTransaction) {
1637 Resource updatedResource = resource;
1638 List<GroupDefinition> groupsToDelete = updatedResource.getGroups();
1639 if(groupsToDelete != null && !groupsToDelete.isEmpty()){
1640 List<GroupDefinition> vfGroupsToDelete = groupsToDelete.stream().filter(g -> g.getType().equals(Constants.DEFAULT_GROUP_VF_MODULE)).collect(Collectors.toList());
1641 if(vfGroupsToDelete != null && !vfGroupsToDelete.isEmpty()){
1642 for(GroupDefinition gr : vfGroupsToDelete){
1643 List<String> artifacts = gr.getArtifacts();
1644 for (String artifactId : artifacts) {
1645 Either<Either<ArtifactDefinition, Operation>, ResponseFormat> handleDelete = artifactsBusinessLogic.handleDelete(updatedResource.getUniqueId(), artifactId, csarInfo.getModifier(), AuditingActionEnum.ARTIFACT_DELETE, ComponentTypeEnum.RESOURCE,
1646 updatedResource, shouldLock, inTransaction);
1647 if (handleDelete.isRight()) {
1648 log.debug("Couldn't delete artifact {}", artifactId);
1649 return Either.right(handleDelete.right().value());
1654 groupBusinessLogic.deleteGroups(updatedResource, vfGroupsToDelete);
1656 Either<Resource, StorageOperationStatus> eitherGetResource = toscaOperationFacade.getToscaElement(updatedResource.getUniqueId());
1657 if (eitherGetResource.isRight()) {
1658 ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(componentsUtils.convertFromStorageResponse(eitherGetResource.right().value()), updatedResource);
1660 return Either.right(responseFormat);
1663 updatedResource = eitherGetResource.left().value();
1666 return Either.left(updatedResource);
1669 private Either<Resource, ResponseFormat> getResourcetFromGraph(Resource component){
1670 log.debug("getResource start");
1671 return toscaOperationFacade.getToscaElement(component.getUniqueId())
1673 .map(rf -> componentsUtils.getResponseFormatByResource(componentsUtils.convertFromStorageResponse(rf), component))
1675 .map (c -> (Resource) c);