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.jsonjanusgraph.operations;
 
  23 import fj.data.Either;
 
  24 import org.apache.commons.collections.MapUtils;
 
  25 import org.apache.commons.lang.text.StrBuilder;
 
  26 import org.apache.commons.lang3.tuple.ImmutableTriple;
 
  27 import org.apache.commons.lang3.tuple.Triple;
 
  28 import org.apache.tinkerpop.gremlin.structure.Direction;
 
  29 import org.openecomp.sdc.be.config.BeEcompErrorManager;
 
  30 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
 
  31 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
 
  32 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
 
  33 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
 
  34 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
 
  35 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
 
  36 import org.openecomp.sdc.be.datatypes.elements.HeatParameterDataDefinition;
 
  37 import org.openecomp.sdc.be.datatypes.elements.InterfaceDataDefinition;
 
  38 import org.openecomp.sdc.be.datatypes.elements.MapArtifactDataDefinition;
 
  39 import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
 
  40 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
 
  41 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
 
  42 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
 
  43 import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
 
  44 import org.openecomp.sdc.be.model.ArtifactDefinition;
 
  45 import org.openecomp.sdc.be.model.Component;
 
  46 import org.openecomp.sdc.be.model.HeatParameterDefinition;
 
  47 import org.openecomp.sdc.be.model.InterfaceDefinition;
 
  48 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 
  49 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
 
  50 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
 
  51 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
 
  52 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
 
  53 import org.openecomp.sdc.common.jsongraph.util.CommonUtility;
 
  54 import org.openecomp.sdc.common.jsongraph.util.CommonUtility.LogLevelEnum;
 
  55 import org.openecomp.sdc.common.log.api.ILogConfiguration;
 
  56 import org.openecomp.sdc.common.log.wrappers.Logger;
 
  57 import org.openecomp.sdc.common.util.GeneralUtility;
 
  61 import java.util.Map.Entry;
 
  62 import java.util.stream.Collectors;
 
  64 @org.springframework.stereotype.Component("artifacts-operations")
 
  65 public class ArtifactsOperations extends BaseOperation {
 
  66     private static final String FAILED_TO_FETCH_FOR_TOSCA_ELEMENT_WITH_ID_ERROR = "failed to fetch {} for tosca element with id {}, error {}";
 
  67         private static final Logger log = Logger.getLogger(ArtifactsOperations.class.getName());
 
  69     public Either<ArtifactDefinition, StorageOperationStatus> addArtifactToComponent(ArtifactDefinition artifactInfo,
 
  70            Component component, NodeTypeEnum type, boolean failIfExist, String instanceId) {
 
  72         String parentId = component.getUniqueId();
 
  73         String artifactId = artifactInfo.getUniqueId();
 
  74         if (artifactId == null && artifactInfo.getEsId() != null) {
 
  75             artifactId = artifactInfo.getEsId();
 
  77         Either<ArtifactDataDefinition, StorageOperationStatus> status = updateArtifactOnGraph(component, artifactInfo, type, artifactId, instanceId, false, false);
 
  78         if (status.isRight()) {
 
  80             log.debug("Failed to update artifact {} of {} {}. status is {}", artifactInfo.getArtifactName(), type.getName(), parentId, status.right().value());
 
  81             BeEcompErrorManager.getInstance().logBeFailedUpdateNodeError("Update Artifact", artifactInfo.getArtifactName(), String.valueOf(status.right().value()));
 
  82             return Either.right(status.right().value());
 
  85             ArtifactDataDefinition artifactData = status.left().value();
 
  87             ArtifactDefinition artifactDefResult = convertArtifactDataToArtifactDefinition(artifactInfo, artifactData);
 
  88             log.debug("The returned ArtifactDefintion is {}", artifactDefResult);
 
  89             return Either.left(artifactDefResult);
 
  94     public Either<ArtifactDefinition, StorageOperationStatus> updateArtifactOnResource(ArtifactDefinition artifactInfo,
 
  95            Component component, String artifactId, NodeTypeEnum type, String instanceId, boolean isUpdate) {
 
  97         String id = component.getUniqueId();
 
  98         Either<ArtifactDataDefinition, StorageOperationStatus> status = updateArtifactOnGraph(component, artifactInfo, type, artifactId, instanceId, isUpdate, false);
 
  99         if (status.isRight()) {
 
 101             log.debug("Failed to update artifact {} of {} {}. status is {}", artifactInfo.getArtifactName(), type.getName(), id, status.right().value());
 
 102             BeEcompErrorManager.getInstance().logBeFailedUpdateNodeError("Update Artifact", artifactInfo.getArtifactName(), String.valueOf(status.right().value()));
 
 103             return Either.right(status.right().value());
 
 106             ArtifactDataDefinition artifactData = status.left().value();
 
 108             ArtifactDefinition artifactDefResult = convertArtifactDataToArtifactDefinition(artifactInfo, artifactData);
 
 109             log.debug("The returned ArtifactDefinition is {}", artifactDefResult);
 
 110             return Either.left(artifactDefResult);
 
 114     public Either<Boolean, StorageOperationStatus> isCloneNeeded(String parentId, ArtifactDefinition artifactInfo, NodeTypeEnum type) {
 
 115         ArtifactGroupTypeEnum groupType = artifactInfo.getArtifactGroupType();
 
 117         Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(groupType, type);
 
 118         EdgeLabelEnum edgeLabelEnum = triple.getLeft();
 
 119         return super.isCloneNeeded(parentId, edgeLabelEnum);
 
 122     public Either<ArtifactDefinition, StorageOperationStatus> getArtifactById(String parentId, String id) {
 
 123         return getArtifactById(parentId, id, null, null);
 
 126     public Either<ArtifactDefinition, StorageOperationStatus> getArtifactById(String parentId, String id, ComponentTypeEnum componentType, String containerId) {
 
 127         Either<ArtifactDefinition, StorageOperationStatus> result = null;
 
 128         ArtifactDataDefinition foundArtifact = null;
 
 129         if (componentType != null && componentType == ComponentTypeEnum.RESOURCE_INSTANCE) {
 
 130             foundArtifact = getInstanceArtifactByLabelAndId(parentId, id, containerId, EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS);
 
 131             if (foundArtifact == null) {
 
 132                 foundArtifact = getInstanceArtifactByLabelAndId(parentId, id, containerId, EdgeLabelEnum.INSTANCE_ARTIFACTS);
 
 135         if (foundArtifact == null) {
 
 136             foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.DEPLOYMENT_ARTIFACTS);
 
 138         if (foundArtifact == null) {
 
 139             foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.TOSCA_ARTIFACTS);
 
 142         if (foundArtifact == null) {
 
 143             foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.ARTIFACTS);
 
 146         if (foundArtifact == null) {
 
 147             foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.SERVICE_API_ARTIFACTS);
 
 149                 if (foundArtifact == null) {
 
 150                         foundArtifact = findInterfaceArtifact(parentId, id);
 
 154         if (foundArtifact == null) {
 
 155             result = Either.right(StorageOperationStatus.NOT_FOUND);
 
 159         ArtifactDefinition artifactDefResult = convertArtifactDataToArtifactDefinition(null, foundArtifact);
 
 160         return Either.left(artifactDefResult);
 
 163         private ArtifactDataDefinition findInterfaceArtifact(String parentId, String id) {
 
 164                 Either<Map<String, InterfaceDefinition>, JanusGraphOperationStatus> dataFromGraph = getDataFromGraph(parentId, EdgeLabelEnum.INTERFACE);
 
 165                 if (dataFromGraph.isRight()){
 
 166                         log.debug("failed to fetch interfaces {} for tosca element with id {}, error {}", id, parentId ,dataFromGraph.right().value());
 
 170                 Map<String, InterfaceDefinition> interfaceDefinitionMap = dataFromGraph.left().value();
 
 171                 if(interfaceDefinitionMap == null) {
 
 174                 Collection<InterfaceDefinition> interfaces = interfaceDefinitionMap.values();
 
 175                 if (interfaces == null){
 
 178                 for (InterfaceDataDefinition interfaceDataDefinition : interfaces){
 
 179                         Map<String, OperationDataDefinition> operationsMap = interfaceDataDefinition.getOperations();
 
 180                         if (operationsMap == null) {
 
 183                         ArtifactDataDefinition implementationArtifact = getArtifactDataDefinition(id, operationsMap);
 
 184                         if (implementationArtifact != null)
 
 185                                 return implementationArtifact;
 
 190         private ArtifactDataDefinition getArtifactDataDefinition(String id,
 
 191                         Map<String, OperationDataDefinition> operationsMap) {
 
 192                 for(OperationDataDefinition operationDataDefinition : operationsMap.values()){
 
 193                         ArtifactDataDefinition implementationArtifact = operationDataDefinition.getImplementation();
 
 194                         if(implementationArtifact != null){
 
 195                                 String uniqueId = implementationArtifact.getUniqueId();
 
 196                                 if (id.equals(uniqueId)) {
 
 197                                         return  implementationArtifact;
 
 205     public Either<ArtifactDefinition, StorageOperationStatus> removeArifactFromResource(String id, String artifactId, NodeTypeEnum type, boolean deleteMandatoryArtifact) {
 
 206         Either<ArtifactDefinition, StorageOperationStatus> status = removeArtifactOnGraph(id, artifactId, type, deleteMandatoryArtifact);
 
 208         if (status.isRight()) {
 
 210             log.debug("Failed to delete artifact {} of resource {}", artifactId, id);
 
 212             BeEcompErrorManager.getInstance().logBeFailedDeleteNodeError("Delete Artifact", artifactId, String.valueOf(status.right().value()));
 
 213             return Either.right(status.right().value());
 
 216             return Either.left(status.left().value());
 
 220     public Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getArtifacts(String parentId, NodeTypeEnum parentType, ArtifactGroupTypeEnum groupType, String instanceId) {
 
 222         Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(groupType, parentType);
 
 223         EdgeLabelEnum edgeLabelEnum = triple.getLeft();
 
 225         Either<Map<String, ArtifactDefinition>, JanusGraphOperationStatus> foundArtifact = null;
 
 226         Map<String, ArtifactDefinition> resMap = new HashMap<>();
 
 227         foundArtifact = getArtifactByLabel(parentId, instanceId, edgeLabelEnum);
 
 228         if (foundArtifact.isRight()) {
 
 229             log.debug("Failed to find artifact in component {} with label {} ", parentId, edgeLabelEnum);
 
 230             return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(foundArtifact.right().value()));
 
 233         resMap.putAll(foundArtifact.left().value());
 
 235         return Either.left(resMap);
 
 239      * @param parentId   the id of the instance container
 
 240      * @param instanceId the id of the instance of which to return its artifacts
 
 241      * @return instance and instance deployment artifacts mapped by artifact label name
 
 243     public Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getAllInstanceArtifacts(String parentId, String instanceId) {
 
 244         Map<String, ArtifactDataDefinition> resMap = new HashMap<>();
 
 245         Either<Map<String, ArtifactDataDefinition>, JanusGraphOperationStatus> instArtifacts = getInstanceArtifactsByLabel(parentId, instanceId, EdgeLabelEnum.INSTANCE_ARTIFACTS);
 
 246         if (instArtifacts.isRight()) {
 
 247             return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(instArtifacts.right().value()));
 
 249         Either<Map<String, ArtifactDataDefinition>, JanusGraphOperationStatus> deployInstArtifacts = getInstanceArtifactsByLabel(parentId, instanceId, EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS);
 
 250         if (deployInstArtifacts.isRight()) {
 
 251             return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(deployInstArtifacts.right().value()));
 
 253         resMap.putAll(instArtifacts.left().value());
 
 254         resMap.putAll(deployInstArtifacts.left().value());
 
 255         return Either.left(convertArtifactMapToArtifactDefinitionMap(resMap));
 
 258     public Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getArtifacts(String parentId) {
 
 260         Either<Map<String, ArtifactDefinition>, JanusGraphOperationStatus> foundArtifact = null;
 
 261         Map<String, ArtifactDefinition> resMap = new HashMap<>();
 
 262         foundArtifact = getArtifactByLabel(parentId, null, EdgeLabelEnum.ARTIFACTS);
 
 263         if (foundArtifact.isLeft()) {
 
 264             resMap.putAll(foundArtifact.left().value());
 
 267         foundArtifact = getArtifactByLabel(parentId, null, EdgeLabelEnum.DEPLOYMENT_ARTIFACTS);
 
 268         if (foundArtifact.isLeft()) {
 
 269             resMap.putAll(foundArtifact.left().value());
 
 272         foundArtifact = getArtifactByLabel(parentId, null, EdgeLabelEnum.TOSCA_ARTIFACTS);
 
 273         if (foundArtifact.isLeft()) {
 
 274             resMap.putAll(foundArtifact.left().value());
 
 276         return Either.left(resMap);
 
 280     public Either<ArtifactDefinition, StorageOperationStatus> removeArtifactOnGraph(String id, String artifactId, NodeTypeEnum type, boolean deleteMandatoryArtifact) {
 
 282         Either<ArtifactDefinition, StorageOperationStatus> artifactData = this.getArtifactById(id, artifactId);
 
 283         if (artifactData.isRight()) {
 
 284             log.debug("Failed to find artifact in component {} with id {} ", id, artifactId);
 
 285             return Either.right(artifactData.right().value());
 
 287         ArtifactDataDefinition artifactDefinition = artifactData.left().value();
 
 288         boolean isMandatory = false;
 
 289         if ((artifactDefinition.getMandatory() || artifactDefinition.getServiceApi()) && !deleteMandatoryArtifact) {
 
 290             // return Either.left(artifactData.left().value());
 
 294         Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(artifactDefinition.getArtifactGroupType(), type);
 
 295         EdgeLabelEnum edgeLabelEnum = triple.getLeft();
 
 296         VertexTypeEnum vertexTypeEnum = triple.getRight();
 
 299             StorageOperationStatus status = deleteToscaDataElement(id, edgeLabelEnum, vertexTypeEnum, artifactDefinition.getArtifactLabel(), JsonPresentationFields.ARTIFACT_LABEL);
 
 300             if (status != StorageOperationStatus.OK)
 
 301                 return Either.right(status);
 
 304         return Either.left(artifactData.left().value());
 
 308     private void updateUUID(Map<String, ArtifactDefinition> deploymentArtifacts, ArtifactDefinition updateArtifactData, String oldChecksum, String oldVesrion, boolean isUpdate, EdgeLabelEnum edgeLabel, String prevArtUid) {
 
 309         if (oldVesrion == null || oldVesrion.isEmpty()) {
 
 312         String currentChecksum = updateArtifactData.getArtifactChecksum();
 
 315             final ArtifactTypeEnum type = ArtifactTypeEnum.parse(updateArtifactData.getArtifactType());
 
 317                 generateUUIDForNonHeatArtifactType(updateArtifactData, oldChecksum, oldVesrion, currentChecksum);
 
 322                     if (edgeLabel == EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS) {
 
 323                         generateUUID(updateArtifactData, oldVesrion);
 
 329                     boolean changed = false;
 
 330                     Optional<Entry<String, ArtifactDefinition>> any = deploymentArtifacts.entrySet()
 
 332                             .filter(e -> e.getKey().equals(updateArtifactData.getArtifactLabel()))
 
 334                     if ( any.isPresent() ){
 
 335                         if ( !any.get().getValue().getArtifactChecksum().equals(updateArtifactData.getArtifactChecksum()) ){
 
 339                     Optional<Entry<String, ArtifactDefinition>> anyEnv = deploymentArtifacts.entrySet()
 
 341                             .filter(e -> prevArtUid.equals(e.getValue().getGeneratedFromId()))
 
 343                     if ( anyEnv.isPresent() && anyEnv.get().getValue().getHeatParamUpdated()){
 
 344                         String newCheckSum = sortAndCalculateChecksumForHeatParameters(updateArtifactData.getHeatParameters());
 
 345                         if ( !anyEnv.get().getValue().getArtifactChecksum().equals(newCheckSum) ){
 
 347                             anyEnv.get().getValue().setArtifactChecksum(newCheckSum);
 
 348                             UUID uuid = UUID.randomUUID();
 
 349                             anyEnv.get().getValue().setArtifactUUID(uuid.toString());
 
 352                     if ( changed && anyEnv.isPresent() ){
 
 353                             generateUUID(updateArtifactData, oldVesrion);
 
 354                             anyEnv.get().getValue().setGeneratedFromId(updateArtifactData.getUniqueId());
 
 355                             anyEnv.get().getValue().setDuplicated(false);
 
 356                             anyEnv.get().getValue().setArtifactVersion(updateArtifactData.getArtifactVersion());
 
 357                             anyEnv.get().getValue().setHeatParamUpdated(false);
 
 361                     generateUUIDForNonHeatArtifactType(updateArtifactData, oldChecksum, oldVesrion, currentChecksum);
 
 365             generateUUIDForNonHeatArtifactType(updateArtifactData, oldChecksum, oldVesrion, currentChecksum);
 
 369     private void generateUUIDForNonHeatArtifactType(ArtifactDataDefinition artifactData, String oldChecksum, String oldVesrion, String currentChecksum) {
 
 370         if (oldChecksum == null || oldChecksum.isEmpty()) {
 
 371             if (currentChecksum != null) {
 
 372                 generateUUID(artifactData, oldVesrion);
 
 374         } else if ((currentChecksum != null && !currentChecksum.isEmpty()) && !oldChecksum.equals(currentChecksum)) {
 
 375             generateUUID(artifactData, oldVesrion);
 
 379     public Either<ArtifactDefinition, StorageOperationStatus> addHeatEnvArtifact(ArtifactDefinition artifactHeatEnv,
 
 380            ArtifactDefinition artifactHeat, Component component, NodeTypeEnum parentType, boolean failIfExist, String instanceId) {
 
 381         artifactHeatEnv.setGeneratedFromId(artifactHeat.getUniqueId());
 
 382         return addArtifactToComponent(artifactHeatEnv, component, parentType, failIfExist, instanceId);
 
 385     public Either<ArtifactDefinition, StorageOperationStatus> getHeatArtifactByHeatEnvId(final String parentId,
 
 386                                                                                          final ArtifactDefinition heatEnv,
 
 387                                                                                          final String containerId,
 
 388                                                                                          final ComponentTypeEnum componentType) {
 
 389         return getArtifactById(parentId, heatEnv.getGeneratedFromId(), componentType, containerId);
 
 392     public Either<ArtifactDefinition, StorageOperationStatus> updateHeatEnvArtifact(Component component, ArtifactDefinition artifactEnvInfo, String artifactId, String newArtifactId, NodeTypeEnum type, String instanceId) {
 
 394         Either<Map<String, ArtifactDefinition>, JanusGraphOperationStatus> artifactsEither = getArtifactByLabel(component.getUniqueId(), instanceId, EdgeLabelEnum.DEPLOYMENT_ARTIFACTS);
 
 395         return updateHeatEnvArtifact(artifactsEither, component, artifactEnvInfo, artifactId, newArtifactId, type, instanceId);
 
 398     private Either<ArtifactDefinition, StorageOperationStatus> updateHeatEnvArtifact(
 
 399             Either<Map<String, ArtifactDefinition>, JanusGraphOperationStatus> artifactsEither, Component component,
 
 400             ArtifactDefinition artifactEnvInfo, String artifactId, String newArtifactId, NodeTypeEnum type, String instanceId) {
 
 402         String id = component.getUniqueId();
 
 403         if (artifactsEither.isRight()) {
 
 404             log.debug("Failed to find artifacts in component {} with id {} ", id, artifactsEither.right().value());
 
 405             return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(artifactsEither.right().value()));
 
 408         Map<String, ArtifactDefinition> artifacts = artifactsEither.left().value();
 
 409         List<ArtifactDefinition> envList = artifacts.values().stream()
 
 410                 .filter(a -> a.getGeneratedFromId() != null && a.getGeneratedFromId().equals(artifactId))
 
 411                 .collect(Collectors.toList());
 
 412         if (envList != null && !envList.isEmpty()) {
 
 413             envList.forEach(a -> {
 
 414                 a.setGeneratedFromId(newArtifactId);
 
 415                 updateArtifactOnResource(a, component, a.getUniqueId(), type, instanceId, true);
 
 420         return Either.left(artifactEnvInfo);
 
 423     public Either<ArtifactDefinition, StorageOperationStatus> updateHeatEnvArtifactOnInstance(
 
 424             Component component, ArtifactDefinition artifactEnvInfo, String artifactId, String newArtifactId, NodeTypeEnum type, String instanceId) {
 
 426         String id = component.getUniqueId();
 
 427         Either<Map<String, ArtifactDefinition>, JanusGraphOperationStatus> artifactsEither = getArtifactByLabel(id, instanceId, EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS);
 
 428         return updateHeatEnvArtifact(artifactsEither, component, artifactEnvInfo, artifactId, newArtifactId, type, instanceId);
 
 431     public Either<ArtifactDefinition, StorageOperationStatus> updateHeatEnvPlaceholder(ArtifactDefinition artifactInfo, Component parent, NodeTypeEnum type) {
 
 432                 return updateArtifactOnResource(artifactInfo, parent, artifactInfo.getUniqueId(), type, null, true);
 
 436     ///////////////////////////////////////////// private methods ////////////////////////////////////////////////////
 
 438     protected ArtifactDefinition convertArtifactDataToArtifactDefinition(ArtifactDefinition artifactInfo, ArtifactDataDefinition artifactDefResult) {
 
 439         log.debug("The object returned after create property is {}", artifactDefResult);
 
 441         ArtifactDefinition propertyDefResult = new ArtifactDefinition(artifactDefResult);
 
 442         if (artifactInfo != null)
 
 443             propertyDefResult.setPayload(artifactInfo.getPayloadData());
 
 445         List<HeatParameterDefinition> parameters = new ArrayList<>();
 
 447          * StorageOperationStatus heatParametersOfNode = heatParametersOperation.getHeatParametersOfNode(NodeTypeEnum.ArtifactRef, artifactDefResult.getUniqueId().toString(), parameters); if ((heatParametersOfNode.equals(StorageOperationStatus.OK))
 
 448          * && !parameters.isEmpty()) { propertyDefResult.setHeatParameters(parameters); }
 
 450         return propertyDefResult;
 
 453     private ArtifactDataDefinition getInstanceArtifactByLabelAndId(String parentId, String id, String containerId, EdgeLabelEnum edgeLabelEnum) {
 
 454         ArtifactDataDefinition foundArtifact = null;
 
 455         Either<Map<String, MapArtifactDataDefinition>, JanusGraphOperationStatus> artifactsEither = getDataFromGraph(containerId, edgeLabelEnum);
 
 456         if (artifactsEither.isRight()) {
 
 457             log.debug(FAILED_TO_FETCH_FOR_TOSCA_ELEMENT_WITH_ID_ERROR, edgeLabelEnum, containerId, artifactsEither.right().value());
 
 461         Map<String, MapArtifactDataDefinition> artifacts = artifactsEither.left().value();
 
 463         MapArtifactDataDefinition artifactsPerInstance = artifacts.get(parentId);
 
 464         if (artifactsPerInstance == null) {
 
 465             log.debug("failed to fetch artifacts for instance {} in tosca element with id {}, error {}", parentId, containerId, artifactsEither.right().value());
 
 468         Optional<ArtifactDataDefinition> op = artifactsPerInstance.getMapToscaDataDefinition().values().stream().filter(p -> p.getUniqueId().equals(id)).findAny();
 
 469         if (op.isPresent()) {
 
 470             foundArtifact = op.get();
 
 472         return foundArtifact;
 
 475     private ArtifactDataDefinition getArtifactByLabelAndId(String parentId, String id, EdgeLabelEnum edgeLabelEnum) {
 
 476         ArtifactDataDefinition foundArtifact = null;
 
 477         Either<Map<String, ArtifactDataDefinition>, JanusGraphOperationStatus> artifactsEither = getDataFromGraph(parentId, edgeLabelEnum);
 
 478         if (artifactsEither.isRight()) {
 
 479             log.debug(FAILED_TO_FETCH_FOR_TOSCA_ELEMENT_WITH_ID_ERROR, edgeLabelEnum, parentId, artifactsEither.right().value());
 
 483         Map<String, ArtifactDataDefinition> artifacts = artifactsEither.left().value();
 
 484         Optional<ArtifactDataDefinition> op = artifacts.values().stream().filter(p -> p.getUniqueId().equals(id)).findAny();
 
 485         if (op.isPresent()) {
 
 486             foundArtifact = op.get();
 
 488         return foundArtifact;
 
 491     private Either<Map<String, ArtifactDefinition>, JanusGraphOperationStatus> getArtifactByLabel(String parentId, String instanceId, EdgeLabelEnum edgeLabelEnum) {
 
 492         Either<Map<String, ArtifactDataDefinition>, JanusGraphOperationStatus> artifactsEither = getArtifactsDataByLabel(parentId, instanceId, edgeLabelEnum);
 
 493         if (artifactsEither.isRight()) {
 
 494             log.debug(FAILED_TO_FETCH_FOR_TOSCA_ELEMENT_WITH_ID_ERROR, edgeLabelEnum, parentId, artifactsEither.right().value());
 
 495             return Either.right(artifactsEither.right().value());
 
 497         Map<String, ArtifactDataDefinition> artifactDataMap = artifactsEither.left().value();
 
 498         return Either.left(convertArtifactMapToArtifactDefinitionMap(artifactDataMap));
 
 501     private Either<Map<String, ArtifactDataDefinition>, JanusGraphOperationStatus> getArtifactsDataByLabel(String parentId, String instanceId, EdgeLabelEnum edgeLabelEnum) {
 
 502         return edgeLabelEnum.isInstanceArtifactsLabel() ? getInstanceArtifactsByLabel(parentId, instanceId, edgeLabelEnum) : getDataFromGraph(parentId, edgeLabelEnum);
 
 505     private Map<String, ArtifactDefinition> convertArtifactMapToArtifactDefinitionMap(Map<String, ArtifactDataDefinition> artifactDataMap) {
 
 506         Map<String, ArtifactDefinition> artMap = new HashMap<>();
 
 507         if (artifactDataMap != null && !artifactDataMap.isEmpty()) {
 
 508             artMap = artifactDataMap.entrySet().stream().collect(Collectors.toMap(Entry::getKey, e -> convertArtifactDataToArtifactDefinition(null, e.getValue())));
 
 513     private Either<Map<String, ArtifactDataDefinition>, JanusGraphOperationStatus> getInstanceArtifactsByLabel(String parentId, String instanceId, EdgeLabelEnum edgeLabelEnum) {
 
 514         Either<Map<String, MapArtifactDataDefinition>, JanusGraphOperationStatus> resultEither = getDataFromGraph(parentId, edgeLabelEnum);
 
 515         if (resultEither.isRight()) {
 
 516             log.debug(FAILED_TO_FETCH_FOR_TOSCA_ELEMENT_WITH_ID_ERROR, edgeLabelEnum, parentId, resultEither.right().value());
 
 517             return Either.right(resultEither.right().value());
 
 519         Map<String, MapArtifactDataDefinition> mapArtifacts = resultEither.left().value();
 
 520         MapArtifactDataDefinition artifactPerInstance = mapArtifacts.get(instanceId);
 
 521         return artifactPerInstance != null ? Either.left(artifactPerInstance.getMapToscaDataDefinition()) : Either.left(new HashMap<>());
 
 524     private Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> getEdgeLabelEnumFromArtifactGroupType(ArtifactGroupTypeEnum groupType, NodeTypeEnum nodeType) {
 
 525         EdgeLabelEnum edgeLabelEnum;
 
 526         VertexTypeEnum vertexTypeEnum;
 
 527         Boolean isDeepElement = false;
 
 529          * if (nodeType == NodeTypeEnum.ResourceInstance) { edgeLabelEnum = EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS; vertexTypeEnum = VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS; isDeepElement = true; } else {
 
 533                 edgeLabelEnum = EdgeLabelEnum.TOSCA_ARTIFACTS;
 
 534                 vertexTypeEnum = VertexTypeEnum.TOSCA_ARTIFACTS;
 
 537                 if (nodeType == NodeTypeEnum.ResourceInstance) {
 
 538                     edgeLabelEnum = EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS;
 
 539                     vertexTypeEnum = VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS;
 
 540                     isDeepElement = true;
 
 542                     edgeLabelEnum = EdgeLabelEnum.DEPLOYMENT_ARTIFACTS;
 
 543                     vertexTypeEnum = VertexTypeEnum.DEPLOYMENT_ARTIFACTS;
 
 547                 edgeLabelEnum = EdgeLabelEnum.SERVICE_API_ARTIFACTS;
 
 548                 vertexTypeEnum = VertexTypeEnum.SERVICE_API_ARTIFACTS;
 
 551                 if (nodeType == NodeTypeEnum.ResourceInstance) {
 
 552                     edgeLabelEnum = EdgeLabelEnum.INSTANCE_ARTIFACTS;
 
 553                     vertexTypeEnum = VertexTypeEnum.INSTANCE_ARTIFACTS;
 
 554                     isDeepElement = true;
 
 556                     edgeLabelEnum = EdgeLabelEnum.ARTIFACTS;
 
 557                     vertexTypeEnum = VertexTypeEnum.ARTIFACTS;
 
 562         return new ImmutableTriple<>(edgeLabelEnum, isDeepElement, vertexTypeEnum);
 
 566     public Either<ArtifactDataDefinition, StorageOperationStatus> updateArtifactOnGraph(Component component, ArtifactDefinition artifactInfo, NodeTypeEnum type, String artifactId, String instanceId, boolean isUpdate, boolean isDeletePlaceholder) {
 
 567         String componentId = component.getUniqueId();
 
 568         Either<ArtifactDataDefinition, StorageOperationStatus> res = null;
 
 569         ArtifactDefinition artifactToUpdate = new ArtifactDefinition(artifactInfo);
 
 570         ArtifactGroupTypeEnum groupType = artifactInfo.getArtifactGroupType();
 
 572         Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(groupType, type);
 
 573         EdgeLabelEnum edgeLabelEnum = triple.getLeft();
 
 574         VertexTypeEnum vertexTypeEnum = triple.getRight();
 
 576         Either<Boolean, StorageOperationStatus> isNeedToCloneEither = isCloneNeeded(componentId, edgeLabelEnum);
 
 577         if (isNeedToCloneEither.isRight()) {
 
 578             log.debug("Failed check is clone needed {}", componentId);
 
 579             return Either.right(isNeedToCloneEither.right().value());
 
 582         boolean isNeedToClone = isNeedToCloneEither.left().value();
 
 584         String prevArtUid = artifactToUpdate.getUniqueId();
 
 585         if (artifactId == null || isNeedToClone) {
 
 587             if (edgeLabelEnum != EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS && edgeLabelEnum != EdgeLabelEnum.INSTANCE_ARTIFACTS) {
 
 588                 uniqueId = UniqueIdBuilder.buildPropertyUniqueId(componentId, artifactToUpdate.getArtifactLabel());
 
 590                 uniqueId = UniqueIdBuilder.buildInstanceArtifactUniqueId(componentId, instanceId, artifactToUpdate.getArtifactLabel());
 
 592             prevArtUid = artifactToUpdate.getUniqueId();
 
 593             artifactToUpdate.setUniqueId(uniqueId);
 
 594             if (!isDeletePlaceholder)
 
 595                 artifactToUpdate.setEsId(uniqueId);
 
 597             artifactToUpdate.setUniqueId(artifactId);
 
 599         Map<String, ArtifactDefinition> artifacts = new HashMap<>();
 
 600         Map<String, MapArtifactDataDefinition> artifactInst = null;
 
 601         if (edgeLabelEnum != EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS && edgeLabelEnum != EdgeLabelEnum.INSTANCE_ARTIFACTS) {
 
 603             Either<Map<String, ArtifactDataDefinition>, JanusGraphOperationStatus> artifactsEither = this.getDataFromGraph(componentId, edgeLabelEnum);
 
 605             if (artifactsEither.isLeft() && artifactsEither.left().value() != null && !artifactsEither.left().value().isEmpty()) {
 
 606                 artifacts = convertArtifactMapToArtifactDefinitionMap(artifactsEither.left().value());
 
 607                 if (isNeedToClone && artifacts != null) {
 
 608                     artifacts.values().stream().forEach(a -> a.setDuplicated(Boolean.TRUE));
 
 613             Either<Map<String, MapArtifactDataDefinition>, JanusGraphOperationStatus> artifactsEither = this.getDataFromGraph(componentId, edgeLabelEnum);
 
 614             if (artifactsEither.isLeft()) {
 
 615                 artifactInst = artifactsEither.left().value();
 
 616                 if (isNeedToClone && artifactInst != null) {
 
 617                     artifactInst.values().forEach(ma -> ma.getMapToscaDataDefinition().values().forEach(a -> a.setDuplicated(Boolean.TRUE)));
 
 619                 MapArtifactDataDefinition artifatcsOnInstance = artifactInst.get(instanceId);
 
 620                 if (artifatcsOnInstance != null) {
 
 621                     artifacts = convertArtifactMapToArtifactDefinitionMap(artifatcsOnInstance.getMapToscaDataDefinition());
 
 625         String oldChecksum = null;
 
 626         String oldVersion = null;
 
 627         if (artifacts != null && artifacts.containsKey(artifactInfo.getArtifactLabel())) {
 
 628             ArtifactDataDefinition oldArtifactData = artifacts.get(artifactInfo.getArtifactLabel());
 
 629             oldChecksum = oldArtifactData.getArtifactChecksum();
 
 630             oldVersion = oldArtifactData.getArtifactVersion();
 
 631             //duplicated flag didn't receive from UI, take from DB
 
 632             artifactToUpdate.setDuplicated(oldArtifactData.getDuplicated());
 
 635                 artifactToUpdate.setDuplicated(Boolean.FALSE);
 
 637                 if (artifactToUpdate.getDuplicated()) {
 
 638                     String uniqueId = "";
 
 639                     if(type != NodeTypeEnum.ResourceInstance)
 
 640                         uniqueId = UniqueIdBuilder.buildPropertyUniqueId(componentId, artifactToUpdate.getArtifactLabel());
 
 642                         uniqueId = UniqueIdBuilder.buildInstanceArtifactUniqueId(componentId, instanceId, artifactToUpdate.getArtifactLabel());
 
 644                     artifactToUpdate.setUniqueId(uniqueId);
 
 645                     if (!isDeletePlaceholder)
 
 646                         artifactToUpdate.setEsId(uniqueId);
 
 647                     artifactToUpdate.setDuplicated(Boolean.FALSE);
 
 652         updateUUID(artifacts, artifactToUpdate, oldChecksum, oldVersion, isUpdate, edgeLabelEnum, prevArtUid);
 
 654         if (artifactInfo.getPayloadData() == null) {
 
 655             if (!artifactToUpdate.getMandatory() || artifactToUpdate.getEsId() != null) {
 
 656                 artifactToUpdate.setEsId(artifactToUpdate.getUniqueId());
 
 659             if (artifactToUpdate.getEsId() == null) {
 
 660                 artifactToUpdate.setEsId(artifactToUpdate.getUniqueId());
 
 664         StorageOperationStatus status = StorageOperationStatus.OK;
 
 665         if (edgeLabelEnum != EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS && edgeLabelEnum != EdgeLabelEnum.INSTANCE_ARTIFACTS) {
 
 666             List<ArtifactDefinition> toscaDataList = new ArrayList<>();
 
 667             toscaDataList.add(artifactToUpdate);
 
 669             if (isNeedToClone && artifacts != null) {
 
 670                 artifacts.values().stream().filter(a -> !a.getArtifactLabel().equals(artifactToUpdate.getArtifactLabel())).forEach(toscaDataList::add);
 
 672                 if ( artifacts != null ) {
 
 673                     artifacts.values().stream().filter(a -> artifactToUpdate.getUniqueId().equals(a.getGeneratedFromId())).forEach(toscaDataList::add);
 
 676             status = updateToscaDataOfToscaElement(componentId, edgeLabelEnum, vertexTypeEnum, toscaDataList, JsonPresentationFields.ARTIFACT_LABEL);
 
 678             List<ArtifactDataDefinition> toscaDataList = new ArrayList<>();
 
 679             toscaDataList.add(artifactToUpdate);
 
 680             List<String> pathKeys = new ArrayList<>();
 
 681             pathKeys.add(instanceId);
 
 683                 if (artifactInst != null) {
 
 684                     MapArtifactDataDefinition artifatcsOnInstance = artifactInst.get(instanceId);
 
 685                     if (artifatcsOnInstance != null) {
 
 686                         Map<String, ArtifactDataDefinition> mapToscaDataDefinition = artifatcsOnInstance
 
 687                             .getMapToscaDataDefinition();
 
 688                         ArtifactDataDefinition artifactDataDefinitionToUpdate = new ArtifactDataDefinition(
 
 690                         mapToscaDataDefinition.put(artifactToUpdate.getArtifactLabel(), artifactDataDefinitionToUpdate);
 
 693                     for (Entry<String, MapArtifactDataDefinition> e : artifactInst.entrySet()) {
 
 694                         List<ArtifactDataDefinition> toscaDataListPerInst = e.getValue().getMapToscaDataDefinition()
 
 695                             .values().stream().collect(Collectors.toList());
 
 696                         List<String> pathKeysPerInst = new ArrayList<>();
 
 697                         pathKeysPerInst.add(e.getKey());
 
 698                         status = updateToscaDataDeepElementsOfToscaElement(componentId, edgeLabelEnum, vertexTypeEnum,
 
 699                             toscaDataListPerInst, pathKeysPerInst, JsonPresentationFields.ARTIFACT_LABEL);
 
 700                         if (status != StorageOperationStatus.OK) {
 
 702                                 "Failed to update atifacts group for instance {} in component {} edge type {} error {}",
 
 703                                 instanceId, componentId, edgeLabelEnum, status);
 
 704                             res = Either.right(status);
 
 710                 status = updateToscaDataDeepElementsOfToscaElement(componentId, edgeLabelEnum, vertexTypeEnum, toscaDataList, pathKeys, JsonPresentationFields.ARTIFACT_LABEL);
 
 713         if (status == StorageOperationStatus.OK)
 
 714             res = Either.left(artifactToUpdate);
 
 716             res = Either.right(status);
 
 720     public void generateUUID(ArtifactDataDefinition artifactData, String oldVesrion) {
 
 722         UUID uuid = UUID.randomUUID();
 
 723         artifactData.setArtifactUUID(uuid.toString());
 
 724         MDC.put(ILogConfiguration.MDC_SERVICE_INSTANCE_ID, uuid.toString());
 
 725         updateVersionAndDate(artifactData, oldVesrion);
 
 728     private void updateVersionAndDate(ArtifactDataDefinition artifactData, String oldVesrion) {
 
 729         if (artifactData.getArtifactChecksum() != null) {
 
 730             long time = System.currentTimeMillis();
 
 731             artifactData.setPayloadUpdateDate(time);
 
 733         int newVersion = new Integer(oldVesrion).intValue();
 
 735         artifactData.setArtifactVersion(String.valueOf(newVersion));
 
 738     public Either<ArtifactDataDefinition, StorageOperationStatus> removeArtifactOnGraph(ArtifactDefinition artifactFromGraph, String componentId, String instanceId, NodeTypeEnum type, boolean deleteMandatoryArtifact) {
 
 740         Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(artifactFromGraph.getArtifactGroupType(), type);
 
 741         EdgeLabelEnum edgeLabelEnum = triple.getLeft();
 
 742         VertexTypeEnum vertexTypeEnum = triple.getRight();
 
 744         if (deleteMandatoryArtifact || !(artifactFromGraph.getMandatory() || artifactFromGraph.getServiceApi())) {
 
 745             StorageOperationStatus status;
 
 746             if (triple.getMiddle()) {
 
 747                 List<String> pathKeys = new ArrayList<>();
 
 748                 pathKeys.add(instanceId);
 
 749                 status = deleteToscaDataDeepElement(componentId, edgeLabelEnum, vertexTypeEnum, artifactFromGraph.getArtifactLabel(), pathKeys, JsonPresentationFields.ARTIFACT_LABEL);
 
 751                 status = deleteToscaDataElement(componentId, edgeLabelEnum, vertexTypeEnum, artifactFromGraph.getArtifactLabel(), JsonPresentationFields.ARTIFACT_LABEL);
 
 753             if (status != StorageOperationStatus.OK)
 
 754                 return Either.right(status);
 
 756         return Either.left(artifactFromGraph);
 
 760     public Either<ArtifactDataDefinition, StorageOperationStatus> deleteArtifactWithCloningOnGraph(String componentId, ArtifactDefinition artifactToDelete, NodeTypeEnum type, String instanceId, boolean deleteMandatoryArtifact) {
 
 762         Either<ArtifactDataDefinition, StorageOperationStatus> result = null;
 
 763         Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(artifactToDelete.getArtifactGroupType(), type);
 
 764         EdgeLabelEnum edgeLabel = triple.getLeft();
 
 765         VertexTypeEnum vertexLabel = triple.getRight();
 
 767         Boolean deleteElement = deleteMandatoryArtifact || !(artifactToDelete.getMandatory() || artifactToDelete.getServiceApi());
 
 768         Map<String, ToscaDataDefinition> artifacts = null;
 
 769         GraphVertex parentVertex = null;
 
 770         Either<Map<String, ToscaDataDefinition>, JanusGraphOperationStatus> getArtifactsRes = null;
 
 772         Either<GraphVertex, JanusGraphOperationStatus> getToscaElementRes = janusGraphDao
 
 773             .getVertexById(componentId, JsonParseFlagEnum.NoParse);
 
 774         if (getToscaElementRes.isRight()) {
 
 775             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to get tosca element {} upon getting tosca data from graph. Status is {}. ", componentId, getToscaElementRes.right().value());
 
 776             result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(getToscaElementRes.right().value()));
 
 778         if (result == null) {
 
 779             parentVertex = getToscaElementRes.left().value();
 
 780             getArtifactsRes = this.getDataFromGraph(parentVertex, edgeLabel);
 
 781             if (getArtifactsRes.isRight()) {
 
 782                 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(getArtifactsRes.right().value()));
 
 785         if (result == null) {
 
 786             artifacts = getArtifactsRes.left().value();
 
 787             if (triple.getMiddle()) {
 
 788                 artifacts.values().forEach(ma -> ((MapArtifactDataDefinition) ma).getMapToscaDataDefinition().values().forEach(a -> a.setDuplicated(Boolean.TRUE)));
 
 789                 MapArtifactDataDefinition artifatcsOnInstance = (MapArtifactDataDefinition) artifacts.get(instanceId);
 
 790                 if (artifatcsOnInstance != null && deleteElement) {
 
 791                     artifatcsOnInstance.getMapToscaDataDefinition().remove(artifactToDelete.getArtifactLabel());
 
 795                     artifacts.remove(artifactToDelete.getArtifactLabel());
 
 797                 artifacts.values().stream().forEach(a -> ((ArtifactDataDefinition) a).setDuplicated(Boolean.TRUE));
 
 799             artifactToDelete.setDuplicated(Boolean.TRUE);
 
 801         if (artifacts != null) {
 
 802             JanusGraphOperationStatus
 
 803                 status = janusGraphDao.deleteEdgeByDirection(parentVertex, Direction.OUT, edgeLabel);
 
 804             if (status != JanusGraphOperationStatus.OK) {
 
 805                 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
 
 806             } else if (MapUtils.isNotEmpty(artifacts)) {
 
 807                 Either<GraphVertex, StorageOperationStatus> associateResult = associateElementToData(parentVertex, vertexLabel, edgeLabel, artifacts);
 
 808                 if (associateResult.isRight()) {
 
 809                     result = Either.right(associateResult.right().value());
 
 813         if (result == null) {
 
 814             result = Either.left(artifactToDelete);
 
 819     public String sortAndCalculateChecksumForHeatParameters(List<HeatParameterDataDefinition> heatParameters) {
 
 820         StrBuilder sb = new StrBuilder();
 
 821         heatParameters.stream()
 
 822                 .sorted(Comparator.comparingInt(HeatParameterDataDefinition::hashCode))
 
 823                 .map(HeatParameterDataDefinition::hashCode)
 
 824                 .collect(Collectors.toSet())
 
 825                 .forEach(sb::append);
 
 826         return GeneralUtility.calculateMD5Base64EncodedByString(sb.toString());