2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 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.model.jsontitan.operations;
23 import java.util.ArrayList;
24 import java.util.Collection;
25 import java.util.HashMap;
26 import java.util.List;
28 import java.util.Map.Entry;
29 import java.util.Optional;
30 import java.util.UUID;
31 import java.util.stream.Collectors;
33 import org.apache.commons.collections.MapUtils;
34 import org.apache.commons.lang3.tuple.ImmutableTriple;
35 import org.apache.commons.lang3.tuple.Triple;
36 import org.apache.tinkerpop.gremlin.structure.Direction;
37 import org.openecomp.sdc.be.config.BeEcompErrorManager;
38 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
39 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
40 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
41 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
42 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
43 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
44 import org.openecomp.sdc.be.datatypes.elements.InterfaceDataDefinition;
45 import org.openecomp.sdc.be.datatypes.elements.MapArtifactDataDefinition;
46 import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
47 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
48 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
49 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
50 import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
51 import org.openecomp.sdc.be.model.ArtifactDefinition;
52 import org.openecomp.sdc.be.model.HeatParameterDefinition;
53 import org.openecomp.sdc.be.model.InterfaceDefinition;
54 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
55 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
56 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
57 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
58 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
59 import org.openecomp.sdc.common.jsongraph.util.CommonUtility;
60 import org.openecomp.sdc.common.jsongraph.util.CommonUtility.LogLevelEnum;
61 import org.slf4j.Logger;
62 import org.slf4j.LoggerFactory;
65 import fj.data.Either;
67 @org.springframework.stereotype.Component("artifacts-operations")
69 public class ArtifactsOperations extends BaseOperation {
70 private static Logger log = LoggerFactory.getLogger(ArtifactsOperations.class.getName());
72 public Either<ArtifactDefinition, StorageOperationStatus> addArifactToComponent(ArtifactDefinition artifactInfo, String parentId, NodeTypeEnum type, boolean failIfExist, String instanceId) {
74 String artifactId = artifactInfo.getUniqueId();
75 if (artifactId == null && artifactInfo.getEsId() != null) {
76 artifactId = artifactInfo.getEsId();
78 Either<ArtifactDataDefinition, StorageOperationStatus> status = updateArtifactOnGraph(parentId, artifactInfo, type, artifactId, instanceId, false, false);
79 if (status.isRight()) {
81 log.debug("Failed to update artifact {} of {} {}. status is {}", artifactInfo.getArtifactName(), type.getName(), parentId, status.right().value());
82 BeEcompErrorManager.getInstance().logBeFailedUpdateNodeError("Update Artifact", artifactInfo.getArtifactName(), String.valueOf(status.right().value()));
83 return Either.right(status.right().value());
86 ArtifactDataDefinition artifactData = status.left().value();
88 ArtifactDefinition artifactDefResult = convertArtifactDataToArtifactDefinition(artifactInfo, artifactData);
89 log.debug("The returned ArtifactDefintion is {}", artifactDefResult);
90 return Either.left(artifactDefResult);
95 public Either<ArtifactDefinition, StorageOperationStatus> updateArtifactOnResource(ArtifactDefinition artifactInfo, String id, String artifactId, NodeTypeEnum type, String instanceId) {
97 Either<ArtifactDataDefinition, StorageOperationStatus> status = updateArtifactOnGraph(id, artifactInfo, type, artifactId, instanceId, true, false);
98 if (status.isRight()) {
100 log.debug("Failed to update artifact {} of {} {}. status is {}", artifactInfo.getArtifactName(), type.getName(), id, status.right().value());
101 BeEcompErrorManager.getInstance().logBeFailedUpdateNodeError("Update Artifact", artifactInfo.getArtifactName(), String.valueOf(status.right().value()));
102 return Either.right(status.right().value());
105 ArtifactDataDefinition artifactData = status.left().value();
107 ArtifactDefinition artifactDefResult = convertArtifactDataToArtifactDefinition(artifactInfo, artifactData);
108 log.debug("The returned ArtifactDefintion is {}", artifactDefResult);
109 return Either.left(artifactDefResult);
113 public Either<Boolean, StorageOperationStatus> isCloneNeeded(String parentId, ArtifactDefinition artifactInfo, NodeTypeEnum type) {
114 ArtifactGroupTypeEnum groupType = artifactInfo.getArtifactGroupType();
116 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(groupType, type);
117 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
118 return super.isCloneNeeded(parentId, edgeLabelEnum);
121 public Either<ArtifactDefinition, StorageOperationStatus> getArtifactById(String parentId, String id) {
122 return getArtifactById(parentId, id, null, null);
125 public Either<ArtifactDefinition, StorageOperationStatus> getArtifactById(String parentId, String id, ComponentTypeEnum componentType, String containerId) {
126 Either<ArtifactDefinition, StorageOperationStatus> result = null;
127 ArtifactDataDefinition foundArtifact = null;
128 if (componentType != null && componentType == ComponentTypeEnum.RESOURCE_INSTANCE) {
129 foundArtifact = getInstanceArtifactByLabelAndId(parentId, id, containerId, EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS);
130 if (foundArtifact == null) {
131 foundArtifact = getInstanceArtifactByLabelAndId(parentId, id, containerId, EdgeLabelEnum.INSTANCE_ARTIFACTS);
134 if (foundArtifact == null) {
135 foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.DEPLOYMENT_ARTIFACTS);
137 if (foundArtifact == null) {
138 foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.TOSCA_ARTIFACTS);
141 if (foundArtifact == null) {
142 foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.ARTIFACTS);
145 if (foundArtifact == null) {
146 foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.SERVICE_API_ARTIFACTS);
148 if (foundArtifact == null) {
149 foundArtifact = findInterfaceArtifact(parentId, id);
153 if (foundArtifact == null) {
154 result = Either.right(StorageOperationStatus.NOT_FOUND);
158 ArtifactDefinition artifactDefResult = convertArtifactDataToArtifactDefinition(null, foundArtifact);
159 return Either.left(artifactDefResult);
162 private ArtifactDataDefinition findInterfaceArtifact(String parentId, String id) {
163 Either<Map<String, InterfaceDefinition>, TitanOperationStatus> dataFromGraph = getDataFromGraph(parentId, EdgeLabelEnum.INTERFACE_ARTIFACTS);
164 if (dataFromGraph.isRight()){
165 log.debug("failed to fetch interfaces {} for tosca element with id {}, error {}", id, parentId ,dataFromGraph.right().value());
169 Map<String, InterfaceDefinition> interfaceDefinitionMap = dataFromGraph.left().value();
170 if(interfaceDefinitionMap == null) {
173 Collection<InterfaceDefinition> interfaces = interfaceDefinitionMap.values();
174 if (interfaces == null){
177 for (InterfaceDataDefinition interfaceDataDefinition : interfaces){
178 Map<String, OperationDataDefinition> operationsMap = interfaceDataDefinition.getOperations();
179 if (operationsMap == null) {
182 ArtifactDataDefinition implementationArtifact = getArtifactDataDefinition(id, operationsMap);
183 if (implementationArtifact != null)
184 return implementationArtifact;
189 private ArtifactDataDefinition getArtifactDataDefinition(String id,
190 Map<String, OperationDataDefinition> operationsMap) {
191 for(OperationDataDefinition operationDataDefinition : operationsMap.values()){
192 ArtifactDataDefinition implementationArtifact = operationDataDefinition.getImplementation();
193 if(implementationArtifact != null){
194 String uniqueId = implementationArtifact.getUniqueId();
195 if (id.equals(uniqueId)) {
196 return implementationArtifact;
204 public Either<ArtifactDefinition, StorageOperationStatus> removeArifactFromResource(String id, String artifactId, NodeTypeEnum type, boolean deleteMandatoryArtifact) {
205 Either<ArtifactDefinition, StorageOperationStatus> status = removeArtifactOnGraph(id, artifactId, type, deleteMandatoryArtifact);
207 if (status.isRight()) {
209 log.debug("Failed to delete artifact {} of resource {}", artifactId, id);
211 BeEcompErrorManager.getInstance().logBeFailedDeleteNodeError("Delete Artifact", artifactId, String.valueOf(status.right().value()));
212 return Either.right(status.right().value());
215 return Either.left(status.left().value());
219 public Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getArtifacts(String parentId, NodeTypeEnum parentType, ArtifactGroupTypeEnum groupType, String instanceId) {
221 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(groupType, parentType);
222 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
224 Either<Map<String, ArtifactDefinition>, TitanOperationStatus> foundArtifact = null;
225 Map<String, ArtifactDefinition> resMap = new HashMap<>();
226 foundArtifact = getArtifactByLabel(parentId, instanceId, edgeLabelEnum);
227 if (foundArtifact.isRight()) {
228 log.debug("Failed to find artifact in component {} with label {} ", parentId, edgeLabelEnum);
229 return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(foundArtifact.right().value()));
232 resMap.putAll(foundArtifact.left().value());
234 return Either.left(resMap);
238 * @param parentId the id of the instance container
239 * @param instanceId the id of the instance of which to return its artifacts
240 * @return instance and instance deployment artifacts mapped by artifact label name
242 public Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getAllInstanceArtifacts(String parentId, String instanceId) {
243 Map<String, ArtifactDataDefinition> resMap = new HashMap<>();
244 Either<Map<String, ArtifactDataDefinition>, TitanOperationStatus> instArtifacts = getInstanceArtifactsByLabel(parentId, instanceId, EdgeLabelEnum.INSTANCE_ARTIFACTS);
245 if (instArtifacts.isRight()) {
246 return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(instArtifacts.right().value()));
248 Either<Map<String, ArtifactDataDefinition>, TitanOperationStatus> deployInstArtifacts = getInstanceArtifactsByLabel(parentId, instanceId, EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS);
249 if (deployInstArtifacts.isRight()) {
250 return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(deployInstArtifacts.right().value()));
252 resMap.putAll(instArtifacts.left().value());
253 resMap.putAll(deployInstArtifacts.left().value());
254 return Either.left(convertArtifactMapToArtifactDefinitionMap(resMap));
257 public Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getArtifacts(String parentId) {
259 Either<Map<String, ArtifactDefinition>, TitanOperationStatus> foundArtifact = null;
260 Map<String, ArtifactDefinition> resMap = new HashMap<>();
261 foundArtifact = getArtifactByLabel(parentId, null, EdgeLabelEnum.ARTIFACTS);
262 if (foundArtifact.isLeft()) {
263 resMap.putAll(foundArtifact.left().value());
266 foundArtifact = getArtifactByLabel(parentId, null, EdgeLabelEnum.DEPLOYMENT_ARTIFACTS);
267 if (foundArtifact.isLeft()) {
268 resMap.putAll(foundArtifact.left().value());
271 foundArtifact = getArtifactByLabel(parentId, null, EdgeLabelEnum.TOSCA_ARTIFACTS);
272 if (foundArtifact.isLeft()) {
273 resMap.putAll(foundArtifact.left().value());
277 return Either.left(resMap);
281 public Either<ArtifactDefinition, StorageOperationStatus> removeArtifactOnGraph(String id, String artifactId, NodeTypeEnum type, boolean deleteMandatoryArtifact) {
283 Either<ArtifactDefinition, StorageOperationStatus> artifactData = this.getArtifactById(id, artifactId);
284 if (artifactData.isRight()) {
285 log.debug("Failed to find artifact in component {} with id {} ", id, artifactId);
286 return Either.right(artifactData.right().value());
288 ArtifactDataDefinition artifactDefinition = artifactData.left().value();
289 boolean isMandatory = false;
290 if ((artifactDefinition.getMandatory() || artifactDefinition.getServiceApi()) && !deleteMandatoryArtifact) {
291 // return Either.left(artifactData.left().value());
295 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(artifactDefinition.getArtifactGroupType(), type);
296 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
297 VertexTypeEnum vertexTypeEnum = triple.getRight();
300 StorageOperationStatus status = deleteToscaDataElement(id, edgeLabelEnum, vertexTypeEnum, artifactDefinition.getArtifactLabel(), JsonPresentationFields.ARTIFACT_LABEL);
301 if (status != StorageOperationStatus.OK)
302 return Either.right(status);
305 return Either.left(artifactData.left().value());
309 public void updateUUID(ArtifactDataDefinition artifactData, String oldChecksum, String oldVesrion, boolean isUpdate, EdgeLabelEnum edgeLabel) {
310 if (oldVesrion == null || oldVesrion.isEmpty())
313 String currentChecksum = artifactData.getArtifactChecksum();
316 ArtifactTypeEnum type = ArtifactTypeEnum.findType(artifactData.getArtifactType());
319 if (edgeLabel == EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS) {
320 generateUUID(artifactData, oldVesrion);
322 updateVersionAndDate(artifactData, oldVesrion);
328 generateUUID(artifactData, oldVesrion);
331 if (oldChecksum == null || oldChecksum.isEmpty()) {
332 if (currentChecksum != null) {
333 generateUUID(artifactData, oldVesrion);
335 } else if ((currentChecksum != null && !currentChecksum.isEmpty()) && !oldChecksum.equals(currentChecksum)) {
336 generateUUID(artifactData, oldVesrion);
341 if (oldChecksum == null || oldChecksum.isEmpty()) {
342 if (currentChecksum != null) {
343 generateUUID(artifactData, oldVesrion);
345 } else if ((currentChecksum != null && !currentChecksum.isEmpty()) && !oldChecksum.equals(currentChecksum)) {
346 generateUUID(artifactData, oldVesrion);
351 // @TODO add implementation
353 public Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getArtifacts(String parentId, NodeTypeEnum parentType) {
357 public Either<ArtifactDefinition, StorageOperationStatus> addHeatEnvArtifact(ArtifactDefinition artifactHeatEnv, ArtifactDefinition artifactHeat, String componentId, NodeTypeEnum parentType, boolean failIfExist, String instanceId) {
358 artifactHeatEnv.setGeneratedFromId(artifactHeat.getUniqueId());
359 return addArifactToComponent(artifactHeatEnv, componentId, parentType, failIfExist, instanceId);
362 public Either<ArtifactDefinition, StorageOperationStatus> getHeatArtifactByHeatEnvId(String parentId, ArtifactDefinition heatEnv, NodeTypeEnum parentType, String containerId, ComponentTypeEnum componentType) {
363 String id = heatEnv.getGeneratedFromId();
364 ComponentTypeEnum compType;
365 switch (parentType) {
366 case ResourceInstance:
367 compType = ComponentTypeEnum.RESOURCE_INSTANCE;
370 compType = componentType;
372 return getArtifactById(parentId, id, compType, containerId);
375 public Either<ArtifactDefinition, StorageOperationStatus> updateHeatEnvArtifact(String id, ArtifactDefinition artifactEnvInfo, String artifactId, String newArtifactId, NodeTypeEnum type, String instanceId) {
377 Either<Map<String, ArtifactDefinition>, TitanOperationStatus> artifactsEither = getArtifactByLabel(id, instanceId, EdgeLabelEnum.DEPLOYMENT_ARTIFACTS);
378 if (artifactsEither.isRight()) {
379 log.debug("Failed to find artifacts in component {} with id {} ", id, artifactsEither.right().value());
380 return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(artifactsEither.right().value()));
383 Map<String, ArtifactDefinition> artifacts = artifactsEither.left().value();
384 List<ArtifactDefinition> envList = artifacts.values().stream().filter(a -> a.getGeneratedFromId() != null && a.getGeneratedFromId().equals(artifactId)).collect(Collectors.toList());
385 if (envList != null && !envList.isEmpty()) {
386 envList.forEach(a -> {
387 a.setGeneratedFromId(newArtifactId);
388 updateArtifactOnResource(a, id, a.getUniqueId(), type, instanceId);
393 return Either.left(artifactEnvInfo);
396 public Either<ArtifactDefinition, StorageOperationStatus> updateHeatEnvPlaceholder(ArtifactDefinition artifactInfo, String parentId, NodeTypeEnum type) {
397 return updateArtifactOnResource(artifactInfo, parentId, artifactInfo.getUniqueId(), type, null);
400 // public Either<List<HeatParameterDefinition>, StorageOperationStatus> getHeatParamsForEnv(ArtifactDefinition heatEnvArtifact, String parentId) {
404 ///////////////////////////////////////////// private methods ////////////////////////////////////////////////////
406 protected ArtifactDefinition convertArtifactDataToArtifactDefinition(ArtifactDefinition artifactInfo, ArtifactDataDefinition artifactDefResult) {
407 log.debug("The object returned after create property is {}", artifactDefResult);
409 ArtifactDefinition propertyDefResult = new ArtifactDefinition(artifactDefResult);
410 if (artifactInfo != null)
411 propertyDefResult.setPayload(artifactInfo.getPayloadData());
413 List<HeatParameterDefinition> parameters = new ArrayList<HeatParameterDefinition>();
415 * StorageOperationStatus heatParametersOfNode = heatParametersOperation.getHeatParametersOfNode(NodeTypeEnum.ArtifactRef, artifactDefResult.getUniqueId().toString(), parameters); if ((heatParametersOfNode.equals(StorageOperationStatus.OK))
416 * && !parameters.isEmpty()) { propertyDefResult.setHeatParameters(parameters); }
418 return propertyDefResult;
421 private ArtifactDataDefinition getInstanceArtifactByLabelAndId(String parentId, String id, String containerId, EdgeLabelEnum edgeLabelEnum) {
422 ArtifactDataDefinition foundArtifact = null;
423 Either<Map<String, MapArtifactDataDefinition>, TitanOperationStatus> artifactsEither = getDataFromGraph(containerId, edgeLabelEnum);
424 if (artifactsEither.isRight()) {
425 log.debug("failed to fetch {} for tosca element with id {}, error {}", edgeLabelEnum, containerId, artifactsEither.right().value());
429 Map<String, MapArtifactDataDefinition> artifacts = artifactsEither.left().value();
431 MapArtifactDataDefinition artifactsPerInstance = artifacts.get(parentId);
432 if (artifactsPerInstance == null) {
433 log.debug("failed to fetch artifacts for instance {} in tosca element with id {}, error {}", parentId, containerId, artifactsEither.right().value());
436 Optional<ArtifactDataDefinition> op = artifactsPerInstance.getMapToscaDataDefinition().values().stream().filter(p -> p.getUniqueId().equals(id)).findAny();
437 if (op.isPresent()) {
438 foundArtifact = op.get();
440 return foundArtifact;
443 private ArtifactDataDefinition getArtifactByLabelAndId(String parentId, String id, EdgeLabelEnum edgeLabelEnum) {
444 ArtifactDataDefinition foundArtifact = null;
445 Either<Map<String, ArtifactDataDefinition>, TitanOperationStatus> artifactsEither = getDataFromGraph(parentId, edgeLabelEnum);
446 if (artifactsEither.isRight()) {
447 log.debug("failed to fetch {} for tosca element with id {}, error {}", edgeLabelEnum, parentId, artifactsEither.right().value());
451 Map<String, ArtifactDataDefinition> artifacts = artifactsEither.left().value();
452 Optional<ArtifactDataDefinition> op = artifacts.values().stream().filter(p -> p.getUniqueId().equals(id)).findAny();
453 if (op.isPresent()) {
454 foundArtifact = op.get();
456 return foundArtifact;
459 private Either<Map<String, ArtifactDefinition>, TitanOperationStatus> getArtifactByLabel(String parentId, String instanceId, EdgeLabelEnum edgeLabelEnum) {
460 Either<Map<String, ArtifactDataDefinition>, TitanOperationStatus> artifactsEither = getArtifactsDataByLabel(parentId, instanceId, edgeLabelEnum);
461 if (artifactsEither.isRight()) {
462 log.debug("failed to fetch {} for tosca element with id {}, error {}", edgeLabelEnum, parentId, artifactsEither.right().value());
463 return Either.right(artifactsEither.right().value());
465 Map<String, ArtifactDataDefinition> artifactDataMap = artifactsEither.left().value();
466 return Either.left(convertArtifactMapToArtifactDefinitionMap(artifactDataMap));
469 private Either<Map<String, ArtifactDataDefinition>, TitanOperationStatus> getArtifactsDataByLabel(String parentId, String instanceId, EdgeLabelEnum edgeLabelEnum) {
470 return edgeLabelEnum.isInstanceArtifactsLabel() ? getInstanceArtifactsByLabel(parentId, instanceId, edgeLabelEnum) : getDataFromGraph(parentId, edgeLabelEnum);
473 private Map<String, ArtifactDefinition> convertArtifactMapToArtifactDefinitionMap(Map<String, ArtifactDataDefinition> artifactDataMap) {
474 Map<String, ArtifactDefinition> artMap = new HashMap<>();
475 if (artifactDataMap != null && !artifactDataMap.isEmpty()) {
476 artMap = artifactDataMap.entrySet().stream().collect(Collectors.toMap(Entry::getKey, e -> convertArtifactDataToArtifactDefinition(null, e.getValue())));
481 private Either<Map<String, ArtifactDataDefinition>, TitanOperationStatus> getInstanceArtifactsByLabel(String parentId, String instanceId, EdgeLabelEnum edgeLabelEnum) {
482 Either<Map<String, MapArtifactDataDefinition>, TitanOperationStatus> resultEither = getDataFromGraph(parentId, edgeLabelEnum);
483 if (resultEither.isRight()) {
484 log.debug("failed to fetch {} for tosca element with id {}, error {}", edgeLabelEnum, parentId, resultEither.right().value());
485 return Either.right(resultEither.right().value());
487 Map<String, MapArtifactDataDefinition> mapArtifacts = resultEither.left().value();
488 MapArtifactDataDefinition artifactPerInstance = mapArtifacts.get(instanceId);
489 return artifactPerInstance != null ? Either.left(artifactPerInstance.getMapToscaDataDefinition()) : Either.left(new HashMap<>());
492 private Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> getEdgeLabelEnumFromArtifactGroupType(ArtifactGroupTypeEnum groupType, NodeTypeEnum nodeType) {
493 EdgeLabelEnum edgeLabelEnum;
494 VertexTypeEnum vertexTypeEnum;
495 Boolean isDeepElement = false;
497 * if (nodeType == NodeTypeEnum.ResourceInstance) { edgeLabelEnum = EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS; vertexTypeEnum = VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS; isDeepElement = true; } else {
501 edgeLabelEnum = EdgeLabelEnum.TOSCA_ARTIFACTS;
502 vertexTypeEnum = VertexTypeEnum.TOSCA_ARTIFACTS;
505 if (nodeType == NodeTypeEnum.ResourceInstance) {
506 edgeLabelEnum = EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS;
507 vertexTypeEnum = VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS;
508 isDeepElement = true;
510 edgeLabelEnum = EdgeLabelEnum.DEPLOYMENT_ARTIFACTS;
511 vertexTypeEnum = VertexTypeEnum.DEPLOYMENT_ARTIFACTS;
515 edgeLabelEnum = EdgeLabelEnum.SERVICE_API_ARTIFACTS;
516 vertexTypeEnum = VertexTypeEnum.SERVICE_API_ARTIFACTS;
519 if (nodeType == NodeTypeEnum.ResourceInstance) {
520 edgeLabelEnum = EdgeLabelEnum.INSTANCE_ARTIFACTS;
521 vertexTypeEnum = VertexTypeEnum.INSTANCE_ARTIFACTS;
522 isDeepElement = true;
524 edgeLabelEnum = EdgeLabelEnum.ARTIFACTS;
525 vertexTypeEnum = VertexTypeEnum.ARTIFACTS;
530 return new ImmutableTriple<EdgeLabelEnum, Boolean, VertexTypeEnum>(edgeLabelEnum, isDeepElement, vertexTypeEnum);
534 public Either<ArtifactDataDefinition, StorageOperationStatus> updateArtifactOnGraph(String componentId, ArtifactDefinition artifactInfo, NodeTypeEnum type, String artifactId, String instanceId, boolean isUpdate, boolean isDeletePlaceholder) {
535 Either<ArtifactDataDefinition, StorageOperationStatus> res = null;
536 ArtifactDataDefinition artifactToUpdate = new ArtifactDataDefinition(artifactInfo);
537 ArtifactGroupTypeEnum groupType = artifactInfo.getArtifactGroupType();
539 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(groupType, type);
540 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
541 VertexTypeEnum vertexTypeEnum = triple.getRight();
543 Either<Boolean, StorageOperationStatus> isNeedToCloneEither = isCloneNeeded(componentId, edgeLabelEnum);
544 if (isNeedToCloneEither.isRight()) {
545 log.debug("Failed check is clone needed {}", componentId);
546 return Either.right(isNeedToCloneEither.right().value());
549 boolean isNeedToClone = isNeedToCloneEither.left().value();
551 if (artifactId == null || isNeedToClone) {
553 if (edgeLabelEnum != EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS && edgeLabelEnum != EdgeLabelEnum.INSTANCE_ARTIFACTS) {
554 uniqueId = UniqueIdBuilder.buildPropertyUniqueId(componentId, artifactToUpdate.getArtifactLabel());
556 uniqueId = UniqueIdBuilder.buildInstanceArtifactUniqueId(componentId, instanceId, artifactToUpdate.getArtifactLabel());
558 artifactToUpdate.setUniqueId(uniqueId);
559 if (!isDeletePlaceholder)
560 artifactToUpdate.setEsId(uniqueId);
562 artifactToUpdate.setUniqueId(artifactId);
564 Map<String, ArtifactDataDefinition> artifacts = new HashMap<>();
565 Map<String, MapArtifactDataDefinition> artifactInst = null;
566 if (edgeLabelEnum != EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS && edgeLabelEnum != EdgeLabelEnum.INSTANCE_ARTIFACTS) {
568 Either<Map<String, ArtifactDataDefinition>, TitanOperationStatus> artifactsEither = this.getDataFromGraph(componentId, edgeLabelEnum);
570 if (artifactsEither.isLeft() && artifactsEither.left().value() != null && !artifactsEither.left().value().isEmpty()) {
571 artifacts = artifactsEither.left().value();
572 if (isNeedToClone && artifacts != null) {
573 artifacts.values().stream().forEach(a -> a.setDuplicated(Boolean.TRUE));
578 Either<Map<String, MapArtifactDataDefinition>, TitanOperationStatus> artifactsEither = this.getDataFromGraph(componentId, edgeLabelEnum);
579 if (artifactsEither.isLeft()) {
580 artifactInst = artifactsEither.left().value();
581 if (isNeedToClone && artifactInst != null) {
582 artifactInst.values().forEach(ma -> ma.getMapToscaDataDefinition().values().forEach(a -> a.setDuplicated(Boolean.TRUE)));
584 MapArtifactDataDefinition artifatcsOnInstance = artifactInst.get(instanceId);
585 if (artifatcsOnInstance != null) {
586 artifacts = artifatcsOnInstance.getMapToscaDataDefinition();
590 String oldChecksum = null;
591 String oldVersion = null;
592 if (artifacts != null && artifacts.containsKey(artifactInfo.getArtifactLabel())) {
593 ArtifactDataDefinition oldArtifactData = artifacts.get(artifactInfo.getArtifactLabel());
594 oldChecksum = oldArtifactData.getArtifactChecksum();
595 oldVersion = oldArtifactData.getArtifactVersion();
596 //duplicated flag didn't receive from UI, take from DB
597 artifactToUpdate.setDuplicated(oldArtifactData.getDuplicated());
600 artifactToUpdate.setDuplicated(Boolean.FALSE);
602 if (artifactToUpdate.getDuplicated()) {
603 String uniqueId = "";
604 if(type != NodeTypeEnum.ResourceInstance)
605 uniqueId = UniqueIdBuilder.buildPropertyUniqueId(componentId, artifactToUpdate.getArtifactLabel());
607 uniqueId = UniqueIdBuilder.buildInstanceArtifactUniqueId(componentId, instanceId, artifactToUpdate.getArtifactLabel());
609 artifactToUpdate.setUniqueId(uniqueId);
610 if (!isDeletePlaceholder)
611 artifactToUpdate.setEsId(uniqueId);
612 artifactToUpdate.setDuplicated(Boolean.FALSE);
616 updateUUID(artifactToUpdate, oldChecksum, oldVersion, isUpdate, edgeLabelEnum);
618 if (artifactInfo.getPayloadData() == null) {
619 if (!artifactToUpdate.getMandatory() || artifactToUpdate.getEsId() != null) {
620 artifactToUpdate.setEsId(artifactToUpdate.getUniqueId());
623 if (artifactToUpdate.getEsId() == null) {
624 artifactToUpdate.setEsId(artifactToUpdate.getUniqueId());
628 StorageOperationStatus status = StorageOperationStatus.OK;
629 if (edgeLabelEnum != EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS && edgeLabelEnum != EdgeLabelEnum.INSTANCE_ARTIFACTS) {
630 List<ArtifactDataDefinition> toscaDataList = new ArrayList<>();
631 toscaDataList.add(artifactToUpdate);
633 if (isNeedToClone && artifacts != null) {
634 artifacts.values().stream().filter(a -> !a.getArtifactLabel().equals(artifactToUpdate.getArtifactLabel())).forEach(a -> toscaDataList.add(a));
636 status = updateToscaDataOfToscaElement(componentId, edgeLabelEnum, vertexTypeEnum, toscaDataList, JsonPresentationFields.ARTIFACT_LABEL);
638 List<ArtifactDataDefinition> toscaDataList = new ArrayList<>();
639 toscaDataList.add(artifactToUpdate);
640 List<String> pathKeys = new ArrayList<>();
641 pathKeys.add(instanceId);
643 MapArtifactDataDefinition artifatcsOnInstance = artifactInst.get(instanceId);
644 if (artifatcsOnInstance != null) {
645 artifacts = artifatcsOnInstance.getMapToscaDataDefinition();
646 artifacts.put(artifactToUpdate.getArtifactLabel(), artifactToUpdate);
649 for (Entry<String, MapArtifactDataDefinition> e : artifactInst.entrySet()) {
650 List<ArtifactDataDefinition> toscaDataListPerInst = e.getValue().getMapToscaDataDefinition().values().stream().collect(Collectors.toList());
651 List<String> pathKeysPerInst = new ArrayList<>();
652 pathKeysPerInst.add(e.getKey());
653 status = updateToscaDataDeepElementsOfToscaElement(componentId, edgeLabelEnum, vertexTypeEnum, toscaDataListPerInst, pathKeysPerInst, JsonPresentationFields.ARTIFACT_LABEL);
654 if (status != StorageOperationStatus.OK) {
655 log.debug("Failed to update atifacts group for instance {} in component {} edge type {} error {}", instanceId, componentId, edgeLabelEnum, status);
656 res = Either.right(status);
661 status = updateToscaDataDeepElementsOfToscaElement(componentId, edgeLabelEnum, vertexTypeEnum, toscaDataList, pathKeys, JsonPresentationFields.ARTIFACT_LABEL);
664 if (status == StorageOperationStatus.OK)
665 res = Either.left(artifactToUpdate);
667 res = Either.right(status);
671 public void generateUUID(ArtifactDataDefinition artifactData, String oldVesrion) {
673 UUID uuid = UUID.randomUUID();
674 artifactData.setArtifactUUID(uuid.toString());
675 MDC.put("serviceInstanceID", uuid.toString());
676 updateVersionAndDate(artifactData, oldVesrion);
679 private void updateVersionAndDate(ArtifactDataDefinition artifactData, String oldVesrion) {
680 if (artifactData.getArtifactChecksum() != null) {
681 long time = System.currentTimeMillis();
682 artifactData.setPayloadUpdateDate(time);
684 int newVersion = new Integer(oldVesrion).intValue();
686 artifactData.setArtifactVersion(String.valueOf(newVersion));
689 private boolean validateParentType(NodeTypeEnum type) {
690 boolean isValid = false;
693 case InterfaceOperation:
695 case ResourceInstance:
699 log.debug("Not supported node type for artifact relation : {} ", type);
704 public Either<ArtifactDataDefinition, StorageOperationStatus> removeArtifactOnGraph(ArtifactDefinition artifactFromGraph, String componentId, String instanceId, NodeTypeEnum type, boolean deleteMandatoryArtifact) {
706 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(artifactFromGraph.getArtifactGroupType(), type);
707 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
708 VertexTypeEnum vertexTypeEnum = triple.getRight();
710 if (deleteMandatoryArtifact || !(artifactFromGraph.getMandatory() || artifactFromGraph.getServiceApi())) {
711 StorageOperationStatus status;
712 if (triple.getMiddle()) {
713 List<String> pathKeys = new ArrayList<>();
714 pathKeys.add(instanceId);
715 status = deleteToscaDataDeepElement(componentId, edgeLabelEnum, vertexTypeEnum, artifactFromGraph.getArtifactLabel(), pathKeys, JsonPresentationFields.ARTIFACT_LABEL);
717 status = deleteToscaDataElement(componentId, edgeLabelEnum, vertexTypeEnum, artifactFromGraph.getArtifactLabel(), JsonPresentationFields.ARTIFACT_LABEL);
719 if (status != StorageOperationStatus.OK)
720 return Either.right(status);
722 return Either.left(artifactFromGraph);
726 public Either<ArtifactDataDefinition, StorageOperationStatus> deleteArtifactWithClonnigOnGraph(String componentId, ArtifactDefinition artifactToDelete, NodeTypeEnum type, String instanceId, boolean deleteMandatoryArtifact) {
728 Either<ArtifactDataDefinition, StorageOperationStatus> result = null;
729 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(artifactToDelete.getArtifactGroupType(), type);
730 EdgeLabelEnum edgeLabel = triple.getLeft();
731 VertexTypeEnum vertexLabel = triple.getRight();
733 Boolean deleteElement = deleteMandatoryArtifact || !(artifactToDelete.getMandatory() || artifactToDelete.getServiceApi());
734 Map<String, ToscaDataDefinition> artifacts = null;
735 GraphVertex parentVertex = null;
736 Either<Map<String, ToscaDataDefinition>, TitanOperationStatus> getArtifactsRes = null;
738 Either<GraphVertex, TitanOperationStatus> getToscaElementRes = titanDao.getVertexById(componentId, JsonParseFlagEnum.NoParse);
739 if (getToscaElementRes.isRight()) {
740 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to get tosca element {} upon getting tosca data from graph. Status is {}. ", componentId, getToscaElementRes.right().value());
741 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(getToscaElementRes.right().value()));
743 if (result == null) {
744 parentVertex = getToscaElementRes.left().value();
745 getArtifactsRes = this.getDataFromGraph(parentVertex, edgeLabel);
746 if (getArtifactsRes.isRight()) {
747 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(getArtifactsRes.right().value()));
750 if (result == null) {
751 artifacts = getArtifactsRes.left().value();
752 if (triple.getMiddle()) {
753 artifacts.values().forEach(ma -> ((MapArtifactDataDefinition) ma).getMapToscaDataDefinition().values().forEach(a -> a.setDuplicated(Boolean.TRUE)));
754 MapArtifactDataDefinition artifatcsOnInstance = (MapArtifactDataDefinition) artifacts.get(instanceId);
755 if (artifatcsOnInstance != null && deleteElement) {
756 artifatcsOnInstance.getMapToscaDataDefinition().remove(artifactToDelete.getArtifactLabel());
760 artifacts.remove(artifactToDelete.getArtifactLabel());
762 artifacts.values().stream().forEach(a -> ((ArtifactDataDefinition) a).setDuplicated(Boolean.TRUE));
764 artifactToDelete.setDuplicated(Boolean.TRUE);
766 if (artifacts != null) {
767 TitanOperationStatus status = titanDao.deleteEdgeByDirection(parentVertex, Direction.OUT, edgeLabel);
768 if (status != TitanOperationStatus.OK) {
769 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(status));
770 } else if (MapUtils.isNotEmpty(artifacts)) {
771 Either<GraphVertex, StorageOperationStatus> assosiateRes = assosiateElementToData(parentVertex, vertexLabel, edgeLabel, artifacts);
772 if (assosiateRes.isRight()) {
773 result = Either.right(result.right().value());
777 if (result == null) {
778 result = Either.left(artifactToDelete);