1 package org.openecomp.sdc.be.model.jsontitan.operations;
3 import java.util.ArrayList;
4 import java.util.HashMap;
7 import java.util.Optional;
9 import java.util.stream.Collectors;
11 import org.apache.commons.collections.MapUtils;
12 import org.apache.commons.lang3.tuple.ImmutableTriple;
13 import org.apache.commons.lang3.tuple.Triple;
14 import org.apache.tinkerpop.gremlin.structure.Direction;
15 import org.openecomp.sdc.be.config.BeEcompErrorManager;
16 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
17 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
18 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
19 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
20 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
21 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
22 import org.openecomp.sdc.be.datatypes.elements.MapArtifactDataDefinition;
23 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
24 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
25 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
26 import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
27 import org.openecomp.sdc.be.model.ArtifactDefinition;
28 import org.openecomp.sdc.be.model.HeatParameterDefinition;
29 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
30 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
31 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
32 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
33 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
34 import org.openecomp.sdc.common.jsongraph.util.CommonUtility;
35 import org.openecomp.sdc.common.jsongraph.util.CommonUtility.LogLevelEnum;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
40 import fj.data.Either;
42 @org.springframework.stereotype.Component("artifacts-operations")
44 public class ArtifactsOperations extends BaseOperation {
45 private static Logger log = LoggerFactory.getLogger(ArtifactsOperations.class.getName());
47 public Either<ArtifactDefinition, StorageOperationStatus> addArifactToComponent(ArtifactDefinition artifactInfo, String parentId, NodeTypeEnum type, boolean failIfExist, String instanceId) {
49 Either<ArtifactDataDefinition, StorageOperationStatus> status = updateArtifactOnGraph(parentId, artifactInfo, type, artifactInfo.getUniqueId(), instanceId, false);
50 if (status.isRight()) {
52 log.debug("Failed to update artifact {} of {} {}. status is {}", artifactInfo.getArtifactName(), type.getName(), parentId, status.right().value());
53 BeEcompErrorManager.getInstance().logBeFailedUpdateNodeError("Update Artifact", artifactInfo.getArtifactName(), String.valueOf(status.right().value()));
54 return Either.right(status.right().value());
57 ArtifactDataDefinition artifactData = status.left().value();
59 ArtifactDefinition artifactDefResult = convertArtifactDataToArtifactDefinition(artifactInfo, artifactData);
60 log.debug("The returned ArtifactDefintion is {}", artifactDefResult);
61 return Either.left(artifactDefResult);
66 public Either<ArtifactDefinition, StorageOperationStatus> updateArifactOnResource(ArtifactDefinition artifactInfo, String id, String artifactId, NodeTypeEnum type, String instanceId) {
68 Either<ArtifactDataDefinition, StorageOperationStatus> status = updateArtifactOnGraph(id, artifactInfo, type, artifactId, instanceId, true);
69 if (status.isRight()) {
71 log.debug("Failed to update artifact {} of {} {}. status is {}", artifactInfo.getArtifactName(), type.getName(), id, status.right().value());
72 BeEcompErrorManager.getInstance().logBeFailedUpdateNodeError("Update Artifact", artifactInfo.getArtifactName(), String.valueOf(status.right().value()));
73 return Either.right(status.right().value());
76 ArtifactDataDefinition artifactData = status.left().value();
78 ArtifactDefinition artifactDefResult = convertArtifactDataToArtifactDefinition(artifactInfo, artifactData);
79 log.debug("The returned ArtifactDefintion is {}", artifactDefResult);
80 return Either.left(artifactDefResult);
84 public Either<Boolean, StorageOperationStatus> isCloneNeeded(String parentId, ArtifactDefinition artifactInfo, NodeTypeEnum type) {
85 ArtifactGroupTypeEnum groupType = artifactInfo.getArtifactGroupType();
87 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(groupType, type);
88 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
89 return super.isCloneNeeded(parentId, edgeLabelEnum);
92 public Either<ArtifactDefinition, StorageOperationStatus> getArtifactById(String parentId, String id) {
93 return getArtifactById(parentId, id, null, null);
96 public Either<ArtifactDefinition, StorageOperationStatus> getArtifactById(String parentId, String id, ComponentTypeEnum componentType, String containerId) {
97 Either<ArtifactDefinition, StorageOperationStatus> result = null;
98 ArtifactDataDefinition foundArtifact = null;
99 if (componentType != null && componentType == ComponentTypeEnum.RESOURCE_INSTANCE) {
100 foundArtifact = getInstanceArtifactByLabelAndId(parentId, id, containerId, EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS);
101 if ( foundArtifact == null ){
102 foundArtifact = getInstanceArtifactByLabelAndId(parentId, id, containerId, EdgeLabelEnum.INSTANCE_ARTIFACTS);
105 if (foundArtifact == null) {
106 foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.DEPLOYMENT_ARTIFACTS);
108 if (foundArtifact == null) {
109 foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.TOSCA_ARTIFACTS);
112 if (foundArtifact == null) {
113 foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.ARTIFACTS);
116 if (foundArtifact == null) {
117 foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.SERVICE_API_ARTIFACTS);
120 if (foundArtifact == null) {
121 result = Either.right(StorageOperationStatus.NOT_FOUND);
125 ArtifactDefinition artifactDefResult = convertArtifactDataToArtifactDefinition(null, foundArtifact);
126 return Either.left(artifactDefResult);
130 public Either<ArtifactDefinition, StorageOperationStatus> removeArifactFromResource(String id, String artifactId, NodeTypeEnum type, boolean deleteMandatoryArtifact) {
131 Either<ArtifactDefinition, StorageOperationStatus> status = removeArtifactOnGraph(id, artifactId, type, deleteMandatoryArtifact);
133 if (status.isRight()) {
135 log.debug("Failed to delete artifact {} of resource {}", artifactId, id);
137 BeEcompErrorManager.getInstance().logBeFailedDeleteNodeError("Delete Artifact", artifactId, String.valueOf(status.right().value()));
138 return Either.right(status.right().value());
141 return Either.left(status.left().value());
145 public Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getArtifacts(String parentId, NodeTypeEnum parentType, ArtifactGroupTypeEnum groupType, String instanceId) {
147 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(groupType, parentType);
148 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
150 Either<Map<String, ArtifactDefinition>, TitanOperationStatus> foundArtifact = null;
151 Map<String, ArtifactDefinition> resMap = new HashMap<>();
152 foundArtifact = getArtifactByLabel(parentId, instanceId, edgeLabelEnum);
153 if (foundArtifact.isRight()) {
154 log.debug("Failed to find artifact in component {} with label {} ", parentId, edgeLabelEnum);
155 return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(foundArtifact.right().value()));
158 resMap.putAll(foundArtifact.left().value());
160 return Either.left(resMap);
163 public Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getArtifacts(String parentId) {
165 Either<Map<String, ArtifactDefinition>, TitanOperationStatus> foundArtifact = null;
166 Map<String, ArtifactDefinition> resMap = new HashMap<>();
167 foundArtifact = getArtifactByLabel(parentId, null, EdgeLabelEnum.ARTIFACTS);
168 if (foundArtifact.isLeft()) {
169 resMap.putAll(foundArtifact.left().value());
172 foundArtifact = getArtifactByLabel(parentId, null, EdgeLabelEnum.DEPLOYMENT_ARTIFACTS);
173 if (foundArtifact.isLeft()) {
174 resMap.putAll(foundArtifact.left().value());
177 foundArtifact = getArtifactByLabel(parentId, null, EdgeLabelEnum.TOSCA_ARTIFACTS);
178 if (foundArtifact.isLeft()) {
179 resMap.putAll(foundArtifact.left().value());
183 return Either.left(resMap);
187 public Either<ArtifactDefinition, StorageOperationStatus> removeArtifactOnGraph(String id, String artifactId, NodeTypeEnum type, boolean deleteMandatoryArtifact) {
189 Either<ArtifactDefinition, StorageOperationStatus> artifactData = this.getArtifactById(id, artifactId);
190 if (artifactData.isRight()) {
191 log.debug("Failed to find artifact in component {} with id {} ", id, artifactId);
192 return Either.right(artifactData.right().value());
194 ArtifactDataDefinition artifactDefinition = artifactData.left().value();
195 boolean isMandatory = false;
196 if ((artifactDefinition.getMandatory() || artifactDefinition.getServiceApi()) && !deleteMandatoryArtifact) {
197 // return Either.left(artifactData.left().value());
201 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(artifactDefinition.getArtifactGroupType(), type);
202 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
203 VertexTypeEnum vertexTypeEnum = triple.getRight();
206 StorageOperationStatus status = deleteToscaDataElement(id, edgeLabelEnum, vertexTypeEnum, artifactDefinition.getArtifactLabel(), JsonPresentationFields.ARTIFACT_LABEL);
207 if (status != StorageOperationStatus.OK)
208 return Either.right(status);
211 return Either.left(artifactData.left().value());
215 public void updateUUID(ArtifactDataDefinition artifactData, String oldChecksum, String oldVesrion, boolean isUpdate, EdgeLabelEnum edgeLabel) {
216 if (oldVesrion == null || oldVesrion.isEmpty())
219 String currentChecksum = artifactData.getArtifactChecksum();
222 ArtifactTypeEnum type = ArtifactTypeEnum.findType(artifactData.getArtifactType());
225 if ( edgeLabel == EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS ){
226 generateUUID(artifactData, oldVesrion);
228 updateVersionAndDate(artifactData, oldVesrion);
234 generateUUID(artifactData, oldVesrion);
237 if (oldChecksum == null || oldChecksum.isEmpty()) {
238 if (currentChecksum != null) {
239 generateUUID(artifactData, oldVesrion);
241 } else if ((currentChecksum != null && !currentChecksum.isEmpty()) && !oldChecksum.equals(currentChecksum)) {
242 generateUUID(artifactData, oldVesrion);
247 if (oldChecksum == null || oldChecksum.isEmpty()) {
248 if (currentChecksum != null) {
249 generateUUID(artifactData, oldVesrion);
251 } else if ((currentChecksum != null && !currentChecksum.isEmpty()) && !oldChecksum.equals(currentChecksum)) {
252 generateUUID(artifactData, oldVesrion);
257 // @TODO add implementation
259 public Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getArtifacts(String parentId, NodeTypeEnum parentType) {
263 public Either<ArtifactDefinition, StorageOperationStatus> addHeatEnvArtifact(ArtifactDefinition artifactHeatEnv, ArtifactDefinition artifactHeat, String componentId, NodeTypeEnum parentType, boolean failIfExist, String instanceId) {
264 artifactHeatEnv.setGeneratedFromId(artifactHeat.getUniqueId());
265 return addArifactToComponent(artifactHeatEnv, componentId, parentType, failIfExist, instanceId);
268 public Either<ArtifactDefinition, StorageOperationStatus> getHeatArtifactByHeatEnvId(String parentId, ArtifactDefinition heatEnv, NodeTypeEnum parentType, String containerId, ComponentTypeEnum componentType) {
269 String id = heatEnv.getGeneratedFromId();
270 ComponentTypeEnum compType;
271 switch (parentType) {
272 case ResourceInstance:
273 compType = ComponentTypeEnum.RESOURCE_INSTANCE;
276 compType = componentType;
278 return getArtifactById(parentId, id, compType, containerId);
281 public Either<ArtifactDefinition, StorageOperationStatus> updateHeatEnvArtifact(String id, ArtifactDefinition artifactEnvInfo, String artifactId, String newArtifactId, NodeTypeEnum type, String instanceId) {
283 Either<Map<String, ArtifactDefinition>, TitanOperationStatus> artifactsEither = getArtifactByLabel(id, instanceId, EdgeLabelEnum.DEPLOYMENT_ARTIFACTS);
284 if (artifactsEither.isRight()) {
285 log.debug("Failed to find artifacts in component {} with id {} ", id, artifactsEither.right().value());
286 return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(artifactsEither.right().value()));
289 Map<String, ArtifactDefinition> artifacts = artifactsEither.left().value();
290 List<ArtifactDefinition> envList = artifacts.values().stream().filter(a -> a.getGeneratedFromId()!= null && a.getGeneratedFromId().equals(artifactId)).collect(Collectors.toList());
291 if (envList != null && !envList.isEmpty()) {
292 envList.forEach(a -> {
293 a.setGeneratedFromId(newArtifactId);
294 updateArifactOnResource(a, id, a.getUniqueId(), type, instanceId);
299 return Either.left(artifactEnvInfo);
302 public Either<ArtifactDefinition, StorageOperationStatus> updateHeatEnvPlaceholder(ArtifactDefinition artifactInfo, String parentId, NodeTypeEnum type) {
303 return updateArifactOnResource(artifactInfo, parentId, artifactInfo.getUniqueId(), type, null);
306 // public Either<List<HeatParameterDefinition>, StorageOperationStatus> getHeatParamsForEnv(ArtifactDefinition heatEnvArtifact, String parentId) {
310 ///////////////////////////////////////////// private methods ////////////////////////////////////////////////////
312 protected ArtifactDefinition convertArtifactDataToArtifactDefinition(ArtifactDefinition artifactInfo, ArtifactDataDefinition artifactDefResult) {
313 log.debug("The object returned after create property is {}", artifactDefResult);
315 ArtifactDefinition propertyDefResult = new ArtifactDefinition(artifactDefResult);
316 if (artifactInfo != null)
317 propertyDefResult.setPayload(artifactInfo.getPayloadData());
319 List<HeatParameterDefinition> parameters = new ArrayList<HeatParameterDefinition>();
321 * StorageOperationStatus heatParametersOfNode = heatParametersOperation.getHeatParametersOfNode(NodeTypeEnum.ArtifactRef, artifactDefResult.getUniqueId().toString(), parameters); if ((heatParametersOfNode.equals(StorageOperationStatus.OK))
322 * && !parameters.isEmpty()) { propertyDefResult.setHeatParameters(parameters); }
324 return propertyDefResult;
327 private ArtifactDataDefinition getInstanceArtifactByLabelAndId(String parentId, String id, String containerId, EdgeLabelEnum edgeLabelEnum) {
328 ArtifactDataDefinition foundArtifact = null;
329 Either<Map<String, MapArtifactDataDefinition>, TitanOperationStatus> artifactsEither = getDataFromGraph(containerId, edgeLabelEnum);
330 if (artifactsEither.isRight()) {
331 log.debug("failed to fetch {} for tosca element with id {}, error {}", edgeLabelEnum, containerId, artifactsEither.right().value());
335 Map<String, MapArtifactDataDefinition> artifacts = artifactsEither.left().value();
337 MapArtifactDataDefinition artifactsPerInstance = artifacts.get(parentId);
338 if (artifactsPerInstance == null) {
339 log.debug("failed to fetch artifacts for instance {} in tosca element with id {}, error {}", parentId, containerId, artifactsEither.right().value());
342 Optional<ArtifactDataDefinition> op = artifactsPerInstance.getMapToscaDataDefinition().values().stream().filter(p -> p.getUniqueId().equals(id)).findAny();
343 if (op.isPresent()) {
344 foundArtifact = op.get();
346 return foundArtifact;
349 private ArtifactDataDefinition getArtifactByLabelAndId(String parentId, String id, EdgeLabelEnum edgeLabelEnum) {
350 ArtifactDataDefinition foundArtifact = null;
351 Either<Map<String, ArtifactDataDefinition>, TitanOperationStatus> artifactsEither = getDataFromGraph(parentId, edgeLabelEnum);
352 if (artifactsEither.isRight()) {
353 log.debug("failed to fetch {} for tosca element with id {}, error {}", edgeLabelEnum, parentId, artifactsEither.right().value());
357 Map<String, ArtifactDataDefinition> artifacts = artifactsEither.left().value();
358 Optional<ArtifactDataDefinition> op = artifacts.values().stream().filter(p -> p.getUniqueId().equals(id)).findAny();
359 if (op.isPresent()) {
360 foundArtifact = op.get();
362 return foundArtifact;
365 private Either<Map<String, ArtifactDefinition>, TitanOperationStatus> getArtifactByLabel(String parentId, String instanceId, EdgeLabelEnum edgeLabelEnum) {
367 Map<String, ArtifactDefinition> artMap = null;
368 Map<String, ArtifactDataDefinition> artifactDataMap = null;
370 if (edgeLabelEnum != EdgeLabelEnum.INSTANCE_ARTIFACTS) {
371 Either<Map<String, ArtifactDataDefinition>, TitanOperationStatus> resultEither = getDataFromGraph(parentId, edgeLabelEnum);
372 if (resultEither.isRight()) {
373 log.debug("failed to fetch {} for tosca element with id {}, error {}", edgeLabelEnum, parentId, resultEither.right().value());
374 return Either.right(resultEither.right().value());
376 artifactDataMap = resultEither.left().value();
378 Either<Map<String, MapArtifactDataDefinition>, TitanOperationStatus> resultEither = getDataFromGraph(parentId, edgeLabelEnum);
379 if (resultEither.isRight()) {
380 log.debug("failed to fetch {} for tosca element with id {}, error {}", edgeLabelEnum, parentId, resultEither.right().value());
381 return Either.right(resultEither.right().value());
383 Map<String, MapArtifactDataDefinition> mapArtifacts = resultEither.left().value();
384 MapArtifactDataDefinition artifactPerInstance = mapArtifacts.get(instanceId);
385 if ( artifactPerInstance != null ){
386 artifactDataMap = artifactPerInstance.getMapToscaDataDefinition();
389 if (artifactDataMap != null && !artifactDataMap.isEmpty()) {
390 artMap = artifactDataMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> convertArtifactDataToArtifactDefinition(null, e.getValue())));
392 artMap = new HashMap<>();
394 return Either.left(artMap);
398 private Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> getEdgeLabelEnumFromArtifactGroupType(ArtifactGroupTypeEnum groupType, NodeTypeEnum nodeType) {
399 EdgeLabelEnum edgeLabelEnum;
400 VertexTypeEnum vertexTypeEnum;
401 Boolean isDeepElement = false;
403 * if (nodeType == NodeTypeEnum.ResourceInstance) { edgeLabelEnum = EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS; vertexTypeEnum = VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS; isDeepElement = true; } else {
407 edgeLabelEnum = EdgeLabelEnum.TOSCA_ARTIFACTS;
408 vertexTypeEnum = VertexTypeEnum.TOSCA_ARTIFACTS;
411 if (nodeType == NodeTypeEnum.ResourceInstance) {
412 edgeLabelEnum = EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS;
413 vertexTypeEnum = VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS;
414 isDeepElement = true;
416 edgeLabelEnum = EdgeLabelEnum.DEPLOYMENT_ARTIFACTS;
417 vertexTypeEnum = VertexTypeEnum.DEPLOYMENT_ARTIFACTS;
421 edgeLabelEnum = EdgeLabelEnum.SERVICE_API_ARTIFACTS;
422 vertexTypeEnum = VertexTypeEnum.SERVICE_API_ARTIFACTS;
425 if (nodeType == NodeTypeEnum.ResourceInstance) {
426 edgeLabelEnum = EdgeLabelEnum.INSTANCE_ARTIFACTS;
427 vertexTypeEnum = VertexTypeEnum.INSTANCE_ARTIFACTS;
428 isDeepElement = true;
430 edgeLabelEnum = EdgeLabelEnum.ARTIFACTS;
431 vertexTypeEnum = VertexTypeEnum.ARTIFACTS;
436 return new ImmutableTriple<EdgeLabelEnum, Boolean, VertexTypeEnum>(edgeLabelEnum, isDeepElement, vertexTypeEnum);
440 public Either<ArtifactDataDefinition, StorageOperationStatus> updateArtifactOnGraph(String componentId, ArtifactDefinition artifactInfo, NodeTypeEnum type, String artifactId, String instanceId, boolean isUpdate) {
441 Either<ArtifactDataDefinition, StorageOperationStatus> res = null;
442 ArtifactDataDefinition artifactToUpdate = new ArtifactDataDefinition(artifactInfo);
443 ArtifactGroupTypeEnum groupType = artifactInfo.getArtifactGroupType();
445 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(groupType, type);
446 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
447 VertexTypeEnum vertexTypeEnum = triple.getRight();
449 Either<Boolean, StorageOperationStatus> isNeedToCloneEither = isCloneNeeded(componentId, edgeLabelEnum);
450 if (isNeedToCloneEither.isRight()) {
451 log.debug("Failed check is clone needed {}", componentId);
452 return Either.right(isNeedToCloneEither.right().value());
455 boolean isNeedToClone = isNeedToCloneEither.left().value();
457 if (artifactId == null || isNeedToClone) {
459 if (edgeLabelEnum != EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS && edgeLabelEnum != EdgeLabelEnum.INSTANCE_ARTIFACTS) {
460 uniqueId = UniqueIdBuilder.buildPropertyUniqueId(componentId, artifactToUpdate.getArtifactLabel());
462 uniqueId = UniqueIdBuilder.buildPropertyUniqueId(instanceId, artifactToUpdate.getArtifactLabel());
464 artifactToUpdate.setUniqueId(uniqueId);
467 artifactToUpdate.setUniqueId(artifactId);
469 Map<String, ArtifactDataDefinition> artifacts = null;
470 if (edgeLabelEnum != EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS && edgeLabelEnum != EdgeLabelEnum.INSTANCE_ARTIFACTS) {
472 Either<Map<String, ArtifactDataDefinition>, TitanOperationStatus> artifactsEither = this.getDataFromGraph(componentId, edgeLabelEnum);
474 if (artifactsEither.isLeft() && artifactsEither.left().value() != null && !artifactsEither.left().value().isEmpty()) {
475 artifacts = artifactsEither.left().value();
477 artifacts.values().stream().forEach(a -> a.setDuplicated(Boolean.TRUE));
481 Either<Map<String, MapArtifactDataDefinition>, TitanOperationStatus> artifactsEither = this.getDataFromGraph(componentId, edgeLabelEnum);
482 if (artifactsEither.isLeft()) {
483 Map<String, MapArtifactDataDefinition> artifactInst = artifactsEither.left().value();
485 artifactInst.values().forEach(ma -> ma.getMapToscaDataDefinition().values().forEach(a -> a.setDuplicated(Boolean.TRUE)));
487 MapArtifactDataDefinition artifatcsOnInstance = artifactInst.get(instanceId);
488 if (artifatcsOnInstance != null) {
489 artifacts = artifatcsOnInstance.getMapToscaDataDefinition();
493 String oldChecksum = null;
494 String oldVersion = null;
495 if (artifacts != null && artifacts.containsKey(artifactInfo.getArtifactLabel())) {
496 ArtifactDataDefinition oldArtifactData = artifacts.get(artifactInfo.getArtifactLabel());
497 oldChecksum = oldArtifactData.getArtifactChecksum();
498 oldVersion = oldArtifactData.getArtifactVersion();
500 artifactToUpdate.setDuplicated(Boolean.FALSE);
502 if (artifactToUpdate.getDuplicated()) {
503 String id = type != NodeTypeEnum.ResourceInstance ? componentId : instanceId;
504 String uniqueId = UniqueIdBuilder.buildPropertyUniqueId(id, artifactToUpdate.getArtifactLabel());
505 artifactToUpdate.setUniqueId(uniqueId);
506 artifactToUpdate.setDuplicated(Boolean.TRUE);
510 updateUUID(artifactToUpdate, oldChecksum, oldVersion, isUpdate, edgeLabelEnum );
512 if (artifactInfo.getPayloadData() == null) {
513 if (!artifactToUpdate.getMandatory() || artifactToUpdate.getEsId() != null) {
514 artifactToUpdate.setEsId(artifactToUpdate.getUniqueId());
517 if (artifactToUpdate.getEsId() == null) {
518 artifactToUpdate.setEsId(artifactToUpdate.getUniqueId());
523 StorageOperationStatus status;
524 if (edgeLabelEnum != EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS && edgeLabelEnum != EdgeLabelEnum.INSTANCE_ARTIFACTS) {
525 status = updateToscaDataOfToscaElement(componentId, edgeLabelEnum, vertexTypeEnum, artifactToUpdate, JsonPresentationFields.ARTIFACT_LABEL);
527 List<String> pathKeys = new ArrayList<>();
528 pathKeys.add(instanceId);
529 List<ArtifactDataDefinition> toscaDataList = new ArrayList<>();
530 toscaDataList.add(artifactToUpdate);
531 status = updateToscaDataDeepElementsOfToscaElement(componentId, edgeLabelEnum, vertexTypeEnum, toscaDataList, pathKeys, JsonPresentationFields.ARTIFACT_LABEL);
533 if (status == StorageOperationStatus.OK)
534 res = Either.left(artifactToUpdate);
536 res = Either.right(status);
540 public void generateUUID(ArtifactDataDefinition artifactData, String oldVesrion) {
542 UUID uuid = UUID.randomUUID();
543 artifactData.setArtifactUUID(uuid.toString());
544 MDC.put("serviceInstanceID", uuid.toString());
545 updateVersionAndDate(artifactData, oldVesrion);
548 private void updateVersionAndDate(ArtifactDataDefinition artifactData, String oldVesrion) {
549 if (artifactData.getArtifactChecksum() != null) {
550 long time = System.currentTimeMillis();
551 artifactData.setPayloadUpdateDate(time);
553 int newVersion = new Integer(oldVesrion).intValue();
555 artifactData.setArtifactVersion(String.valueOf(newVersion));
558 private boolean validateParentType(NodeTypeEnum type) {
559 boolean isValid = false;
562 case InterfaceOperation:
564 case ResourceInstance:
568 log.debug("Not supported node type for artifact relation : {} ", type);
573 public Either<ArtifactDataDefinition, StorageOperationStatus> removeArtifactOnGraph(ArtifactDefinition artifactFromGraph, String componentId, String instanceId, NodeTypeEnum type, boolean deleteMandatoryArtifact) {
575 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(artifactFromGraph.getArtifactGroupType(), type);
576 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
577 VertexTypeEnum vertexTypeEnum = triple.getRight();
579 if (deleteMandatoryArtifact || !(artifactFromGraph.getMandatory() || artifactFromGraph.getServiceApi())) {
580 StorageOperationStatus status;
581 if (triple.getMiddle()) {
582 List<String> pathKeys = new ArrayList<>();
583 pathKeys.add(instanceId);
584 status = deleteToscaDataDeepElement(componentId, edgeLabelEnum, vertexTypeEnum, artifactFromGraph.getArtifactLabel(), pathKeys, JsonPresentationFields.ARTIFACT_LABEL);
586 status = deleteToscaDataElement(componentId, edgeLabelEnum, vertexTypeEnum, artifactFromGraph.getArtifactLabel(), JsonPresentationFields.ARTIFACT_LABEL);
588 if (status != StorageOperationStatus.OK)
589 return Either.right(status);
591 return Either.left(artifactFromGraph);
595 public Either<ArtifactDataDefinition, StorageOperationStatus> deleteArtifactWithClonnigOnGraph(String componentId, ArtifactDefinition artifactToDelete, NodeTypeEnum type, String instanceId, boolean deleteMandatoryArtifact) {
597 Either<ArtifactDataDefinition, StorageOperationStatus> result = null;
598 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(artifactToDelete.getArtifactGroupType(), type);
599 EdgeLabelEnum edgeLabel = triple.getLeft();
600 VertexTypeEnum vertexLabel = triple.getRight();
602 Boolean deleteElement = deleteMandatoryArtifact || !(artifactToDelete.getMandatory() || artifactToDelete.getServiceApi());
603 Map<String, ToscaDataDefinition> artifacts = null;
604 GraphVertex parentVertex = null;
605 Either<Map<String, ToscaDataDefinition>, TitanOperationStatus> getArtifactsRes = null;
607 Either<GraphVertex, TitanOperationStatus> getToscaElementRes = titanDao.getVertexById(componentId, JsonParseFlagEnum.NoParse);
608 if (getToscaElementRes.isRight()) {
609 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to get tosca element {} upon getting tosca data from graph. Status is {}. ", componentId, getToscaElementRes.right().value());
610 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(getToscaElementRes.right().value()));
612 if (result == null) {
613 parentVertex = getToscaElementRes.left().value();
614 getArtifactsRes = this.getDataFromGraph(parentVertex, edgeLabel);
615 if (getArtifactsRes.isRight()) {
616 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(getArtifactsRes.right().value()));
619 if (result == null) {
620 artifacts = getArtifactsRes.left().value();
621 if (triple.getMiddle()) {
622 artifacts.values().forEach(ma -> ((MapArtifactDataDefinition) ma).getMapToscaDataDefinition().values().forEach(a -> a.setDuplicated(Boolean.TRUE)));
623 MapArtifactDataDefinition artifatcsOnInstance = (MapArtifactDataDefinition) artifacts.get(instanceId);
624 if (artifatcsOnInstance != null && deleteElement) {
625 artifatcsOnInstance.getMapToscaDataDefinition().remove(artifactToDelete.getArtifactLabel());
629 artifacts.remove(artifactToDelete.getArtifactLabel());
631 artifacts.values().stream().forEach(a -> ((ArtifactDataDefinition) a).setDuplicated(Boolean.TRUE));
633 artifactToDelete.setDuplicated(Boolean.TRUE);
635 if (artifacts != null) {
636 TitanOperationStatus status = titanDao.deleteEdgeByDirection(parentVertex, Direction.OUT, edgeLabel);
637 if (status != TitanOperationStatus.OK) {
638 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(status));
639 } else if (MapUtils.isNotEmpty(artifacts)) {
640 Either<GraphVertex, StorageOperationStatus> assosiateRes = assosiateElementToData(parentVertex, vertexLabel, edgeLabel, artifacts);
641 if (assosiateRes.isRight()) {
642 result = Either.right(result.right().value());
646 if (result == null) {
647 result = Either.left(artifactToDelete);