2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.sdc.be.components.csar;
23 import static org.openecomp.sdc.be.components.impl.ArtifactsBusinessLogic.FAILED_UPLOAD_ARTIFACT_TO_COMPONENT;
24 import static org.openecomp.sdc.be.tosca.CsarUtils.ARTIFACTS_PATH;
26 import com.google.gson.Gson;
27 import com.google.gson.JsonElement;
28 import com.google.gson.JsonObject;
29 import fj.data.Either;
30 import java.util.ArrayList;
31 import java.util.Collection;
32 import java.util.Collections;
33 import java.util.HashMap;
34 import java.util.HashSet;
35 import java.util.List;
37 import java.util.Map.Entry;
38 import java.util.Optional;
39 import java.util.OptionalInt;
40 import java.util.Scanner;
42 import java.util.regex.Matcher;
43 import java.util.regex.Pattern;
44 import java.util.stream.Collectors;
45 import java.util.stream.IntStream;
46 import org.apache.commons.codec.binary.Base64;
47 import org.apache.commons.collections.CollectionUtils;
48 import org.apache.commons.collections.MapUtils;
49 import org.apache.commons.lang3.StringUtils;
50 import org.apache.commons.lang3.tuple.ImmutablePair;
51 import org.openecomp.sdc.be.components.impl.ArtifactsBusinessLogic;
52 import org.openecomp.sdc.be.components.impl.ArtifactsBusinessLogic.ArtifactOperationEnum;
53 import org.openecomp.sdc.be.components.impl.artifact.ArtifactOperationInfo;
54 import org.openecomp.sdc.be.components.impl.BaseBusinessLogic;
55 import org.openecomp.sdc.be.components.impl.CsarValidationUtils;
56 import org.openecomp.sdc.be.components.impl.GroupBusinessLogic;
57 import org.openecomp.sdc.be.components.impl.ImportUtils;
58 import org.openecomp.sdc.be.components.impl.ImportUtils.ResultStatusEnum;
59 import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
60 import org.openecomp.sdc.be.config.BeEcompErrorManager;
61 import org.openecomp.sdc.be.config.BeEcompErrorManager.ErrorSeverity;
62 import org.openecomp.sdc.be.config.Configuration.VfModuleProperty;
63 import org.openecomp.sdc.be.config.ConfigurationManager;
64 import org.openecomp.sdc.be.dao.api.ActionStatus;
65 import org.openecomp.sdc.be.datamodel.utils.ArtifactUtils;
66 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
67 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
68 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
69 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
70 import org.openecomp.sdc.be.impl.ComponentsUtils;
71 import org.openecomp.sdc.be.info.ArtifactTemplateInfo;
72 import org.openecomp.sdc.be.info.MergedArtifactInfo;
73 import org.openecomp.sdc.be.model.ArtifactDefinition;
74 import org.openecomp.sdc.be.model.ComponentParametersView;
75 import org.openecomp.sdc.be.model.GroupDefinition;
76 import org.openecomp.sdc.be.model.GroupProperty;
77 import org.openecomp.sdc.be.model.GroupTypeDefinition;
78 import org.openecomp.sdc.be.model.HeatParameterDefinition;
79 import org.openecomp.sdc.be.model.Operation;
80 import org.openecomp.sdc.be.model.PropertyDefinition;
81 import org.openecomp.sdc.be.model.Resource;
82 import org.openecomp.sdc.be.model.User;
83 import org.openecomp.sdc.be.model.heat.HeatParameterType;
84 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
85 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
86 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
87 import org.openecomp.sdc.be.model.operations.api.IGroupInstanceOperation;
88 import org.openecomp.sdc.be.model.operations.api.IGroupOperation;
89 import org.openecomp.sdc.be.model.operations.api.IGroupTypeOperation;
90 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
91 import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
92 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
93 import org.openecomp.sdc.be.servlets.RepresentationUtils;
94 import org.openecomp.sdc.be.tosca.CsarUtils;
95 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
96 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
97 import org.openecomp.sdc.common.api.Constants;
98 import org.openecomp.sdc.common.log.wrappers.Logger;
99 import org.openecomp.sdc.exception.ResponseFormat;
100 import org.springframework.beans.factory.annotation.Autowired;
102 @org.springframework.stereotype.Component("csarArtifactsAndGroupsBusinessLogic")
103 public class CsarArtifactsAndGroupsBusinessLogic extends BaseBusinessLogic {
105 private static final Logger log = Logger.getLogger(CsarArtifactsAndGroupsBusinessLogic.class.getName());
106 private static final String ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMAT_FILE_NAME = "Artifact file is not in expected format, fileName {}";
107 private static final String ARTIFACT_INTERNALS_ARE_INVALID = "Artifact internals are invalid";
108 private static final String ARTIFACT_WITH_NAME_AND_TYPE_ALREADY_EXIST_WITH_TYPE = "Artifact with name {} and type {} already exist with type {}";
109 private final Gson gson = new Gson();
110 private static final Pattern pattern = Pattern.compile("\\..(.*?)\\..");
111 private static final String LABEL_COUNTER_DELIMITER = "[^0-9]+";
112 protected final ArtifactsBusinessLogic artifactsBusinessLogic;
113 private final GroupBusinessLogic groupBusinessLogic;
116 public CsarArtifactsAndGroupsBusinessLogic(IElementOperation elementDao,
117 IGroupOperation groupOperation,
118 IGroupInstanceOperation groupInstanceOperation,
119 IGroupTypeOperation groupTypeOperation,
120 GroupBusinessLogic groupBusinessLogic,
121 InterfaceOperation interfaceOperation,
122 InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
123 ArtifactsBusinessLogic artifactsBusinessLogic, ArtifactsOperations artifactToscaOperation) {
124 super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation,
125 interfaceOperation, interfaceLifecycleTypeOperation, artifactToscaOperation);
126 this.artifactsBusinessLogic = artifactsBusinessLogic;
127 this.groupBusinessLogic = groupBusinessLogic;
130 public Either<Resource, ResponseFormat> createResourceArtifactsFromCsar(CsarInfo csarInfo, Resource resource,
131 String artifactsMetaFile, String artifactsMetaFileName, List<ArtifactDefinition> createdArtifacts) {
133 log.debug("parseResourceArtifactsInfoFromFile start");
134 return parseResourceArtifactsInfoFromFile(resource, artifactsMetaFile, artifactsMetaFileName)
136 .bind( p-> createResourceArtifacts(csarInfo, resource, p, createdArtifacts))
138 .map(rf -> { componentsUtils.auditResource(rf, csarInfo.getModifier(), resource, AuditingActionEnum.IMPORT_RESOURCE); return rf;})
140 .bind(this::getResourcetFromGraph);
144 public Either<Resource, ResponseFormat> updateResourceArtifactsFromCsar(CsarInfo csarInfo, Resource resource,
145 String artifactsMetaFile, String artifactsMetaFileName, List<ArtifactDefinition> createdNewArtifacts,
146 boolean shouldLock, boolean inTransaction){
148 Resource updatedResource = resource;
150 Either<Map<String, List<ArtifactTemplateInfo>>, ResponseFormat> parseResourceInfoFromYamlEither = parseResourceArtifactsInfoFromFile(
151 updatedResource, artifactsMetaFile, artifactsMetaFileName);
152 if (parseResourceInfoFromYamlEither.isRight()) {
153 ResponseFormat responseFormat = parseResourceInfoFromYamlEither.right().value();
154 componentsUtils.auditResource(responseFormat, csarInfo.getModifier(), resource, AuditingActionEnum.IMPORT_RESOURCE);
155 return Either.right(responseFormat);
158 List<GroupDefinition> groups = updatedResource.getGroups();
159 Map<String, ArtifactDefinition> deploymentArtifact = updatedResource.getDeploymentArtifacts();
160 if (MapUtils.isEmpty(deploymentArtifact)) {
161 deleteGroupsByType(groups, Constants.DEFAULT_GROUP_VF_MODULE, updatedResource);
162 return createResourceArtifacts(csarInfo, updatedResource, parseResourceInfoFromYamlEither.left().value(),
163 createdNewArtifacts);
166 List<ArtifactDefinition> createdDeploymentArtifactsAfterDelete = deploymentArtifact.values().stream()
167 .collect(Collectors.toList());
169 int labelCounter = createdDeploymentArtifactsAfterDelete
171 .map(ArtifactDefinition::getArtifactLabel)
172 .filter(this::isLastCharacterInLabelADigit)
173 .map(this::getNextInt)
174 .flatMapToInt(this::toStream)
178 ////////////////////////////////////// create set parsed
179 ////////////////////////////////////// artifacts///////////////////////////////////////////
180 Map<String, List<ArtifactTemplateInfo>> parsedArtifactsMap = parseResourceInfoFromYamlEither.left().value();
182 List<ArtifactTemplateInfo> artifactsWithoutGroups = parsedArtifactsMap.remove(ArtifactTemplateInfo.CSAR_ARTIFACT);
183 Collection<List<ArtifactTemplateInfo>> parsedArifactsCollection = parsedArtifactsMap.values();
185 Either<Map<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>>, ResponseFormat> parsedArtifactsPerGroupEither = createArtifactsTemplateCollection(csarInfo, updatedResource, createdNewArtifacts,
186 createdDeploymentArtifactsAfterDelete, labelCounter, parsedArifactsCollection);
187 if(parsedArtifactsPerGroupEither.isRight()){
188 log.error("Failed to parse artifacts. Status is {} ", parsedArtifactsPerGroupEither.right().value());
189 return Either.right(parsedArtifactsPerGroupEither.right().value());
192 Map<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>> parsedGroup = parsedArtifactsPerGroupEither.left().value();
194 // find master in group
195 Map<GroupDefinition, Map<ArtifactDefinition, List<ArtifactDefinition>>> groupArtifact = findMasterArtifactInGroup(
196 groups, deploymentArtifact);
198 ///////////////////////////////// find artifacts to
199 ///////////////////////////////// delete////////////////////////////////////////////////////
202 Map<String, List<ArtifactDefinition>> groupToDelete = new HashMap<>();
203 Set<ArtifactDefinition> artifactsToDelete = findArtifactThatNotInGroupToDelete(parsedGroup, createdDeploymentArtifactsAfterDelete);
205 Set<ArtifactTemplateInfo> jsonMasterArtifacts = parsedGroup.keySet();
206 Map<GroupDefinition, MergedArtifactInfo> mergedgroup = mergeGroupInUpdateFlow(groupArtifact, parsedGroup,
207 artifactsToDelete, groupToDelete, jsonMasterArtifacts, createdDeploymentArtifactsAfterDelete);
209 List<ArtifactDefinition> deletedArtifacts = new ArrayList<>();
210 Either<Resource, ResponseFormat> deletedArtifactsEither = deleteArtifactsInUpdateCsarFlow(
211 updatedResource, csarInfo.getModifier(), shouldLock, inTransaction, artifactsToDelete, groupToDelete, deletedArtifacts);
212 if (deletedArtifactsEither.isRight()) {
213 log.debug("Failed to delete artifacts. Status is {} ", deletedArtifactsEither.right().value());
215 return Either.right(deletedArtifactsEither.right().value());
218 updatedResource = deletedArtifactsEither.left().value();
220 // need to update resource if we updated artifacts
221 excludeDeletedArtifacts(deletedArtifacts, createdDeploymentArtifactsAfterDelete);
223 ////////////// dissociate, associate or create
224 ////////////// artifacts////////////////////////////
225 Either<Resource, ResponseFormat> assDissotiateEither = associateAndDissociateArtifactsToGroup(csarInfo,
226 updatedResource, createdNewArtifacts, labelCounter,
227 createdDeploymentArtifactsAfterDelete, mergedgroup, deletedArtifacts);
228 groups = updatedResource.getGroups();
229 if (assDissotiateEither.isRight()) {
230 log.debug("Failed to delete artifacts. Status is {} ", assDissotiateEither.right().value());
231 return Either.right(assDissotiateEither.right().value());
234 updatedResource = assDissotiateEither.left().value();
235 deploymentArtifact = updatedResource.getDeploymentArtifacts();
237 createdDeploymentArtifactsAfterDelete = deploymentArtifact.values().stream()
238 .collect(Collectors.toList());
240 // update vfModule names
241 Set<GroupDefinition> groupForAssociateWithMembers = mergedgroup.keySet();
242 Either<Resource, ResponseFormat> validateUpdateVfGroupNamesRes = updateVfModuleNames(createdNewArtifacts,
243 updatedResource, groups, createdDeploymentArtifactsAfterDelete, groupForAssociateWithMembers);
244 if (validateUpdateVfGroupNamesRes != null) return validateUpdateVfGroupNamesRes;
246 //////////////// create new artifacts in update
247 //////////////// flow////////////////////////////
248 List<ArtifactTemplateInfo> newArtifactsGroup = createNewArtifcats(parsedGroup, groupArtifact);
249 Either<Resource, ResponseFormat> validateGroupNamesRes = handleArtifactsInGroup(csarInfo, createdNewArtifacts,
250 updatedResource, groups, createdDeploymentArtifactsAfterDelete, labelCounter, newArtifactsGroup);
251 if (validateGroupNamesRes != null) return validateGroupNamesRes;
254 Either<Resource, ResponseFormat> updateVersionEither = updateGroupVersion(updatedResource, groupForAssociateWithMembers);
255 if (updateVersionEither != null) return updateVersionEither;
256 if (!CollectionUtils.isEmpty(artifactsWithoutGroups)) {
257 for (ArtifactTemplateInfo t : artifactsWithoutGroups) {
258 List<ArtifactTemplateInfo> artifacts = new ArrayList<>();
260 Either<Resource, ResponseFormat> resStatus = createGroupDeploymentArtifactsFromCsar(csarInfo, updatedResource,
261 artifacts, createdNewArtifacts, createdDeploymentArtifactsAfterDelete, labelCounter);
262 if (checkResponse(resStatus)) return resStatus;
267 Either<Resource, StorageOperationStatus> eitherGetResource = toscaOperationFacade.getToscaElement(updatedResource.getUniqueId());
268 return mapResult(eitherGetResource, updatedResource);
271 private Either<Resource, ResponseFormat> handleArtifactsInGroup(CsarInfo csarInfo, List<ArtifactDefinition> createdNewArtifacts,
272 Resource updatedResource, List<GroupDefinition> groups,
273 List<ArtifactDefinition> createdDeploymentArtifactsAfterDelete,
274 int labelCounter, List<ArtifactTemplateInfo> newArtifactsGroup) {
275 if (!newArtifactsGroup.isEmpty()) {
276 Collections.sort(newArtifactsGroup, ArtifactTemplateInfo::compareByGroupName);
277 int startGroupCounter = groupBusinessLogic.getNextVfModuleNameCounter(groups);
278 Either<Boolean, ResponseFormat> validateGroupNamesRes = groupBusinessLogic
279 .validateGenerateVfModuleGroupNames(newArtifactsGroup, updatedResource.getSystemName(), startGroupCounter);
280 if (validateGroupNamesRes.isRight()) {
281 return Either.right(validateGroupNamesRes.right().value());
283 Either<Resource, ResponseFormat> resStatus = createGroupDeploymentArtifactsFromCsar(csarInfo, updatedResource,
284 newArtifactsGroup, createdNewArtifacts, createdDeploymentArtifactsAfterDelete, labelCounter);
285 checkResponse(resStatus);
290 private boolean checkResponse(Either<Resource, ResponseFormat> resStatus) {
291 return (resStatus.isRight());
294 private Either<Resource, ResponseFormat> updateVfModuleNames(List<ArtifactDefinition> createdNewArtifacts, Resource updatedResource, List<GroupDefinition> groups, List<ArtifactDefinition> createdDeploymentArtifactsAfterDelete, Set<GroupDefinition> groupForAssociateWithMembers) {
295 if (!CollectionUtils.isEmpty(groups)) {
296 Either<List<GroupDefinition>, ResponseFormat> validateUpdateVfGroupNamesRes = groupBusinessLogic
297 .validateUpdateVfGroupNamesOnGraph(groups, updatedResource);
298 if (validateUpdateVfGroupNamesRes.isRight()) {
299 return Either.right(validateUpdateVfGroupNamesRes.right().value());
301 updateGroupMemebers(groups, groupForAssociateWithMembers, createdNewArtifacts, createdDeploymentArtifactsAfterDelete);
306 private Either<Resource, ResponseFormat> updateGroupVersion(Resource updatedResource, Set<GroupDefinition> groupForAssociateWithMembers) {
307 if (!groupForAssociateWithMembers.isEmpty()) {
309 List<GroupDefinition> groupsId = groupForAssociateWithMembers.stream()
310 .collect(Collectors.toList());
312 Either<List<GroupDefinition>, ResponseFormat> updateVersionEither = groupBusinessLogic
313 .updateGroups(updatedResource, groupsId, true);
314 if (updateVersionEither.isRight()) {
315 log.debug("Failed to update groups version. Status is {} ", updateVersionEither.right().value());
317 return Either.right(updateVersionEither.right().value());
324 private IntStream toStream(OptionalInt optionalInt) {
325 if (optionalInt.isPresent()) {
326 return IntStream.of(optionalInt.getAsInt());
328 return IntStream.empty();
331 private OptionalInt getNextInt(String artifactLabel) {
332 try(Scanner scanner = new Scanner(artifactLabel).useDelimiter(LABEL_COUNTER_DELIMITER)) {
333 if (scanner.hasNextInt()) {
334 return OptionalInt.of(scanner.nextInt());
336 return OptionalInt.empty();
340 private boolean isLastCharacterInLabelADigit(String artifactLabel) {
341 return Character.isDigit(artifactLabel.charAt(artifactLabel.length()-1));
344 private Either<Resource, ResponseFormat> mapResult(Either<Resource, StorageOperationStatus> result, Resource resource) {
345 return result.right()
346 .map(status -> componentsUtils.getResponseFormatByResource(
347 componentsUtils.convertFromStorageResponse(status), resource));
351 private void updateGroupMemebers(List<GroupDefinition> groups, Set<GroupDefinition> groupForAssociateWithMembers, List<ArtifactDefinition> createdNewArtifacts, List<ArtifactDefinition> createdDeploymentArtifactsAfterDelete) {
352 List<GroupDefinition> heatGroups = collectGroupsWithMembers(groups);
354 for (GroupDefinition updatedGroupDef : groupForAssociateWithMembers) {
355 Map<String, String> members = new HashMap<>();
356 Set<String> artifactsGroup = new HashSet<>();
357 artifactsGroup.addAll(updatedGroupDef.getArtifacts());
358 associateMembersToArtifacts(createdNewArtifacts, createdDeploymentArtifactsAfterDelete, heatGroups,
359 artifactsGroup, members);
361 updatedGroupDef.setMembers(members);
370 private List<GroupDefinition> collectGroupsWithMembers(List<GroupDefinition> groups) {
371 return groups.stream()
372 .filter(e -> e.getMembers() != null)
373 .collect(Collectors.toList());
378 * Exclude deleted Artificats from Deployment Artifcats
379 * @param deletedArtifacts
380 * @param createdDeploymentArtifactsAfterDelete
382 private void excludeDeletedArtifacts(List<ArtifactDefinition> deletedArtifacts, List<ArtifactDefinition> createdDeploymentArtifactsAfterDelete) {
383 for (ArtifactDefinition deletedArtifact : deletedArtifacts) {
384 ArtifactDefinition artToRemove = null;
385 for (ArtifactDefinition artFromResource : createdDeploymentArtifactsAfterDelete) {
386 if (deletedArtifact.getUniqueId().equalsIgnoreCase(artFromResource.getUniqueId())) {
387 artToRemove = artFromResource;
391 if (artToRemove != null) {
392 createdDeploymentArtifactsAfterDelete.remove(artToRemove);
399 private void deleteGroupsByType(List<GroupDefinition> groups, String groupType, Resource resource) {
401 List<GroupDefinition> listToDelete = groups.stream()
402 .filter(g -> g.getType().equals(groupType))
403 .collect(Collectors.toList());
405 groupBusinessLogic.deleteGroups(resource, listToDelete);
410 private List<ArtifactTemplateInfo> createNewArtifcats(Map<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>> parsedGroup, Map<GroupDefinition, Map<ArtifactDefinition, List<ArtifactDefinition>>> groupArtifact) {
411 List<ArtifactTemplateInfo> newArtifactsGroup = new ArrayList<>();
413 for (Entry<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>> parsedGroupSetEntry : parsedGroup.entrySet()) {
414 ArtifactTemplateInfo parsedArtifactMaster = parsedGroupSetEntry.getKey();
415 boolean isNewGroup = true;
416 for (Entry<GroupDefinition, Map<ArtifactDefinition, List<ArtifactDefinition>>> groupListEntry : groupArtifact
418 Map<ArtifactDefinition, List<ArtifactDefinition>> groupArtifacts = groupListEntry.getValue();
419 Set<ArtifactDefinition> group = groupArtifacts.keySet();
420 for (ArtifactDefinition artifactInfo : group) {
421 if (parsedArtifactMaster.getFileName().equalsIgnoreCase(artifactInfo.getArtifactName())) {
422 parsedArtifactMaster.setGroupName(groupListEntry.getKey().getName());
428 newArtifactsGroup.add(parsedArtifactMaster);
432 return newArtifactsGroup;
435 private Set<ArtifactDefinition> findArtifactThatNotInGroupToDelete(
436 Map<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>> parsedGroup,
437 List<ArtifactDefinition> createdDeploymentArtifactsAfterDelete) {
438 Set<ArtifactDefinition> artifactsToDelete = new HashSet<>();
439 for (Entry<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>> parsedGroupSetEntry : parsedGroup.entrySet()) {
440 Set<ArtifactTemplateInfo> artifactsNames = parsedGroupSetEntry.getValue();
441 for (ArtifactTemplateInfo template : artifactsNames) {
442 if(template.getType().equals(ArtifactTypeEnum.HEAT_ARTIFACT.getType())){
443 Optional<ArtifactDefinition> op = createdDeploymentArtifactsAfterDelete.stream().filter(a -> a.getArtifactName().equalsIgnoreCase(template.getFileName())).findAny();
444 if (op.isPresent() && !op.get().getArtifactType().equalsIgnoreCase(template.getType())) {
445 artifactsToDelete.add(op.get());
451 return artifactsToDelete;
455 private Either<Resource, ResponseFormat> createResourceArtifacts(CsarInfo csarInfo, Resource resource,
456 Map<String, List<ArtifactTemplateInfo>> artifactsMap,
457 List<ArtifactDefinition> createdArtifacts) {
459 Either<Resource, ResponseFormat> resStatus = Either.left(resource);
461 Collection<List<ArtifactTemplateInfo>> arifactsCollection = artifactsMap.values();
463 for (List<ArtifactTemplateInfo> groupTemplateList : arifactsCollection) {
464 if (groupTemplateList != null) {
465 resStatus = createGroupDeploymentArtifactsFromCsar(csarInfo, resource, groupTemplateList,
466 createdArtifacts, 0);
467 if (resStatus.isRight()) {
478 private Either<Map<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>>, ResponseFormat> createArtifactsTemplateCollection(
479 CsarInfo csarInfo, Resource resource,
480 List<ArtifactDefinition> createdNewArtifacts,
481 List<ArtifactDefinition> createdDeploymentArtifactsAfterDelete, int labelCounter,
482 Collection<List<ArtifactTemplateInfo>> parsedArifactsCollection) {
484 Map<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>> parsedGroup = new HashMap<>();
486 for (List<ArtifactTemplateInfo> parsedGroupTemplateList : parsedArifactsCollection) {
488 for (ArtifactTemplateInfo parsedGroupTemplate : parsedGroupTemplateList) {
489 if (parsedGroupTemplate.getGroupName() != null) {
490 parsedGroupTemplate.setGroupName("");
491 Set<ArtifactTemplateInfo> parsedArtifactsNames = new HashSet<>();
492 parsedArtifactsNames.add(parsedGroupTemplate);
493 List<ArtifactTemplateInfo> relatedGroupTemplateList = parsedGroupTemplate.getRelatedArtifactsInfo();
494 if (relatedGroupTemplateList != null && !relatedGroupTemplateList.isEmpty()) {
495 createArtifactsGroupSet(parsedGroupTemplateList, parsedArtifactsNames);
497 parsedGroup.put(parsedGroupTemplate, parsedArtifactsNames);
499 List<ArtifactTemplateInfo> arrtifacts = new ArrayList<>();
500 arrtifacts.add(parsedGroupTemplate);
501 Either<Resource, ResponseFormat> resStatus = createGroupDeploymentArtifactsFromCsar(csarInfo,
502 resource, arrtifacts, createdNewArtifacts, createdDeploymentArtifactsAfterDelete,
504 if (resStatus.isRight()) {
505 return Either.right(resStatus.right().value());
512 return Either.left(parsedGroup);
515 @SuppressWarnings({ "unchecked", "static-access" })
516 public Either<Map<String, List<ArtifactTemplateInfo>>, ResponseFormat> parseResourceArtifactsInfoFromFile(
517 Resource resource, String artifactsMetaFile, String artifactFileName) {
520 JsonObject jsonElement = new JsonObject();
521 jsonElement = gson.fromJson(artifactsMetaFile, jsonElement.getClass());
523 JsonElement importStructureElement = jsonElement.get(Constants.IMPORT_STRUCTURE);
524 if (importStructureElement == null || importStructureElement.isJsonNull()) {
525 log.debug(ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMAT_FILE_NAME, artifactFileName);
526 BeEcompErrorManager.getInstance().logInternalDataError(
527 ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMAT_FILE_NAME + artifactFileName,
528 ARTIFACT_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
530 .right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, artifactFileName));
533 Map<String, List<Map<String, Object>>> artifactTemplateMap;
534 artifactTemplateMap = ComponentsUtils.parseJsonToObject(importStructureElement.toString(), HashMap.class);
535 if (artifactTemplateMap.isEmpty()) {
536 log.debug(ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMAT_FILE_NAME, artifactFileName);
537 BeEcompErrorManager.getInstance().logInternalDataError(
538 ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMAT_FILE_NAME + artifactFileName,
539 ARTIFACT_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
541 .right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, artifactFileName));
544 Set<String> artifactsTypeKeys = artifactTemplateMap.keySet();
545 Map<String, List<ArtifactTemplateInfo>> artifactsMap = new HashMap<>();
546 List<ArtifactTemplateInfo> allGroups = new ArrayList<>();
547 for (String artifactsTypeKey : artifactsTypeKeys) {
549 Either <List<ArtifactTemplateInfo>, ResponseFormat> artifactTemplateInfoListEither = parseArtifactTemplateList(artifactFileName,
550 artifactTemplateMap, allGroups, artifactsTypeKey);
551 if(artifactTemplateInfoListEither.isRight()){
552 return Either.right(artifactTemplateInfoListEither.right().value());
554 artifactsMap.put(artifactsTypeKey, artifactTemplateInfoListEither.left().value());
556 int counter = groupBusinessLogic.getNextVfModuleNameCounter(resource.getGroups());
557 Either<Boolean, ResponseFormat> validateGroupNamesRes = groupBusinessLogic
558 .validateGenerateVfModuleGroupNames(allGroups, resource.getSystemName(), counter);
559 if (validateGroupNamesRes.isRight()) {
560 return Either.right(validateGroupNamesRes.right().value());
562 return Either.left(artifactsMap);
563 } catch (Exception e) {
564 log.debug(ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMAT_FILE_NAME, artifactFileName);
565 log.debug("failed with exception.", e);
566 BeEcompErrorManager.getInstance().logInternalDataError(
567 ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMAT_FILE_NAME + artifactFileName,
568 ARTIFACT_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
569 return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, artifactFileName));
574 private Either< List<ArtifactTemplateInfo>, ResponseFormat> parseArtifactTemplateList(String artifactFileName,
575 Map<String, List<Map<String, Object>>> artifactTemplateMap, List<ArtifactTemplateInfo> allGroups,
576 String artifactsTypeKey) {
577 List<Map<String, Object>> o = artifactTemplateMap.get(artifactsTypeKey);
578 Either<List<ArtifactTemplateInfo>, ResponseFormat> artifactTemplateInfoListPairStatus = createArtifactTemplateInfoModule(
579 artifactsTypeKey, o);
580 if (artifactTemplateInfoListPairStatus.isRight()) {
581 log.debug(ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMAT_FILE_NAME, artifactFileName);
582 BeEcompErrorManager.getInstance().logInternalDataError(
583 ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMAT_FILE_NAME + artifactFileName,
584 ARTIFACT_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
585 return Either.right(artifactTemplateInfoListPairStatus.right().value());
587 List<ArtifactTemplateInfo> artifactTemplateInfoList = artifactTemplateInfoListPairStatus.left().value();
588 if (artifactTemplateInfoList == null) {
589 log.debug(ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMAT_FILE_NAME, artifactFileName);
590 BeEcompErrorManager.getInstance().logInternalDataError(
591 ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMAT_FILE_NAME + artifactFileName,
592 ARTIFACT_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
594 componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, artifactFileName));
597 if (!artifactsTypeKey.equalsIgnoreCase(ArtifactTemplateInfo.CSAR_ARTIFACT)) {
598 allGroups.addAll(artifactTemplateInfoList);
600 return Either.left(artifactTemplateInfoList);
603 private Either<List<ArtifactTemplateInfo>, ResponseFormat> createArtifactTemplateInfoModule(String artifactsTypeKey,
604 List<Map<String, Object>> jsonObject) {
605 List<ArtifactTemplateInfo> artifactTemplateInfoList = new ArrayList<>();
606 for (Map<String, Object> o : jsonObject) {
607 Either<ArtifactTemplateInfo, ResponseFormat> artifacttemplateInfoStatus = ArtifactTemplateInfo
608 .createArtifactTemplateInfoFromJson(componentsUtils, artifactsTypeKey, o, artifactTemplateInfoList,
610 if (artifacttemplateInfoStatus.isRight()) {
611 return Either.right(artifacttemplateInfoStatus.right().value());
614 ArtifactTemplateInfo artifacttemplateInfo = artifacttemplateInfoStatus.left().value();
615 if (artifacttemplateInfo != null) {
616 artifactTemplateInfoList.add(artifacttemplateInfo);
620 return Either.left(artifactTemplateInfoList);
625 private Either<Resource, ResponseFormat> createGroupDeploymentArtifactsFromCsar(CsarInfo csarInfo,
626 Resource resource, List<ArtifactTemplateInfo> artifactsTemplateList,
627 List<ArtifactDefinition> createdArtifacts, int labelCounter) {
628 List<GroupDefinition> createdGroups = resource.getGroups();
629 List<GroupDefinition> heatGroups = null;
630 if (!CollectionUtils.isEmpty(createdGroups)) {
631 heatGroups = collectGroupsWithMembers(createdGroups);
633 List<GroupDefinition> needToCreate = new ArrayList<>();
634 for (ArtifactTemplateInfo groupTemplateInfo : artifactsTemplateList) {
635 String groupName = groupTemplateInfo.getGroupName();
636 Set<String> artifactsGroup = new HashSet<>();
637 Set<String> artifactsUUIDGroup = new HashSet<>();
639 log.debug("createDeploymentArtifactsFromCsar start");
640 Either<Resource, ResponseFormat> resStatus = createDeploymentArtifactFromCsar(csarInfo, ARTIFACTS_PATH, resource, artifactsGroup,
641 artifactsUUIDGroup, groupTemplateInfo, createdArtifacts, labelCounter);
642 log.debug("createDeploymentArtifactsFromCsar end");
643 if (resStatus.isRight()) {
646 Map<String, ArtifactDefinition> createdArtifactsMap = createdArtifacts.stream().collect(Collectors.toMap(
647 ArtifactDataDefinition::getArtifactLabel, artifact -> artifact));
648 resource.setDeploymentArtifacts(createdArtifactsMap);
649 if (groupName != null && !groupName.isEmpty()) {
651 Either<GroupDefinition, ResponseFormat> groupDefinitionEither = buildGroupDefinition(createdArtifacts, heatGroups, groupTemplateInfo,
652 groupName, artifactsGroup, artifactsUUIDGroup);
653 if (groupDefinitionEither.isRight()) {
654 return Either.right(groupDefinitionEither.right().value());
656 needToCreate.add(groupDefinitionEither.left().value());
659 Map<String, ArtifactDefinition> createdArtifactsMap = createdArtifacts.stream().collect(Collectors.toMap(
660 ArtifactDataDefinition::getArtifactLabel, artifact -> artifact));
661 resource.setDeploymentArtifacts(createdArtifactsMap);
663 Either<List<GroupDefinition>, ResponseFormat> createGroups = groupBusinessLogic
664 .addGroups(resource, needToCreate, false);
665 if (createGroups.isRight()) {
666 return Either.right(createGroups.right().value());
669 return Either.left(resource);
672 private Either<GroupDefinition, ResponseFormat> buildGroupDefinition(List<ArtifactDefinition> createdArtifacts,
673 List<GroupDefinition> heatGroups, ArtifactTemplateInfo groupTemplateInfo, String groupName,
674 Set<String> artifactsGroup, Set<String> artifactsUUIDGroup) {
676 Map<String, String> members = new HashMap<>();
678 associateMembersToArtifacts(createdArtifacts, null, heatGroups, artifactsGroup, members);
680 List<String> artifactsList = new ArrayList<>(artifactsGroup);
681 List<String> artifactsUUIDList = new ArrayList<>(artifactsUUIDGroup);
683 GroupDefinition groupDefinition = new GroupDefinition();
684 groupDefinition.setName(groupName);
685 groupDefinition.setType(Constants.DEFAULT_GROUP_VF_MODULE);
686 groupDefinition.setArtifacts(artifactsList);
687 groupDefinition.setArtifactsUuid(artifactsUUIDList);
689 if (!members.isEmpty()) {
690 groupDefinition.setMembers(members);
692 List<GroupProperty> properties = new ArrayList<>();
693 GroupProperty prop = new GroupProperty();
694 prop.setName(Constants.IS_BASE);
695 prop.setValue(Boolean.toString(groupTemplateInfo.isBase()));
696 properties.add(prop);
697 Either<GroupTypeDefinition, StorageOperationStatus> getLatestGroupTypeRes = groupTypeOperation
698 .getLatestGroupTypeByType(Constants.DEFAULT_GROUP_VF_MODULE, true);
699 if (getLatestGroupTypeRes.isRight()) {
700 return Either.right(componentsUtils.getResponseFormat(
701 componentsUtils.convertFromStorageResponse(getLatestGroupTypeRes.right().value())));
703 properties = createVfModuleAdditionalProperties(groupTemplateInfo.isBase(), groupName, properties,
704 createdArtifacts, artifactsList, getLatestGroupTypeRes.left().value());
705 groupDefinition.convertFromGroupProperties(properties);
706 log.debug("createGroup start");
707 return Either.left(groupDefinition);
710 private Either<Resource, ResponseFormat> createDeploymentArtifactFromCsar(CsarInfo csarInfo, String artifactPath,
711 Resource resource, Set<String> artifactsGroup, Set<String> artifactsUUIDGroup,
712 ArtifactTemplateInfo artifactTemplateInfo, List<ArtifactDefinition> createdArtifacts, int labelCounter) {
713 Either<Resource, ResponseFormat> resStatus = Either.left(resource);
715 String artifactUid = "";
716 String artifactEnvUid = "";
717 String artifactUUID = "";
720 // check if artifacts already exist
721 Either<ArtifactDefinition, ResponseFormat> createdArtifactEther = checkIfArtifactAlreadyExist(artifactTemplateInfo, createdArtifacts);
722 if(createdArtifactEther.isRight()){
723 return Either.right(createdArtifactEther.right().value());
725 ArtifactDefinition createdArtifact = createdArtifactEther.left().value();
726 if(createdArtifact == null){
728 Either<ArtifactDefinition, ResponseFormat> newArtifactEither = createDeploymentArtifact(csarInfo, resource,
729 artifactPath, artifactTemplateInfo, createdArtifacts, labelCounter);
730 if (newArtifactEither.isRight()) {
731 resStatus = Either.right(newArtifactEither.right().value());
734 ArtifactDefinition newArtifact = newArtifactEither.left().value();
735 artifactUid = newArtifact.getUniqueId();
736 artifactUUID = newArtifact.getArtifactUUID();
738 final ArtifactTypeEnum artifactType = ArtifactTypeEnum.parse(newArtifact.getArtifactType());
739 if (artifactType == ArtifactTypeEnum.HEAT || artifactType == ArtifactTypeEnum.HEAT_NET
740 || artifactType == ArtifactTypeEnum.HEAT_VOL) {
741 ArtifactDefinition createHeatEnvPlaceHolder = artifactsBusinessLogic
742 .createHeatEnvPlaceHolder(createdArtifacts, newArtifact, ArtifactsBusinessLogic.HEAT_VF_ENV_NAME,
743 resource.getUniqueId(), NodeTypeEnum.Resource, resource.getName(),
744 csarInfo.getModifier(), resource, null);
745 artifactEnvUid = createHeatEnvPlaceHolder.getUniqueId();
748 artifactUid = createdArtifact.getUniqueId();
749 artifactUUID = createdArtifact.getArtifactUUID();
750 artifactEnvUid = checkAndGetHeatEnvId(createdArtifact);
752 artifactsGroup.add(artifactUid);
753 artifactsUUIDGroup.add(artifactUUID);
754 if (!artifactEnvUid.isEmpty()) {
755 artifactsGroup.add(artifactEnvUid);
758 List<ArtifactTemplateInfo> relatedArtifacts = artifactTemplateInfo.getRelatedArtifactsInfo();
759 if (relatedArtifacts != null) {
760 for (ArtifactTemplateInfo relatedArtifactTemplateInfo : relatedArtifacts) {
761 resStatus = createDeploymentArtifactFromCsar(csarInfo, artifactPath, resource, artifactsGroup,
762 artifactsUUIDGroup, relatedArtifactTemplateInfo, createdArtifacts, labelCounter);
763 if (resStatus.isRight()) {
771 private String checkAndGetHeatEnvId(ArtifactDefinition createdArtifact) {
772 String artifactEnvUid = "";
773 final ArtifactTypeEnum artifactType = ArtifactTypeEnum.parse(createdArtifact.getArtifactType());
774 if (artifactType == ArtifactTypeEnum.HEAT || artifactType == ArtifactTypeEnum.HEAT_NET
775 || artifactType == ArtifactTypeEnum.HEAT_VOL) {
776 artifactEnvUid = createdArtifact.getUniqueId() + ArtifactsBusinessLogic.HEAT_ENV_SUFFIX;
778 return artifactEnvUid;
781 private Either<ArtifactDefinition, ResponseFormat> checkIfArtifactAlreadyExist(ArtifactTemplateInfo artifactTemplateInfo, List<ArtifactDefinition> createdArtifacts){
783 ArtifactDefinition res = null;
784 String artifactFileName = artifactTemplateInfo.getFileName();
785 Optional<ArtifactDefinition> op = createdArtifacts.stream().filter(a -> a.getArtifactName().equals(artifactFileName)).findAny();
788 if (!res.getArtifactType().equalsIgnoreCase(artifactTemplateInfo.getType())) {
789 log.debug(ARTIFACT_WITH_NAME_AND_TYPE_ALREADY_EXIST_WITH_TYPE, artifactFileName,
790 artifactTemplateInfo.getType(), res.getArtifactType());
791 BeEcompErrorManager.getInstance().logInternalDataError(
792 ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMAT_FILE_NAME + artifactFileName,
793 ARTIFACT_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
794 return Either.right(componentsUtils.getResponseFormat(
795 ActionStatus.ARTIFACT_ALREADY_EXIST_IN_DIFFERENT_TYPE_IN_CSAR, artifactFileName,
796 artifactTemplateInfo.getType(), res.getArtifactType()));
799 return Either.left(res);
804 private Either<ArtifactDefinition, ResponseFormat> createDeploymentArtifact(CsarInfo csarInfo, Resource resource,
805 String artifactPath, ArtifactTemplateInfo artifactTemplateInfo, List<ArtifactDefinition> createdArtifacts,
807 int updatedlabel = label;
808 final String artifactFileName = artifactTemplateInfo.getFileName();
809 Either<ImmutablePair<String, byte[]>, ResponseFormat> artifactContentStatus = CsarValidationUtils
810 .getArtifactContent(csarInfo.getCsarUUID(), csarInfo.getCsar(), artifactPath + artifactFileName,
811 artifactFileName, componentsUtils);
812 if (artifactContentStatus.isRight()) {
813 return Either.right(artifactContentStatus.right().value());
815 updatedlabel += createdArtifacts.size();
817 Map<String, Object> json = ArtifactUtils.buildJsonForArtifact(artifactTemplateInfo,
818 artifactContentStatus.left().value().getValue(), updatedlabel, true);
820 Either<Either<ArtifactDefinition, Operation>, ResponseFormat> uploadArtifactToService = createOrUpdateCsarArtifactFromJson(
821 resource, csarInfo.getModifier(), json,
822 new ArtifactOperationInfo(false, false, ArtifactOperationEnum.CREATE));
824 if (uploadArtifactToService.isRight()) {
825 return Either.right(uploadArtifactToService.right().value());
828 ArtifactDefinition currentInfo = uploadArtifactToService.left().value().left().value();
829 if (currentInfo.getHeatParameters() != null) {
831 Either<ArtifactDefinition, ResponseFormat> updateEnvEither = updateHeatParamsFromCsar(resource, csarInfo,
832 artifactTemplateInfo, currentInfo, false);
833 if (updateEnvEither.isRight()) {
834 log.debug("failed to update parameters to artifact {}", artifactFileName);
835 return Either.right(updateEnvEither.right().value());
838 currentInfo = updateEnvEither.left().value();
842 createdArtifacts.add(currentInfo);
844 return Either.left(currentInfo);
850 private Either<ArtifactDefinition, ResponseFormat> updateHeatParamsFromCsar(Resource resource, CsarInfo csarInfo,
851 ArtifactTemplateInfo artifactTemplateInfo, ArtifactDefinition currentInfo, boolean isUpdateEnv) {
853 Resource updatedResource = resource;
854 Either<ArtifactDefinition, ResponseFormat> resStatus = Either.left(currentInfo);
855 if (artifactTemplateInfo.getEnv() != null && !artifactTemplateInfo.getEnv().isEmpty()) {
857 Either<ImmutablePair<String, byte[]>, ResponseFormat> artifactParamsStatus = CsarValidationUtils
858 .getArtifactContent(csarInfo.getCsarUUID(), csarInfo.getCsar(),
859 CsarUtils.ARTIFACTS_PATH + artifactTemplateInfo.getEnv(), artifactTemplateInfo.getEnv(),
861 if (artifactParamsStatus.isRight()) {
862 resStatus = Either.right(artifactParamsStatus.right().value());
865 Either<List<HeatParameterDefinition>, ResponseFormat> propsStatus = extractHeatParameters(
866 ArtifactTypeEnum.HEAT_ENV.getType(), artifactTemplateInfo.getEnv(),
867 artifactParamsStatus.left().value().getValue(), false);
869 if (propsStatus.isLeft()) {
870 List<HeatParameterDefinition> updatedHeatEnvParams = propsStatus.left().value();
871 resStatus = updateHeatParams(updatedResource, currentInfo, updatedHeatEnvParams);
872 if (resStatus.isRight()) {
879 Map<String, ArtifactDefinition> artifacts = updatedResource.getDeploymentArtifacts();
880 Optional<ArtifactDefinition> op = artifacts.values().stream().filter(
881 p -> p.getGeneratedFromId() != null && p.getGeneratedFromId().equals(currentInfo.getUniqueId()))
883 if (op.isPresent()) {
884 ArtifactDefinition artifactInfoHeatEnv = op.get();
885 artifactInfoHeatEnv.setHeatParamUpdated(true);
886 Either<ArtifactDefinition, StorageOperationStatus> updateArtifactOnResource = artifactToscaOperation
887 .updateArtifactOnResource(artifactInfoHeatEnv, updatedResource,
888 artifactInfoHeatEnv.getUniqueId(), null, null,true);
889 if (updateArtifactOnResource.isRight()) {
890 log.debug("Failed to update heat env on CSAR flow for component {} artifact {} label {}",
891 updatedResource.getUniqueId(), artifactInfoHeatEnv.getUniqueId(),
892 artifactInfoHeatEnv.getArtifactLabel());
893 return Either.right(componentsUtils.getResponseFormat(
894 componentsUtils.convertFromStorageResponse(updateArtifactOnResource.right().value())));
896 resource.getDeploymentArtifacts().put(updateArtifactOnResource.left().value().getArtifactLabel(), updateArtifactOnResource.left().value());
897 resStatus = Either.left(updateArtifactOnResource.left().value());
904 private Either<List<HeatParameterDefinition>, ResponseFormat> extractHeatParameters(String artifactType,
905 String fileName, byte[] content, boolean is64Encoded) {
906 // extract heat parameters
907 String heatDecodedPayload = is64Encoded ? new String(Base64.decodeBase64(content)) : new String(content);
908 Either<List<HeatParameterDefinition>, ResultStatusEnum> heatParameters = ImportUtils
909 .getHeatParamsWithoutImplicitTypes(heatDecodedPayload, artifactType);
910 if (heatParameters.isRight()) {
911 log.debug("File {} is not in expected key-value form in csar ", fileName);
912 BeEcompErrorManager.getInstance().logInternalDataError(
913 "File " + fileName + " is not in expected key-value form in csar ", "CSAR internals are invalid",
914 ErrorSeverity.ERROR);
916 .right(componentsUtils.getResponseFormat(ActionStatus.INVALID_DEPLOYMENT_ARTIFACT_HEAT, fileName));
919 return Either.left(heatParameters.left().value());
923 private Either<ArtifactDefinition, ResponseFormat> updateHeatParams(Resource resource,
924 ArtifactDefinition currentInfo, List<HeatParameterDefinition> updatedHeatEnvParams) {
926 Either<ArtifactDefinition, ResponseFormat> resStatus = Either.left(currentInfo);
927 List<HeatParameterDefinition> currentHeatEnvParams = currentInfo.getListHeatParameters();
929 if (updatedHeatEnvParams != null && !updatedHeatEnvParams.isEmpty() && currentHeatEnvParams != null
930 && !currentHeatEnvParams.isEmpty()) {
933 for (HeatParameterDefinition heatEnvParam : updatedHeatEnvParams) {
935 paramName = heatEnvParam.getName();
936 for (HeatParameterDefinition currHeatParam : currentHeatEnvParams) {
937 if (paramName.equalsIgnoreCase(currHeatParam.getName())) {
939 String updatedParamValue = heatEnvParam.getCurrentValue();
940 if (updatedParamValue == null) {
941 updatedParamValue = heatEnvParam.getDefaultValue();
943 HeatParameterType paramType = HeatParameterType.isValidType(currHeatParam.getType());
944 if (!paramType.getValidator().isValid(updatedParamValue, null)) {
945 ActionStatus status = ActionStatus.INVALID_HEAT_PARAMETER_VALUE;
946 ResponseFormat responseFormat = componentsUtils.getResponseFormat(status,
947 ArtifactTypeEnum.HEAT_ENV.getType(), paramType.getType(), paramName);
948 resStatus = Either.right(responseFormat);
951 currHeatParam.setCurrentValue(
952 paramType.getConverter().convert(updatedParamValue, null, null));
958 currentInfo.setListHeatParameters(currentHeatEnvParams);
959 Either<ArtifactDefinition, StorageOperationStatus> updateArtifactOnResource = artifactToscaOperation
960 .updateArtifactOnResource(currentInfo, resource, currentInfo.getUniqueId(),
962 if (updateArtifactOnResource.isRight()) {
964 "Failed to update heat parameters of heat on CSAR flow for component {} artifact {} label {}",
965 resource.getUniqueId(), currentInfo.getUniqueId(), currentInfo.getArtifactLabel());
966 return Either.right(componentsUtils.getResponseFormat(
967 componentsUtils.convertFromStorageResponse(updateArtifactOnResource.right().value())));
969 resource.getDeploymentArtifacts().put(currentInfo.getArtifactLabel(), currentInfo);
970 resStatus = Either.left(updateArtifactOnResource.left().value());
975 public Either<Either<ArtifactDefinition, Operation>, ResponseFormat> createOrUpdateCsarArtifactFromJson(
976 Resource resource, User user, Map<String, Object> json, ArtifactOperationInfo operation) {
978 String jsonStr = gson.toJson(json);
979 ArtifactDefinition artifactDefinitionFromJson = RepresentationUtils.convertJsonToArtifactDefinition(jsonStr,
980 ArtifactDefinition.class, false);
982 Either<ArtifactDefinition, Operation> result;
984 result = artifactsBusinessLogic.handleLoadedArtifact(
985 resource, user, operation, false, true, ComponentTypeEnum.RESOURCE, artifactDefinitionFromJson);
986 } catch (ComponentException e) {
987 log.debug(FAILED_UPLOAD_ARTIFACT_TO_COMPONENT, ComponentTypeEnum.RESOURCE, resource.getName());
988 return Either.right(componentsUtils.getResponseFormat(e));
989 } catch (Exception e) {
990 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
991 log.debug("Exception occurred when createOrUpdateCsarArtifactFromJson, error is:{}", e.getMessage(), e);
992 return Either.right(responseFormat);
994 return Either.left(result);
997 private void associateMembersToArtifacts(List<ArtifactDefinition> createdArtifacts,
998 List<ArtifactDefinition> artifactsFromResource, List<GroupDefinition> heatGroups,
999 Set<String> artifactsGroup, Map<String, String> members) {
1000 if (heatGroups != null && !heatGroups.isEmpty()) {
1001 for (GroupDefinition heatGroup : heatGroups) {
1002 List<GroupProperty> grpoupProps = heatGroup.convertToGroupProperties();
1003 if (grpoupProps != null) {
1004 associateMembersToVFgroups(createdArtifacts, artifactsFromResource, grpoupProps, artifactsGroup, heatGroup, members);
1010 private void associateMembersToVFgroups(List<ArtifactDefinition> createdArtifacts, List<ArtifactDefinition> artifactsFromResource, List<GroupProperty> grpoupProps, Set<String> artifactsGroup, GroupDefinition heatGroup, Map<String, String> members){
1011 Optional<GroupProperty> op = grpoupProps.stream()
1012 .filter(p -> p.getName().equals(Constants.HEAT_FILE_PROPS)).findAny();
1013 if (op.isPresent()) {
1014 GroupProperty prop = op.get();
1015 String heatFileNAme = prop.getValue();
1016 if (null == heatFileNAme || heatFileNAme.isEmpty()) {
1019 List<ArtifactDefinition> artifacts = new ArrayList<>();
1020 for (String artifactId : artifactsGroup) {
1021 Optional<ArtifactDefinition> opArt = createdArtifacts.stream()
1022 .filter(p -> p.getUniqueId().equals(artifactId)).findAny();
1023 opArt.ifPresent(artifacts::add);
1024 if (artifactsFromResource != null) {
1025 opArt = artifactsFromResource.stream().filter(p -> p.getUniqueId().equals(artifactId))
1027 opArt.ifPresent(artifacts::add);
1030 Optional<ArtifactDefinition> resOp = artifacts.stream()
1031 .filter(p -> heatFileNAme.contains(p.getArtifactName())).findAny();
1032 resOp.ifPresent(artifactDefinition -> members.putAll(heatGroup.getMembers()));
1036 public List<GroupProperty> createVfModuleAdditionalProperties(boolean isBase, String moduleName,
1037 List<GroupProperty> properties, List<ArtifactDefinition> deploymentArtifacts, List<String> artifactsInGroup,
1038 GroupTypeDefinition groupType) {
1039 Map<String, VfModuleProperty> vfModuleProperties = ConfigurationManager.getConfigurationManager()
1040 .getConfiguration().getVfModuleProperties();
1041 vfModuleProperties.entrySet().forEach(p -> {
1042 GroupProperty prop = new GroupProperty();
1043 prop.setName(p.getKey());
1045 prop.setValue(p.getValue().getForBaseModule());
1046 prop.setDefaultValue(p.getValue().getForBaseModule());
1048 prop.setValue(p.getValue().getForNonBaseModule());
1049 prop.setDefaultValue(p.getValue().getForNonBaseModule());
1051 properties.add(prop);
1054 GroupProperty proplabel = new GroupProperty();
1055 proplabel.setName("vf_module_label");
1057 Matcher matcher = pattern.matcher(moduleName);
1059 if (matcher.find()) {
1060 proplabel.setValue(matcher.group(1));
1061 proplabel.setDefaultValue(matcher.group(1));
1063 proplabel.setValue(moduleName);
1064 proplabel.setDefaultValue(moduleName);
1066 properties.add(proplabel);
1068 GroupProperty propvolume = new GroupProperty();
1069 propvolume.setName("volume_group");
1070 boolean isVolume = false;
1071 for (String artifactId : artifactsInGroup) {
1072 ArtifactDefinition artifactDef = null;
1073 artifactDef = ArtifactUtils.findArtifactInList(deploymentArtifacts, artifactId);
1074 if (artifactDef != null
1075 && artifactDef.getArtifactType().equalsIgnoreCase(ArtifactTypeEnum.HEAT_VOL.getType())) {
1080 propvolume.setValue(String.valueOf(isVolume));
1081 propvolume.setDefaultValue(String.valueOf(isVolume));
1082 properties.add(propvolume);
1083 mergeWithGroupTypeProperties(properties, groupType.getProperties());
1087 private void mergeWithGroupTypeProperties(List<GroupProperty> properties,
1088 List<PropertyDefinition> groupTypeProperties) {
1090 Map<String, GroupProperty> propertiesMap = properties.stream()
1091 .collect(Collectors.toMap(PropertyDataDefinition::getName, p -> p));
1092 for (PropertyDefinition groupTypeProperty : groupTypeProperties) {
1093 if (!propertiesMap.containsKey(groupTypeProperty.getName())) {
1094 properties.add(new GroupProperty(groupTypeProperty));
1099 private Map<GroupDefinition, MergedArtifactInfo> mergeGroupInUpdateFlow(
1100 Map<GroupDefinition, Map<ArtifactDefinition, List<ArtifactDefinition>>> groupArtifact,
1101 Map<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>> parsedGroup, Set<ArtifactDefinition> artifactsToDelete,
1102 Map<String, List<ArtifactDefinition>> groupToDelete, Set<ArtifactTemplateInfo> jsonMasterArtifacts,
1103 List<ArtifactDefinition> createdDeploymentArtifacts) {
1104 Map<GroupDefinition, MergedArtifactInfo> mergedgroup = new HashMap<>();
1105 for (Entry<GroupDefinition, Map<ArtifactDefinition, List<ArtifactDefinition>>> groupListEntry : groupArtifact
1107 Map<ArtifactDefinition, List<ArtifactDefinition>> createdArtifactMap = groupListEntry.getValue();
1108 boolean isNeedToDeleteGroup = true;
1109 List<ArtifactDefinition> listToDelete = null;
1110 for (ArtifactDefinition maserArtifact : createdArtifactMap.keySet()) {
1111 listToDelete = prepareArtifactsToDelete(parsedGroup, artifactsToDelete, createdDeploymentArtifacts, createdArtifactMap, maserArtifact);
1112 if (artifactsToDelete != null && !artifactsToDelete.isEmpty()) {
1113 GroupDefinition group = groupListEntry.getKey();
1114 deleteArtifacts(artifactsToDelete, group);
1118 for (ArtifactTemplateInfo jsonMasterArtifact : jsonMasterArtifacts) {
1119 isNeedToDeleteGroup = isNeedToDeleteGroup(mergedgroup, groupListEntry, createdArtifactMap, isNeedToDeleteGroup, maserArtifact, jsonMasterArtifact);
1123 if (isNeedToDeleteGroup) {
1124 groupToDelete.put(groupListEntry.getKey().getUniqueId(), listToDelete);
1131 private boolean isNeedToDeleteGroup(Map<GroupDefinition, MergedArtifactInfo> mergedgroup, Entry<GroupDefinition, Map<ArtifactDefinition, List<ArtifactDefinition>>> groupListEntry, Map<ArtifactDefinition, List<ArtifactDefinition>> createdArtifactMap, boolean isNeedToDeleteGroup, ArtifactDefinition maserArtifact, ArtifactTemplateInfo jsonMasterArtifact) {
1132 if (maserArtifact.getArtifactName().equalsIgnoreCase(jsonMasterArtifact.getFileName())) {
1133 MergedArtifactInfo mergedGroup = new MergedArtifactInfo();
1134 mergedGroup.setJsonArtifactTemplate(jsonMasterArtifact);
1135 mergedGroup.setCreatedArtifact(createdArtifactMap.get(maserArtifact));
1136 mergedgroup.put(groupListEntry.getKey(), mergedGroup);
1137 isNeedToDeleteGroup = false;
1140 return isNeedToDeleteGroup;
1143 private List<ArtifactDefinition> prepareArtifactsToDelete(Map<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>> parsedGroup, Set<ArtifactDefinition> artifactsToDelete, List<ArtifactDefinition> createdDeploymentArtifacts, Map<ArtifactDefinition, List<ArtifactDefinition>> createdArtifactMap, ArtifactDefinition maserArtifact) {
1144 List<ArtifactDefinition> listToDelete;
1145 listToDelete = createdArtifactMap.get(maserArtifact);
1146 for (ArtifactDefinition artToDelete : listToDelete) {
1147 findArtifactToDelete(parsedGroup, artifactsToDelete, artToDelete, createdDeploymentArtifacts);
1149 return listToDelete;
1152 private void deleteArtifacts(Set<ArtifactDefinition> artifactsToDelete, GroupDefinition group) {
1153 for (ArtifactDefinition artifactDefinition : artifactsToDelete) {
1154 if (CollectionUtils.isNotEmpty(group.getArtifacts())
1155 && group.getArtifacts().contains(artifactDefinition.getUniqueId())) {
1156 group.getArtifacts().remove(artifactDefinition.getUniqueId());
1159 if (CollectionUtils.isNotEmpty(group.getArtifactsUuid())
1160 && group.getArtifactsUuid().contains(artifactDefinition.getArtifactUUID())) {
1161 group.getArtifactsUuid().remove(artifactDefinition.getArtifactUUID());
1167 private void findArtifactToDelete(Map<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>> parsedGroup,
1168 Set<ArtifactDefinition> artifactsToDelete, ArtifactDefinition artifact,
1169 List<ArtifactDefinition> createdDeploymentArtifacts) {
1170 boolean isNeedToDeleteArtifact = true;
1171 String artifactType = artifact.getArtifactType();
1172 ArtifactDefinition generatedFromArt = null;
1173 if (artifact.getGeneratedFromId() != null && !artifact.getGeneratedFromId().isEmpty()) {
1174 Optional<ArtifactDefinition> op = createdDeploymentArtifacts.stream()
1175 .filter(p -> p.getUniqueId().equals(artifact.getGeneratedFromId())).findAny();
1176 if (op.isPresent()) {
1177 generatedFromArt = op.get();
1182 isNeedToDeleteArtifact(parsedGroup, artifactsToDelete, artifact, isNeedToDeleteArtifact, artifactType, generatedFromArt);
1185 private void isNeedToDeleteArtifact(Map<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>> parsedGroup, Set<ArtifactDefinition>
1186 artifactsToDelete, ArtifactDefinition artifact, boolean isNeedToDeleteArtifact, String artifactType, ArtifactDefinition generatedFromArt) {
1188 for (Entry<ArtifactTemplateInfo, Set<ArtifactTemplateInfo>> parsedGroupSetEntry : parsedGroup.entrySet()) {
1189 Set<ArtifactTemplateInfo> artifactsNames = parsedGroupSetEntry.getValue();
1190 for (ArtifactTemplateInfo template : artifactsNames) {
1191 if (artifact.getArtifactName().equalsIgnoreCase(template.getFileName())
1192 && artifactType.equalsIgnoreCase(template.getType())) {
1193 isNeedToDeleteArtifact = false;
1196 if (generatedFromArt != null
1197 && generatedFromArt.getArtifactName().equalsIgnoreCase(template.getFileName())
1198 && generatedFromArt.getArtifactType().equalsIgnoreCase(template.getType())) {
1199 isNeedToDeleteArtifact = false;
1206 if (isNeedToDeleteArtifact) {
1207 artifactsToDelete.add(artifact);
1212 private Map<GroupDefinition, Map<ArtifactDefinition, List<ArtifactDefinition>>> findMasterArtifactInGroup(
1213 List<GroupDefinition> groups, Map<String, ArtifactDefinition> deploymentArtifact) {
1214 Map<GroupDefinition, Map<ArtifactDefinition, List<ArtifactDefinition>>> groupArtifact = new HashMap<>();
1216 for (GroupDefinition group : groups) {
1217 Map<ArtifactDefinition, List<ArtifactDefinition>> gupsMap = new HashMap<>();
1218 List<ArtifactDefinition> artifacts = new ArrayList<>();
1219 List<String> artifactsList = group.getArtifacts();
1220 if (artifactsList != null && !artifactsList.isEmpty()) {
1222 ArtifactDefinition masterArtifact = ArtifactUtils.findMasterArtifact(deploymentArtifact, artifacts,
1224 if (masterArtifact != null) {
1225 gupsMap.put(masterArtifact, artifacts);
1227 groupArtifact.put(group, gupsMap);
1231 return groupArtifact;
1234 private Either<Resource, ResponseFormat> deleteArtifactsInUpdateCsarFlow(Resource resource,
1235 User user, boolean shouldLock, boolean inTransaction, Set<ArtifactDefinition> artifactsToDelete,
1236 Map<String, List<ArtifactDefinition>> groupToDelete, List<ArtifactDefinition> deletedArtifacts) {
1238 Resource updatedResource = resource;
1240 String resourceId = updatedResource.getUniqueId();
1241 if (!artifactsToDelete.isEmpty()) {
1242 for (ArtifactDefinition artifact : artifactsToDelete) {
1243 String artifactType = artifact.getArtifactType();
1244 final ArtifactTypeEnum artifactTypeEnum = ArtifactTypeEnum.parse(artifactType);
1245 if (artifactTypeEnum != ArtifactTypeEnum.HEAT_ENV) {
1246 Either<ArtifactDefinition, ResponseFormat> handleDelete = artifactsBusinessLogic
1247 .handleDelete(resourceId, artifact.getUniqueId(), user,
1248 updatedResource, shouldLock, inTransaction);
1250 if (handleDelete.isRight()) {
1251 return Either.right(handleDelete.right().value());
1254 deletedArtifacts.add(handleDelete.left().value());
1259 if (!groupToDelete.isEmpty()) {
1260 log.debug("try to delete group");
1261 List<GroupDefinition> groupDefinitionstoDelete = new ArrayList<>();
1262 List<GroupDefinition> groups = updatedResource.getGroups();
1263 for (Entry<String, List<ArtifactDefinition>> deleteGroup : groupToDelete.entrySet()) {
1264 Optional<GroupDefinition> op = groups.stream()
1265 .filter(gr -> gr.getUniqueId().equals(deleteGroup.getKey())).findAny();
1266 if (op.isPresent()) {
1267 groupDefinitionstoDelete.add(op.get());
1271 if (!groupDefinitionstoDelete.isEmpty()) {
1272 Either<List<GroupDefinition>, ResponseFormat> prepareGroups = groupBusinessLogic.deleteGroups(resource, groupDefinitionstoDelete);
1273 if (prepareGroups.isRight()) {
1274 return Either.right(prepareGroups.right().value());
1278 List<GroupDefinition> oldGroups = updatedResource.getGroups();
1279 Either<Resource, StorageOperationStatus> eitherGerResource = toscaOperationFacade
1280 .getToscaElement(updatedResource.getUniqueId());
1281 if (eitherGerResource.isRight()) {
1282 ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(
1283 componentsUtils.convertFromStorageResponse(eitherGerResource.right().value()), updatedResource);
1285 return Either.right(responseFormat);
1288 updatedResource = eitherGerResource.left().value();
1289 updatedResource.setGroups(oldGroups);
1290 return Either.left(updatedResource);
1293 private void createArtifactsGroupSet(List<ArtifactTemplateInfo> parsedGroupTemplateList,
1294 Set<ArtifactTemplateInfo> parsedArtifactsName) {
1296 for (ArtifactTemplateInfo parsedGroupTemplate : parsedGroupTemplateList) {
1297 parsedArtifactsName.add(parsedGroupTemplate);
1298 List<ArtifactTemplateInfo> relatedArtifacts = parsedGroupTemplate.getRelatedArtifactsInfo();
1299 if (relatedArtifacts != null && !relatedArtifacts.isEmpty()) {
1300 createArtifactsGroupSet(relatedArtifacts, parsedArtifactsName);
1305 private Either<Resource, ResponseFormat> createGroupDeploymentArtifactsFromCsar(CsarInfo csarInfo,
1306 Resource resource, List<ArtifactTemplateInfo> artifactsTemplateList,
1307 List<ArtifactDefinition> createdNewArtifacts, List<ArtifactDefinition> artifactsFromResource,
1310 Resource updatedResource = resource;
1312 Either<Resource, ResponseFormat> resStatus = Either.left(updatedResource);
1313 List<GroupDefinition> createdGroups = updatedResource.getGroups();
1314 List<GroupDefinition> heatGroups = null;
1315 if (createdGroups != null && !createdGroups.isEmpty()) {
1316 heatGroups = collectGroupsWithMembers(createdGroups);
1319 List<GroupDefinition> needToAdd = new ArrayList<>();
1320 for (ArtifactTemplateInfo groupTemplateInfo : artifactsTemplateList) {
1321 String groupName = groupTemplateInfo.getGroupName();
1322 Set<String> artifactsGroup = new HashSet<>();
1323 Set<String> artifactsUUIDGroup = new HashSet<>();
1325 resStatus = createDeploymentArtifactsFromCsar(csarInfo, updatedResource, artifactsGroup, artifactsUUIDGroup,
1326 groupTemplateInfo, createdNewArtifacts, artifactsFromResource, labelCounter);
1327 if (resStatus.isRight()) {
1330 if (!StringUtils.isEmpty(groupName)) {
1331 Map<String, String> members = new HashMap<>();
1332 associateMembersToArtifacts(createdNewArtifacts, artifactsFromResource, heatGroups, artifactsGroup,
1335 List<String> artifactsList = new ArrayList<>(artifactsGroup);
1336 List<String> artifactsUUIDList = new ArrayList<>(artifactsUUIDGroup);
1338 GroupDefinition groupDefinition = new GroupDefinition();
1339 groupDefinition.setName(groupName);
1340 groupDefinition.setType(Constants.DEFAULT_GROUP_VF_MODULE);
1341 groupDefinition.setArtifacts(artifactsList);
1342 groupDefinition.setArtifactsUuid(artifactsUUIDList);
1344 if (!members.isEmpty()) {
1345 groupDefinition.setMembers(members);
1348 List<GroupProperty> properties = new ArrayList<>();
1349 GroupProperty prop = new GroupProperty();
1350 prop.setName(Constants.IS_BASE);
1351 prop.setValue(Boolean.toString(groupTemplateInfo.isBase()));
1352 properties.add(prop);
1354 List<ArtifactDefinition> createdArtifacts = new ArrayList<>();
1355 createdArtifacts.addAll(createdNewArtifacts);
1356 createdArtifacts.addAll(artifactsFromResource);
1357 Either<GroupTypeDefinition, StorageOperationStatus> getLatestGroupTypeRes = groupTypeOperation
1358 .getLatestGroupTypeByType(Constants.DEFAULT_GROUP_VF_MODULE, true);
1359 if (getLatestGroupTypeRes.isRight()) {
1360 return Either.right(componentsUtils.getResponseFormat(
1361 componentsUtils.convertFromStorageResponse(getLatestGroupTypeRes.right().value())));
1363 properties = createVfModuleAdditionalProperties(groupTemplateInfo.isBase(), groupName, properties,
1364 createdArtifacts, artifactsList, getLatestGroupTypeRes.left().value());
1365 groupDefinition.convertFromGroupProperties(properties);
1367 needToAdd.add(groupDefinition);
1370 ComponentParametersView componentParametersView = new ComponentParametersView();
1371 componentParametersView.disableAll();
1372 componentParametersView.setIgnoreArtifacts(false);
1373 componentParametersView.setIgnoreGroups(false);
1374 componentParametersView.setIgnoreComponentInstances(false);
1376 Either<Resource, StorageOperationStatus> component = toscaOperationFacade
1377 .getToscaElement(updatedResource.getUniqueId(), componentParametersView);
1378 if (component.isRight()) {
1379 return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
1381 updatedResource = component.left().value();
1383 Either<List<GroupDefinition>, ResponseFormat> addGroups = groupBusinessLogic.addGroups(updatedResource, needToAdd, false);
1384 if (addGroups.isRight()) {
1385 return Either.right(addGroups.right().value());
1391 private Either<Resource, ResponseFormat> createDeploymentArtifactsFromCsar(CsarInfo csarInfo, Resource resource,
1392 Set<String> artifactsGroup, Set<String> artifactsUUIDGroup, ArtifactTemplateInfo artifactTemplateInfo,
1393 List<ArtifactDefinition> createdArtifacts, List<ArtifactDefinition> artifactsFromResource, int labelCounter) {
1394 Either<Resource, ResponseFormat> resStatus = Either.left(resource);
1395 String artifactFileName = artifactTemplateInfo.getFileName();
1396 String artifactUid = "";
1397 String artifactUUID = "";
1398 String artifactEnvUid = "";
1399 boolean alreadyExist = false;
1401 // check if artifacts already exist
1402 if (artifactsFromResource != null && !artifactsFromResource.isEmpty()) {
1403 for (ArtifactDefinition artifactFromResource : artifactsFromResource) {
1404 if (artifactFromResource.getArtifactName().equals(artifactFileName)) {
1405 artifactUid = artifactFromResource.getUniqueId();
1406 artifactUUID = artifactFromResource.getArtifactUUID();
1407 if (!artifactFromResource.getArtifactType().equalsIgnoreCase(artifactTemplateInfo.getType())) {
1408 log.debug(ARTIFACT_WITH_NAME_AND_TYPE_ALREADY_EXIST_WITH_TYPE, artifactFileName,
1409 artifactTemplateInfo.getType(), artifactFromResource.getArtifactType());
1410 BeEcompErrorManager.getInstance().logInternalDataError(
1411 ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMAT_FILE_NAME + artifactFileName,
1412 ARTIFACT_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
1413 return Either.right(componentsUtils.getResponseFormat(
1414 ActionStatus.ARTIFACT_ALREADY_EXIST_IN_DIFFERENT_TYPE_IN_CSAR, artifactFileName,
1415 artifactTemplateInfo.getType(), artifactFromResource.getArtifactType()));
1417 alreadyExist = true;
1418 artifactEnvUid = checkAndGetHeatEnvId(artifactFromResource);
1425 if (!alreadyExist) {
1426 for (ArtifactDefinition createdArtifact : createdArtifacts) {
1427 if (createdArtifact.getArtifactName().equals(artifactFileName)) {
1428 artifactUid = createdArtifact.getUniqueId();
1429 artifactUUID = createdArtifact.getArtifactUUID();
1431 if (!createdArtifact.getArtifactType().equalsIgnoreCase(artifactTemplateInfo.getType())) {
1432 log.debug(ARTIFACT_WITH_NAME_AND_TYPE_ALREADY_EXIST_WITH_TYPE, artifactFileName,
1433 artifactTemplateInfo.getType(), createdArtifact.getArtifactType());
1434 BeEcompErrorManager.getInstance().logInternalDataError(
1435 ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMAT_FILE_NAME + artifactFileName,
1436 ARTIFACT_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
1437 return Either.right(componentsUtils.getResponseFormat(
1438 ActionStatus.ARTIFACT_ALREADY_EXIST_IN_DIFFERENT_TYPE_IN_CSAR, artifactFileName,
1439 artifactTemplateInfo.getType(), createdArtifact.getArtifactType()));
1441 alreadyExist = true;
1442 artifactEnvUid = checkAndGetHeatEnvId(createdArtifact);
1448 // if not exist need to create
1449 if (!alreadyExist) {
1451 Either<ArtifactDefinition, ResponseFormat> newArtifactEither = createDeploymentArtifact(csarInfo, resource,
1452 ARTIFACTS_PATH, artifactTemplateInfo, createdArtifacts, labelCounter);
1453 if (newArtifactEither.isRight()) {
1454 resStatus = Either.right(newArtifactEither.right().value());
1457 ArtifactDefinition newArtifact = newArtifactEither.left().value();
1458 artifactUid = newArtifact.getUniqueId();
1459 artifactUUID = newArtifact.getArtifactUUID();
1460 final ArtifactTypeEnum artifactType = ArtifactTypeEnum.parse(newArtifact.getArtifactType());
1461 if (artifactType == ArtifactTypeEnum.HEAT || artifactType == ArtifactTypeEnum.HEAT_NET
1462 || artifactType == ArtifactTypeEnum.HEAT_VOL) {
1463 ArtifactDefinition createHeatEnvPlaceHolder = artifactsBusinessLogic
1464 .createHeatEnvPlaceHolder(createdArtifacts, newArtifact, ArtifactsBusinessLogic.HEAT_VF_ENV_NAME,
1465 resource.getUniqueId(), NodeTypeEnum.Resource, resource.getName(),
1466 csarInfo.getModifier(), resource, null);
1467 artifactEnvUid = createHeatEnvPlaceHolder.getUniqueId();
1471 artifactsGroup.add(artifactUid);
1472 artifactsUUIDGroup.add(artifactUUID);
1473 if (!artifactEnvUid.isEmpty()) {
1474 artifactsGroup.add(artifactEnvUid);
1477 List<ArtifactTemplateInfo> relatedArtifacts = artifactTemplateInfo.getRelatedArtifactsInfo();
1478 if (relatedArtifacts != null) {
1479 for (ArtifactTemplateInfo relatedArtifactTemplateInfo : relatedArtifacts) {
1480 resStatus = createDeploymentArtifactsFromCsar(csarInfo, resource, artifactsGroup, artifactsUUIDGroup,
1481 relatedArtifactTemplateInfo, createdArtifacts, artifactsFromResource, labelCounter);
1482 if (resStatus.isRight()) {
1490 private Either<Resource, ResponseFormat> associateAndDissociateArtifactsToGroup(CsarInfo csarInfo,
1491 Resource resource, List<ArtifactDefinition> createdNewArtifacts, int labelCounter,
1492 List<ArtifactDefinition> createdDeploymentArtifactsAfterDelete,
1493 Map<GroupDefinition, MergedArtifactInfo> mergedgroup, List<ArtifactDefinition> deletedArtifacts) {
1494 Map<GroupDefinition, List<ArtifactTemplateInfo>> artifactsToAssotiate = new HashMap<>();
1495 Map<GroupDefinition, List<ImmutablePair<ArtifactDefinition, ArtifactTemplateInfo>>> artifactsToUpdateMap = new HashMap<>();
1496 Either<Resource, ResponseFormat> resEither;
1497 for (Entry<GroupDefinition, MergedArtifactInfo> entry : mergedgroup.entrySet()) {
1498 List<ArtifactDefinition> dissArtifactsInGroup = entry.getValue()
1499 .getListToDissotiateArtifactFromGroup(deletedArtifacts);
1500 GroupDefinition grDef = entry.getKey();
1501 if (dissArtifactsInGroup != null && !dissArtifactsInGroup.isEmpty()) {
1502 for (ArtifactDefinition art : dissArtifactsInGroup) {
1503 grDef.getArtifacts().remove(art.getUniqueId());
1504 grDef.getArtifactsUuid().remove(art.getArtifactUUID());
1508 List<ArtifactTemplateInfo> newArtifactsInGroup = entry.getValue().getListToAssociateArtifactToGroup();
1509 if (newArtifactsInGroup != null && !newArtifactsInGroup.isEmpty()) {
1510 artifactsToAssotiate.put(entry.getKey(), newArtifactsInGroup);
1513 List<ImmutablePair<ArtifactDefinition, ArtifactTemplateInfo>> artifactsToUpdate = entry.getValue()
1514 .getListToUpdateArtifactInGroup();
1515 if (artifactsToUpdate != null && !artifactsToUpdate.isEmpty()) {
1516 artifactsToUpdateMap.put(entry.getKey(), artifactsToUpdate);
1520 if (!artifactsToUpdateMap.isEmpty()) {
1521 List<ArtifactDefinition> updatedArtifacts = new ArrayList<>();
1522 for (Entry<GroupDefinition, List<ImmutablePair<ArtifactDefinition, ArtifactTemplateInfo>>> artifactsToUpdateEntry : artifactsToUpdateMap
1524 List<ImmutablePair<ArtifactDefinition, ArtifactTemplateInfo>> artifactsToUpdateList = artifactsToUpdateEntry
1526 GroupDefinition groupToUpdate = artifactsToUpdateEntry.getKey();
1528 for (ImmutablePair<ArtifactDefinition, ArtifactTemplateInfo> artifact : artifactsToUpdateList) {
1529 String prevUUID = artifact.getKey().getArtifactUUID();
1530 String prevId = artifact.getKey().getUniqueId();
1531 String prevHeatEnvId = checkAndGetHeatEnvId(artifact.getKey());
1532 Either<ArtifactDefinition, ResponseFormat> updateArtifactEither = updateDeploymentArtifactsFromCsar(
1533 csarInfo, resource, artifact.getKey(), artifact.getValue(), updatedArtifacts,
1534 artifact.getRight().getRelatedArtifactsInfo());
1535 if (updateArtifactEither.isRight()) {
1536 log.debug("failed to update artifacts. status is {}", updateArtifactEither.right().value());
1537 resEither = Either.right(updateArtifactEither.right().value());
1540 ArtifactDefinition artAfterUpdate = updateArtifactEither.left().value();
1541 if (!prevUUID.equals(artAfterUpdate.getArtifactUUID())
1542 || !prevId.equals(artAfterUpdate.getUniqueId())) {
1543 groupToUpdate.getArtifacts().remove(prevId);
1544 groupToUpdate.getArtifactsUuid().remove(prevUUID);
1545 groupToUpdate.getArtifacts().add(artAfterUpdate.getUniqueId());
1546 groupToUpdate.getArtifactsUuid().add(artAfterUpdate.getArtifactUUID());
1548 Optional<ArtifactDefinition> op = updatedArtifacts.stream()
1549 .filter(p -> p.getGeneratedFromId() != null
1550 && p.getGeneratedFromId().equals(artAfterUpdate.getUniqueId()))
1552 if (op.isPresent()) {
1553 ArtifactDefinition artifactInfoHeatEnv = op.get();
1554 groupToUpdate.getArtifacts().remove(prevHeatEnvId);
1555 groupToUpdate.getArtifacts().add(artifactInfoHeatEnv.getUniqueId());
1562 for (Entry<GroupDefinition, List<ArtifactTemplateInfo>> associateEntry : artifactsToAssotiate.entrySet()) {
1563 List<ArtifactTemplateInfo> associatedArtifact = associateEntry.getValue();
1564 Set<String> arifactsUids = new HashSet<>();
1565 Set<String> arifactsUuids = new HashSet<>();
1566 for (ArtifactTemplateInfo artifactTemplate : associatedArtifact) { // try
1572 boolean isCreate = true;
1573 for (ArtifactDefinition createdArtifact : createdDeploymentArtifactsAfterDelete) {
1574 if (artifactTemplate.getFileName().equalsIgnoreCase(createdArtifact.getArtifactName())) {
1575 arifactsUids.add(createdArtifact.getUniqueId());
1576 arifactsUuids.add(createdArtifact.getArtifactUUID());
1578 String heatEnvId = checkAndGetHeatEnvId(createdArtifact);
1579 if (!heatEnvId.isEmpty()) {
1580 arifactsUids.add(heatEnvId);
1581 Optional<ArtifactDefinition> op = createdDeploymentArtifactsAfterDelete.stream()
1582 .filter(p -> p.getUniqueId().equals(heatEnvId)).findAny();
1583 if (op.isPresent()) {
1584 this.artifactToscaOperation.updateHeatEnvPlaceholder(op.get(), resource,
1585 resource.getComponentType().getNodeType());
1594 if (isCreate) { // check if already created
1595 for (ArtifactDefinition createdNewArtifact : createdNewArtifacts) {
1596 if (artifactTemplate.getFileName().equalsIgnoreCase(createdNewArtifact.getArtifactName())) {
1597 arifactsUids.add(createdNewArtifact.getUniqueId());
1598 arifactsUuids.add(createdNewArtifact.getArtifactUUID());
1600 String heatEnvId = checkAndGetHeatEnvId(createdNewArtifact);
1601 if (!heatEnvId.isEmpty()) {
1602 arifactsUids.add(heatEnvId);
1610 Either<ArtifactDefinition, ResponseFormat> createArtifactEither = createDeploymentArtifact(csarInfo,
1611 resource, ARTIFACTS_PATH, artifactTemplate, createdNewArtifacts, labelCounter);
1612 if (createArtifactEither.isRight()) {
1613 resEither = Either.right(createArtifactEither.right().value());
1616 ArtifactDefinition createdArtifact = createArtifactEither.left().value();
1617 arifactsUids.add(createdArtifact.getUniqueId());
1618 arifactsUuids.add(createdArtifact.getArtifactUUID());
1619 final ArtifactTypeEnum artifactType = ArtifactTypeEnum.parse(createdArtifact.getArtifactType());
1620 if (artifactType == ArtifactTypeEnum.HEAT || artifactType == ArtifactTypeEnum.HEAT_NET
1621 || artifactType == ArtifactTypeEnum.HEAT_VOL) {
1622 ArtifactDefinition createHeatEnvPlaceHolder = artifactsBusinessLogic
1623 .createHeatEnvPlaceHolder(new ArrayList<>(), createdArtifact, ArtifactsBusinessLogic.HEAT_VF_ENV_NAME,
1624 resource.getUniqueId(), NodeTypeEnum.Resource, resource.getName(),
1625 csarInfo.getModifier(), resource, null);
1626 String heatEnvId = createHeatEnvPlaceHolder.getUniqueId();
1627 arifactsUids.add(heatEnvId);
1632 if (arifactsUids != null && !arifactsUids.isEmpty()) {
1633 List<String> artifactsToAssociate = new ArrayList<>();
1634 artifactsToAssociate.addAll(arifactsUids);
1635 GroupDefinition assotiateGroup = associateEntry.getKey();
1636 assotiateGroup.getArtifacts().addAll(arifactsUids);
1637 assotiateGroup.getArtifactsUuid().addAll(arifactsUuids);
1641 ComponentParametersView parametersView = new ComponentParametersView();
1642 parametersView.disableAll();
1643 parametersView.setIgnoreComponentInstances(false);
1644 parametersView.setIgnoreUsers(false);
1645 parametersView.setIgnoreArtifacts(false);
1646 parametersView.setIgnoreGroups(false);
1648 Either<Resource, StorageOperationStatus> eitherGerResource = toscaOperationFacade
1649 .getToscaElement(resource.getUniqueId(), parametersView);
1651 if (eitherGerResource.isRight()) {
1652 ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(
1653 componentsUtils.convertFromStorageResponse(eitherGerResource.right().value()), resource);
1655 resEither = Either.right(responseFormat);
1659 resEither = Either.left(eitherGerResource.left().value());
1663 private Either<ArtifactDefinition, ResponseFormat> updateDeploymentArtifactsFromCsar(CsarInfo csarInfo,
1664 Resource resource, ArtifactDefinition oldArtifact, ArtifactTemplateInfo artifactTemplateInfo,
1665 List<ArtifactDefinition> updatedArtifacts, List<ArtifactTemplateInfo> updatedRequiredArtifacts) {
1667 Either<ArtifactDefinition, ResponseFormat> resStatus = null;
1668 String artifactFileName = artifactTemplateInfo.getFileName();
1670 // check if artifacts already exist
1671 for (ArtifactDefinition updatedArtifact : updatedArtifacts) {
1672 if (updatedArtifact.getArtifactName().equals(artifactFileName)) {
1673 if (!updatedArtifact.getArtifactType().equalsIgnoreCase(artifactTemplateInfo.getType())) {
1674 log.debug("Artifact with name {} and type {} already updated with type {}", artifactFileName,
1675 artifactTemplateInfo.getType(), updatedArtifact.getArtifactType());
1676 BeEcompErrorManager.getInstance().logInternalDataError(
1677 ARTIFACT_FILE_IS_NOT_IN_EXPECTED_FORMAT_FILE_NAME + artifactFileName,
1678 ARTIFACT_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
1679 resStatus = Either.right(componentsUtils.getResponseFormat(
1680 ActionStatus.ARTIFACT_ALREADY_EXIST_IN_DIFFERENT_TYPE_IN_CSAR, artifactFileName,
1681 artifactTemplateInfo.getType(), updatedArtifact.getArtifactType()));
1684 resStatus = Either.left(updatedArtifact);
1690 Either<ImmutablePair<String, byte[]>, ResponseFormat> artifactContententStatus = CsarValidationUtils
1691 .getArtifactContent(csarInfo.getCsarUUID(), csarInfo.getCsar(),
1692 CsarUtils.ARTIFACTS_PATH + artifactFileName, artifactFileName, componentsUtils);
1693 if (artifactContententStatus.isRight()) {
1694 resStatus = Either.right(artifactContententStatus.right().value());
1698 Map<String, Object> json = ArtifactUtils.buildJsonForUpdateArtifact(oldArtifact.getUniqueId(), artifactFileName,
1699 oldArtifact.getArtifactType(), ArtifactGroupTypeEnum.DEPLOYMENT, oldArtifact.getArtifactLabel(),
1700 oldArtifact.getArtifactDisplayName(), oldArtifact.getDescription(),
1701 artifactContententStatus.left().value().getRight(), updatedRequiredArtifacts, oldArtifact.getIsFromCsar());
1703 Either<Either<ArtifactDefinition, Operation>, ResponseFormat> uploadArtifactToService = createOrUpdateCsarArtifactFromJson(
1704 resource, csarInfo.getModifier(), json,
1705 new ArtifactOperationInfo(false, false, ArtifactOperationEnum.UPDATE));
1707 if (uploadArtifactToService.isRight()) {
1708 resStatus = Either.right(uploadArtifactToService.right().value());
1711 ArtifactDefinition previousInfo = uploadArtifactToService.left().value().left().value();
1712 ArtifactDefinition currentInfo = uploadArtifactToService.left().value().left().value();
1713 updatedArtifacts.add(currentInfo);
1715 Either<ArtifactDefinition, ResponseFormat> updateEnvEither = updateHeatParamsFromCsar(resource, csarInfo,
1716 artifactTemplateInfo, currentInfo, true);
1718 if (updateEnvEither.isRight()) {
1719 log.debug("failed to update parameters to artifact {}", artifactFileName);
1720 resStatus = Either.right(updateEnvEither.right().value());
1724 artifactsBusinessLogic.updateGroupForHeat(previousInfo, updateEnvEither.left().value(), resource);
1726 updatedArtifacts.add(updateEnvEither.left().value());
1727 resStatus = Either.left(currentInfo);
1731 public Either<Resource, ResponseFormat> deleteVFModules(Resource resource, CsarInfo csarInfo, boolean shouldLock, boolean inTransaction) {
1732 Resource updatedResource = resource;
1733 List<GroupDefinition> groupsToDelete = updatedResource.getGroups();
1734 if(groupsToDelete != null && !groupsToDelete.isEmpty()){
1735 List<GroupDefinition> vfGroupsToDelete = groupsToDelete.stream().filter(g -> g.getType().equals(Constants.DEFAULT_GROUP_VF_MODULE)).collect(Collectors.toList());
1736 if(!vfGroupsToDelete.isEmpty()){
1737 for(GroupDefinition gr : vfGroupsToDelete){
1738 List<String> artifacts = gr.getArtifacts();
1739 for (String artifactId : artifacts) {
1740 Either<ArtifactDefinition, ResponseFormat> handleDelete =
1741 artifactsBusinessLogic.handleDelete(
1742 updatedResource.getUniqueId(), artifactId, csarInfo.getModifier(),
1743 updatedResource, shouldLock, inTransaction);
1744 if (handleDelete.isRight()) {
1745 log.debug("Couldn't delete artifact {}", artifactId);
1746 return Either.right(handleDelete.right().value());
1751 groupBusinessLogic.deleteGroups(updatedResource, vfGroupsToDelete);
1753 Either<Resource, StorageOperationStatus> eitherGetResource = toscaOperationFacade.getToscaElement(updatedResource.getUniqueId());
1754 if (eitherGetResource.isRight()) {
1755 ResponseFormat responseFormat = componentsUtils.getResponseFormatByResource(componentsUtils.convertFromStorageResponse(eitherGetResource.right().value()), updatedResource);
1757 return Either.right(responseFormat);
1760 updatedResource = eitherGetResource.left().value();
1763 return Either.left(updatedResource);
1766 private Either<Resource, ResponseFormat> getResourcetFromGraph(Resource component){
1767 log.debug("getResource start");
1768 return toscaOperationFacade.getToscaElement(component.getUniqueId())
1770 .map(rf -> componentsUtils.getResponseFormatByResource(componentsUtils.convertFromStorageResponse(rf), component))
1772 .map (c -> (Resource) c);