07c2f8d51c365b2fd45fd0859bafa85b2819ad26
[sdc.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
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
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
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=========================================================
19  */
20
21 package org.openecomp.sdc.be.model.jsontitan.operations;
22
23 import java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.List;
26 import java.util.Map;
27 import java.util.Map.Entry;
28 import java.util.Optional;
29 import java.util.UUID;
30 import java.util.stream.Collectors;
31
32 import org.apache.commons.collections.MapUtils;
33 import org.apache.commons.lang3.tuple.ImmutableTriple;
34 import org.apache.commons.lang3.tuple.Triple;
35 import org.apache.tinkerpop.gremlin.structure.Direction;
36 import org.openecomp.sdc.be.config.BeEcompErrorManager;
37 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
38 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
39 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
40 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
41 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
42 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
43 import org.openecomp.sdc.be.datatypes.elements.MapArtifactDataDefinition;
44 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
45 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
46 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
47 import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
48 import org.openecomp.sdc.be.model.ArtifactDefinition;
49 import org.openecomp.sdc.be.model.HeatParameterDefinition;
50 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
51 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
52 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
53 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
54 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
55 import org.openecomp.sdc.common.jsongraph.util.CommonUtility;
56 import org.openecomp.sdc.common.jsongraph.util.CommonUtility.LogLevelEnum;
57 import org.slf4j.Logger;
58 import org.slf4j.LoggerFactory;
59 import org.slf4j.MDC;
60
61 import fj.data.Either;
62
63 @org.springframework.stereotype.Component("artifacts-operations")
64
65 public class ArtifactsOperations extends BaseOperation {
66         private static Logger log = LoggerFactory.getLogger(ArtifactsOperations.class.getName());
67
68         public Either<ArtifactDefinition, StorageOperationStatus> addArifactToComponent(ArtifactDefinition artifactInfo, String parentId, NodeTypeEnum type, boolean failIfExist, String instanceId) {
69
70                 Either<ArtifactDataDefinition, StorageOperationStatus> status = updateArtifactOnGraph(parentId, artifactInfo, type, artifactInfo.getUniqueId(), instanceId, false);
71                 if (status.isRight()) {
72
73                         log.debug("Failed to update artifact {} of {} {}. status is {}", artifactInfo.getArtifactName(), type.getName(), parentId, status.right().value());
74                         BeEcompErrorManager.getInstance().logBeFailedUpdateNodeError("Update Artifact", artifactInfo.getArtifactName(), String.valueOf(status.right().value()));
75                         return Either.right(status.right().value());
76                 } else {
77
78                         ArtifactDataDefinition artifactData = status.left().value();
79
80                         ArtifactDefinition artifactDefResult = convertArtifactDataToArtifactDefinition(artifactInfo, artifactData);
81                         log.debug("The returned ArtifactDefintion is {}", artifactDefResult);
82                         return Either.left(artifactDefResult);
83                 }
84
85         }
86
87         public Either<ArtifactDefinition, StorageOperationStatus> updateArifactOnResource(ArtifactDefinition artifactInfo, String id, String artifactId, NodeTypeEnum type, String instanceId) {
88
89                 Either<ArtifactDataDefinition, StorageOperationStatus> status = updateArtifactOnGraph(id, artifactInfo, type, artifactId, instanceId, true);
90                 if (status.isRight()) {
91
92                         log.debug("Failed to update artifact {} of {} {}. status is {}", artifactInfo.getArtifactName(), type.getName(), id, status.right().value());
93                         BeEcompErrorManager.getInstance().logBeFailedUpdateNodeError("Update Artifact", artifactInfo.getArtifactName(), String.valueOf(status.right().value()));
94                         return Either.right(status.right().value());
95                 } else {
96
97                         ArtifactDataDefinition artifactData = status.left().value();
98
99                         ArtifactDefinition artifactDefResult = convertArtifactDataToArtifactDefinition(artifactInfo, artifactData);
100                         log.debug("The returned ArtifactDefintion is {}", artifactDefResult);
101                         return Either.left(artifactDefResult);
102                 }
103         }
104
105         public Either<Boolean, StorageOperationStatus> isCloneNeeded(String parentId, ArtifactDefinition artifactInfo, NodeTypeEnum type) {
106                 ArtifactGroupTypeEnum groupType = artifactInfo.getArtifactGroupType();
107
108                 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(groupType, type);
109                 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
110                 return super.isCloneNeeded(parentId, edgeLabelEnum);
111         }
112
113         public Either<ArtifactDefinition, StorageOperationStatus> getArtifactById(String parentId, String id) {
114                 return getArtifactById(parentId, id, null, null);
115         }
116
117         public Either<ArtifactDefinition, StorageOperationStatus> getArtifactById(String parentId, String id, ComponentTypeEnum componentType, String containerId) {
118                 Either<ArtifactDefinition, StorageOperationStatus> result = null;
119                 ArtifactDataDefinition foundArtifact = null;
120                 if (componentType != null && componentType == ComponentTypeEnum.RESOURCE_INSTANCE) {
121                         foundArtifact = getInstanceArtifactByLabelAndId(parentId, id, containerId, EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS);
122                         if (foundArtifact == null) {
123                                 foundArtifact = getInstanceArtifactByLabelAndId(parentId, id, containerId, EdgeLabelEnum.INSTANCE_ARTIFACTS);
124                         }
125                 }
126                 if (foundArtifact == null) {
127                         foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.DEPLOYMENT_ARTIFACTS);
128                 }
129                 if (foundArtifact == null) {
130                         foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.TOSCA_ARTIFACTS);
131                 }
132
133                 if (foundArtifact == null) {
134                         foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.ARTIFACTS);
135                 }
136
137                 if (foundArtifact == null) {
138                         foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.SERVICE_API_ARTIFACTS);
139                 }
140
141                 if (foundArtifact == null) {
142                         result = Either.right(StorageOperationStatus.NOT_FOUND);
143                         return result;
144                 }
145
146                 ArtifactDefinition artifactDefResult = convertArtifactDataToArtifactDefinition(null, foundArtifact);
147                 return Either.left(artifactDefResult);
148
149         }
150
151         public Either<ArtifactDefinition, StorageOperationStatus> removeArifactFromResource(String id, String artifactId, NodeTypeEnum type, boolean deleteMandatoryArtifact) {
152                 Either<ArtifactDefinition, StorageOperationStatus> status = removeArtifactOnGraph(id, artifactId, type, deleteMandatoryArtifact);
153
154                 if (status.isRight()) {
155
156                         log.debug("Failed to delete artifact {} of resource {}", artifactId, id);
157
158                         BeEcompErrorManager.getInstance().logBeFailedDeleteNodeError("Delete Artifact", artifactId, String.valueOf(status.right().value()));
159                         return Either.right(status.right().value());
160                 } else {
161
162                         return Either.left(status.left().value());
163                 }
164         }
165
166         public Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getArtifacts(String parentId, NodeTypeEnum parentType, ArtifactGroupTypeEnum groupType, String instanceId) {
167
168                 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(groupType, parentType);
169                 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
170
171                 Either<Map<String, ArtifactDefinition>, TitanOperationStatus> foundArtifact = null;
172                 Map<String, ArtifactDefinition> resMap = new HashMap<>();
173                 foundArtifact = getArtifactByLabel(parentId, instanceId, edgeLabelEnum);
174                 if (foundArtifact.isRight()) {
175                         log.debug("Failed to find artifact in component {} with label {} ", parentId, edgeLabelEnum);
176                         return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(foundArtifact.right().value()));
177                 }
178
179                 resMap.putAll(foundArtifact.left().value());
180
181                 return Either.left(resMap);
182         }
183
184         /**
185          *
186          * @param parentId the id of the instance container
187          * @param instanceId the id of the instance of which to return its artifacts
188          * @return instance and instance deployment artifacts mapped by artifact label name
189          */
190         public Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getAllInstanceArtifacts(String parentId, String instanceId) {
191                 Map<String, ArtifactDataDefinition> resMap = new HashMap<>();
192                 Either<Map<String, ArtifactDataDefinition>, TitanOperationStatus> instArtifacts = getInstanceArtifactsByLabel(parentId, instanceId, EdgeLabelEnum.INSTANCE_ARTIFACTS);
193                 if (instArtifacts.isRight()) {
194                         return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(instArtifacts.right().value()));
195                 }
196                 Either<Map<String, ArtifactDataDefinition>, TitanOperationStatus> deployInstArtifacts = getInstanceArtifactsByLabel(parentId, instanceId, EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS);
197                 if (deployInstArtifacts.isRight()) {
198                         return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(deployInstArtifacts.right().value()));
199                 }
200                 resMap.putAll(instArtifacts.left().value());
201                 resMap.putAll(deployInstArtifacts.left().value());
202                 return Either.left(convertArtifactMapToArtifactDefinitionMap(resMap));
203         }
204
205         public Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getArtifacts(String parentId) {
206
207                 Either<Map<String, ArtifactDefinition>, TitanOperationStatus> foundArtifact = null;
208                 Map<String, ArtifactDefinition> resMap = new HashMap<>();
209                 foundArtifact = getArtifactByLabel(parentId, null, EdgeLabelEnum.ARTIFACTS);
210                 if (foundArtifact.isLeft()) {
211                         resMap.putAll(foundArtifact.left().value());
212
213                 }
214                 foundArtifact = getArtifactByLabel(parentId, null, EdgeLabelEnum.DEPLOYMENT_ARTIFACTS);
215                 if (foundArtifact.isLeft()) {
216                         resMap.putAll(foundArtifact.left().value());
217
218                 }
219                 foundArtifact = getArtifactByLabel(parentId, null, EdgeLabelEnum.TOSCA_ARTIFACTS);
220                 if (foundArtifact.isLeft()) {
221                         resMap.putAll(foundArtifact.left().value());
222
223                 }
224
225                 return Either.left(resMap);
226
227         }
228
229         public Either<ArtifactDefinition, StorageOperationStatus> removeArtifactOnGraph(String id, String artifactId, NodeTypeEnum type, boolean deleteMandatoryArtifact) {
230
231                 Either<ArtifactDefinition, StorageOperationStatus> artifactData = this.getArtifactById(id, artifactId);
232                 if (artifactData.isRight()) {
233                         log.debug("Failed to find artifact in component {} with id {} ", id, artifactId);
234                         return Either.right(artifactData.right().value());
235                 }
236                 ArtifactDataDefinition artifactDefinition = artifactData.left().value();
237                 boolean isMandatory = false;
238                 if ((artifactDefinition.getMandatory() || artifactDefinition.getServiceApi()) && !deleteMandatoryArtifact) {
239                         // return Either.left(artifactData.left().value());
240                         isMandatory = true;
241                 }
242
243                 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(artifactDefinition.getArtifactGroupType(), type);
244                 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
245                 VertexTypeEnum vertexTypeEnum = triple.getRight();
246
247                 if (!isMandatory) {
248                         StorageOperationStatus status = deleteToscaDataElement(id, edgeLabelEnum, vertexTypeEnum, artifactDefinition.getArtifactLabel(), JsonPresentationFields.ARTIFACT_LABEL);
249                         if (status != StorageOperationStatus.OK)
250                                 return Either.right(status);
251                 }
252
253                 return Either.left(artifactData.left().value());
254
255         }
256
257         public void updateUUID(ArtifactDataDefinition artifactData, String oldChecksum, String oldVesrion, boolean isUpdate, EdgeLabelEnum edgeLabel) {
258                 if (oldVesrion == null || oldVesrion.isEmpty())
259                         oldVesrion = "0";
260
261                 String currentChecksum = artifactData.getArtifactChecksum();
262
263                 if (isUpdate) {
264                         ArtifactTypeEnum type = ArtifactTypeEnum.findType(artifactData.getArtifactType());
265                         switch (type) {
266                         case HEAT_ENV:
267                                 if (edgeLabel == EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS) {
268                                         generateUUID(artifactData, oldVesrion);
269                                 } else {
270                                         updateVersionAndDate(artifactData, oldVesrion);
271                                 }
272                                 long time = System.currentTimeMillis();
273                                 artifactData.setHeatParamsUpdateDate(time);
274                                 break;
275                         case HEAT:
276                         case HEAT_NET:
277                         case HEAT_VOL:
278                                 generateUUID(artifactData, oldVesrion);
279                                 break;
280                         default:
281                                 if (oldChecksum == null || oldChecksum.isEmpty()) {
282                                         if (currentChecksum != null) {
283                                                 generateUUID(artifactData, oldVesrion);
284                                         }
285                                 } else if ((currentChecksum != null && !currentChecksum.isEmpty()) && !oldChecksum.equals(currentChecksum)) {
286                                         generateUUID(artifactData, oldVesrion);
287                                 }
288                                 break;
289                         }
290                 } else {
291                         if (oldChecksum == null || oldChecksum.isEmpty()) {
292                                 if (currentChecksum != null) {
293                                         generateUUID(artifactData, oldVesrion);
294                                 }
295                         } else if ((currentChecksum != null && !currentChecksum.isEmpty()) && !oldChecksum.equals(currentChecksum)) {
296                                 generateUUID(artifactData, oldVesrion);
297                         }
298                 }
299         }
300
301         // @TODO add implementation
302
303         public Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getArtifacts(String parentId, NodeTypeEnum parentType) {
304                 return null;
305         }
306
307         public Either<ArtifactDefinition, StorageOperationStatus> addHeatEnvArtifact(ArtifactDefinition artifactHeatEnv, ArtifactDefinition artifactHeat, String componentId, NodeTypeEnum parentType, boolean failIfExist, String instanceId) {
308                 artifactHeatEnv.setGeneratedFromId(artifactHeat.getUniqueId());
309                 return addArifactToComponent(artifactHeatEnv, componentId, parentType, failIfExist, instanceId);
310         }
311
312         public Either<ArtifactDefinition, StorageOperationStatus> getHeatArtifactByHeatEnvId(String parentId, ArtifactDefinition heatEnv, NodeTypeEnum parentType, String containerId, ComponentTypeEnum componentType) {
313                 String id = heatEnv.getGeneratedFromId();
314                 ComponentTypeEnum compType;
315                 switch (parentType) {
316                 case ResourceInstance:
317                         compType = ComponentTypeEnum.RESOURCE_INSTANCE;
318                         break;
319                 default:
320                         compType = componentType;
321                 }
322                 return getArtifactById(parentId, id, compType, containerId);
323         }
324
325         public Either<ArtifactDefinition, StorageOperationStatus> updateHeatEnvArtifact(String id, ArtifactDefinition artifactEnvInfo, String artifactId, String newArtifactId, NodeTypeEnum type, String instanceId) {
326
327                 Either<Map<String, ArtifactDefinition>, TitanOperationStatus> artifactsEither = getArtifactByLabel(id, instanceId, EdgeLabelEnum.DEPLOYMENT_ARTIFACTS);
328                 if (artifactsEither.isRight()) {
329                         log.debug("Failed to find artifacts in component {} with id {} ", id, artifactsEither.right().value());
330                         return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(artifactsEither.right().value()));
331                 }
332
333                 Map<String, ArtifactDefinition> artifacts = artifactsEither.left().value();
334                 List<ArtifactDefinition> envList = artifacts.values().stream().filter(a -> a.getGeneratedFromId() != null && a.getGeneratedFromId().equals(artifactId)).collect(Collectors.toList());
335                 if (envList != null && !envList.isEmpty()) {
336                         envList.forEach(a -> {
337                                 a.setGeneratedFromId(newArtifactId);
338                                 updateArifactOnResource(a, id, a.getUniqueId(), type, instanceId);
339
340                         });
341
342                 }
343                 return Either.left(artifactEnvInfo);
344         }
345
346         public Either<ArtifactDefinition, StorageOperationStatus> updateHeatEnvPlaceholder(ArtifactDefinition artifactInfo, String parentId, NodeTypeEnum type) {
347                 return updateArifactOnResource(artifactInfo, parentId, artifactInfo.getUniqueId(), type, null);
348         }
349
350         // public Either<List<HeatParameterDefinition>, StorageOperationStatus> getHeatParamsForEnv(ArtifactDefinition heatEnvArtifact, String parentId) {
351         // return null;
352         // }
353
354         ///////////////////////////////////////////// private methods ////////////////////////////////////////////////////
355
356         protected ArtifactDefinition convertArtifactDataToArtifactDefinition(ArtifactDefinition artifactInfo, ArtifactDataDefinition artifactDefResult) {
357                 log.debug("The object returned after create property is {}", artifactDefResult);
358
359                 ArtifactDefinition propertyDefResult = new ArtifactDefinition(artifactDefResult);
360                 if (artifactInfo != null)
361                         propertyDefResult.setPayload(artifactInfo.getPayloadData());
362
363                 List<HeatParameterDefinition> parameters = new ArrayList<HeatParameterDefinition>();
364                 /*
365                  * StorageOperationStatus heatParametersOfNode = heatParametersOperation.getHeatParametersOfNode(NodeTypeEnum.ArtifactRef, artifactDefResult.getUniqueId().toString(), parameters); if ((heatParametersOfNode.equals(StorageOperationStatus.OK))
366                  * && !parameters.isEmpty()) { propertyDefResult.setHeatParameters(parameters); }
367                  */
368                 return propertyDefResult;
369         }
370
371         private ArtifactDataDefinition getInstanceArtifactByLabelAndId(String parentId, String id, String containerId, EdgeLabelEnum edgeLabelEnum) {
372                 ArtifactDataDefinition foundArtifact = null;
373                 Either<Map<String, MapArtifactDataDefinition>, TitanOperationStatus> artifactsEither = getDataFromGraph(containerId, edgeLabelEnum);
374                 if (artifactsEither.isRight()) {
375                         log.debug("failed to fetch {} for tosca element with id {}, error {}", edgeLabelEnum, containerId, artifactsEither.right().value());
376                         return null;
377                 }
378
379                 Map<String, MapArtifactDataDefinition> artifacts = artifactsEither.left().value();
380
381                 MapArtifactDataDefinition artifactsPerInstance = artifacts.get(parentId);
382                 if (artifactsPerInstance == null) {
383                         log.debug("failed to fetch artifacts for instance {} in tosca element with id {}, error {}", parentId, containerId, artifactsEither.right().value());
384                         return null;
385                 }
386                 Optional<ArtifactDataDefinition> op = artifactsPerInstance.getMapToscaDataDefinition().values().stream().filter(p -> p.getUniqueId().equals(id)).findAny();
387                 if (op.isPresent()) {
388                         foundArtifact = op.get();
389                 }
390                 return foundArtifact;
391         }
392
393         private ArtifactDataDefinition getArtifactByLabelAndId(String parentId, String id, EdgeLabelEnum edgeLabelEnum) {
394                 ArtifactDataDefinition foundArtifact = null;
395                 Either<Map<String, ArtifactDataDefinition>, TitanOperationStatus> artifactsEither = getDataFromGraph(parentId, edgeLabelEnum);
396                 if (artifactsEither.isRight()) {
397                         log.debug("failed to fetch {} for tosca element with id {}, error {}", edgeLabelEnum, parentId, artifactsEither.right().value());
398                         return null;
399                 }
400
401                 Map<String, ArtifactDataDefinition> artifacts = artifactsEither.left().value();
402                 Optional<ArtifactDataDefinition> op = artifacts.values().stream().filter(p -> p.getUniqueId().equals(id)).findAny();
403                 if (op.isPresent()) {
404                         foundArtifact = op.get();
405                 }
406                 return foundArtifact;
407         }
408
409         private Either<Map<String, ArtifactDefinition>, TitanOperationStatus> getArtifactByLabel(String parentId, String instanceId, EdgeLabelEnum edgeLabelEnum) {
410                 Either<Map<String, ArtifactDataDefinition>, TitanOperationStatus> artifactsEither = getArtifactsDataByLabel(parentId, instanceId, edgeLabelEnum);
411                 if (artifactsEither.isRight()) {
412                         log.debug("failed to fetch {} for tosca element with id {}, error {}", edgeLabelEnum, parentId, artifactsEither.right().value());
413                         return Either.right(artifactsEither.right().value());
414                 }
415                 Map<String, ArtifactDataDefinition> artifactDataMap = artifactsEither.left().value();
416                 return Either.left(convertArtifactMapToArtifactDefinitionMap(artifactDataMap));
417         }
418
419         private Either<Map<String, ArtifactDataDefinition>, TitanOperationStatus> getArtifactsDataByLabel(String parentId, String instanceId, EdgeLabelEnum edgeLabelEnum) {
420                 return edgeLabelEnum.isInstanceArtifactsLabel() ? getInstanceArtifactsByLabel(parentId, instanceId, edgeLabelEnum) : getDataFromGraph(parentId, edgeLabelEnum);
421         }
422
423         private Map<String, ArtifactDefinition> convertArtifactMapToArtifactDefinitionMap(Map<String, ArtifactDataDefinition> artifactDataMap) {
424                 Map<String, ArtifactDefinition> artMap = new HashMap<>();
425                 if (artifactDataMap != null && !artifactDataMap.isEmpty()) {
426                         artMap = artifactDataMap.entrySet().stream().collect(Collectors.toMap(Entry::getKey, e -> convertArtifactDataToArtifactDefinition(null, e.getValue())));
427                 }
428                 return artMap;
429         }
430
431         private Either<Map<String, ArtifactDataDefinition>, TitanOperationStatus>  getInstanceArtifactsByLabel(String parentId, String instanceId, EdgeLabelEnum edgeLabelEnum) {
432                 Either<Map<String, MapArtifactDataDefinition>, TitanOperationStatus> resultEither = getDataFromGraph(parentId, edgeLabelEnum);
433                 if (resultEither.isRight()) {
434                         log.debug("failed to fetch {} for tosca element with id {}, error {}", edgeLabelEnum, parentId, resultEither.right().value());
435                         return Either.right(resultEither.right().value());
436                 }
437                 Map<String, MapArtifactDataDefinition> mapArtifacts = resultEither.left().value();
438                 MapArtifactDataDefinition artifactPerInstance = mapArtifacts.get(instanceId);
439                 return artifactPerInstance != null ? Either.left(artifactPerInstance.getMapToscaDataDefinition()) : Either.left(new HashMap<>());
440         }
441
442         private Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> getEdgeLabelEnumFromArtifactGroupType(ArtifactGroupTypeEnum groupType, NodeTypeEnum nodeType) {
443                 EdgeLabelEnum edgeLabelEnum;
444                 VertexTypeEnum vertexTypeEnum;
445                 Boolean isDeepElement = false;
446                 /*
447                  * if (nodeType == NodeTypeEnum.ResourceInstance) { edgeLabelEnum = EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS; vertexTypeEnum = VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS; isDeepElement = true; } else {
448                  */
449                 switch (groupType) {
450                 case TOSCA:
451                         edgeLabelEnum = EdgeLabelEnum.TOSCA_ARTIFACTS;
452                         vertexTypeEnum = VertexTypeEnum.TOSCA_ARTIFACTS;
453                         break;
454                 case DEPLOYMENT:
455                         if (nodeType == NodeTypeEnum.ResourceInstance) {
456                                 edgeLabelEnum = EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS;
457                                 vertexTypeEnum = VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS;
458                                 isDeepElement = true;
459                         } else {
460                                 edgeLabelEnum = EdgeLabelEnum.DEPLOYMENT_ARTIFACTS;
461                                 vertexTypeEnum = VertexTypeEnum.DEPLOYMENT_ARTIFACTS;
462                         }
463                         break;
464                 case SERVICE_API:
465                         edgeLabelEnum = EdgeLabelEnum.SERVICE_API_ARTIFACTS;
466                         vertexTypeEnum = VertexTypeEnum.SERVICE_API_ARTIFACTS;
467                         break;
468                 default:
469                         if (nodeType == NodeTypeEnum.ResourceInstance) {
470                                 edgeLabelEnum = EdgeLabelEnum.INSTANCE_ARTIFACTS;
471                                 vertexTypeEnum = VertexTypeEnum.INSTANCE_ARTIFACTS;
472                                 isDeepElement = true;
473                         } else {
474                                 edgeLabelEnum = EdgeLabelEnum.ARTIFACTS;
475                                 vertexTypeEnum = VertexTypeEnum.ARTIFACTS;
476                         }
477                         break;
478                 }
479                 // }
480                 return new ImmutableTriple<EdgeLabelEnum, Boolean, VertexTypeEnum>(edgeLabelEnum, isDeepElement, vertexTypeEnum);
481
482         }
483
484         public Either<ArtifactDataDefinition, StorageOperationStatus> updateArtifactOnGraph(String componentId, ArtifactDefinition artifactInfo, NodeTypeEnum type, String artifactId, String instanceId, boolean isUpdate) {
485                 Either<ArtifactDataDefinition, StorageOperationStatus> res = null;
486                 ArtifactDataDefinition artifactToUpdate = new ArtifactDataDefinition(artifactInfo);
487                 ArtifactGroupTypeEnum groupType = artifactInfo.getArtifactGroupType();
488
489                 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(groupType, type);
490                 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
491                 VertexTypeEnum vertexTypeEnum = triple.getRight();
492
493                 Either<Boolean, StorageOperationStatus> isNeedToCloneEither = isCloneNeeded(componentId, edgeLabelEnum);
494                 if (isNeedToCloneEither.isRight()) {
495                         log.debug("Failed check is clone needed {}", componentId);
496                         return Either.right(isNeedToCloneEither.right().value());
497
498                 }
499                 boolean isNeedToClone = isNeedToCloneEither.left().value();
500
501                 if (artifactId == null || isNeedToClone) {
502                         String uniqueId;
503                         if (edgeLabelEnum != EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS && edgeLabelEnum != EdgeLabelEnum.INSTANCE_ARTIFACTS) {
504                                 uniqueId = UniqueIdBuilder.buildPropertyUniqueId(componentId, artifactToUpdate.getArtifactLabel());
505                         } else {
506                                 uniqueId = UniqueIdBuilder.buildPropertyUniqueId(instanceId, artifactToUpdate.getArtifactLabel());
507                         }
508                         artifactToUpdate.setUniqueId(uniqueId);
509                         artifactToUpdate.setEsId(uniqueId);
510                 } else
511                         artifactToUpdate.setUniqueId(artifactId);
512
513                 Map<String, ArtifactDataDefinition> artifacts = new HashMap<>();
514                 Map<String, MapArtifactDataDefinition> artifactInst = null;
515                 if (edgeLabelEnum != EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS && edgeLabelEnum != EdgeLabelEnum.INSTANCE_ARTIFACTS) {
516
517                         Either<Map<String, ArtifactDataDefinition>, TitanOperationStatus> artifactsEither = this.getDataFromGraph(componentId, edgeLabelEnum);
518
519                         if (artifactsEither.isLeft() && artifactsEither.left().value() != null && !artifactsEither.left().value().isEmpty()) {
520                                 artifacts = artifactsEither.left().value();
521                                 if (isNeedToClone && artifacts != null) {
522                                         artifacts.values().stream().forEach(a -> a.setDuplicated(Boolean.TRUE));
523                                 }
524                         }
525                 } else {
526
527                         Either<Map<String, MapArtifactDataDefinition>, TitanOperationStatus> artifactsEither = this.getDataFromGraph(componentId, edgeLabelEnum);
528                         if (artifactsEither.isLeft()) {
529                                 artifactInst = artifactsEither.left().value();
530                                 if (isNeedToClone && artifactInst != null) {
531                                         artifactInst.values().forEach(ma -> ma.getMapToscaDataDefinition().values().forEach(a -> a.setDuplicated(Boolean.TRUE)));
532                                 }
533                                 MapArtifactDataDefinition artifatcsOnInstance = artifactInst.get(instanceId);
534                                 if (artifatcsOnInstance != null) {
535                                         artifacts = artifatcsOnInstance.getMapToscaDataDefinition();
536                                 }
537                         }
538                 }
539                 String oldChecksum = null;
540                 String oldVersion = null;
541                 if (artifacts != null && artifacts.containsKey(artifactInfo.getArtifactLabel())) {
542                         ArtifactDataDefinition oldArtifactData = artifacts.get(artifactInfo.getArtifactLabel());
543                         oldChecksum = oldArtifactData.getArtifactChecksum();
544                         oldVersion = oldArtifactData.getArtifactVersion();
545                         //duplicated flag didn't receive from UI, take from DB 
546                         artifactToUpdate.setDuplicated(oldArtifactData.getDuplicated());
547                         
548                         if (isNeedToClone)
549                                 artifactToUpdate.setDuplicated(Boolean.FALSE);
550                         else {
551                                 if (artifactToUpdate.getDuplicated()) {
552                                         String id = type != NodeTypeEnum.ResourceInstance ? componentId : instanceId;
553                                         String uniqueId = UniqueIdBuilder.buildPropertyUniqueId(id, artifactToUpdate.getArtifactLabel());
554                                         artifactToUpdate.setUniqueId(uniqueId);
555                                         artifactToUpdate.setEsId(uniqueId);
556                                         artifactToUpdate.setDuplicated(Boolean.FALSE);
557                                 }
558                         }
559                 }
560                 updateUUID(artifactToUpdate, oldChecksum, oldVersion, isUpdate, edgeLabelEnum);
561
562                 if (artifactInfo.getPayloadData() == null) {
563                         if (!artifactToUpdate.getMandatory() || artifactToUpdate.getEsId() != null) {
564                                 artifactToUpdate.setEsId(artifactToUpdate.getUniqueId());
565                         }
566                 } else {
567                         if (artifactToUpdate.getEsId() == null) {
568                                 artifactToUpdate.setEsId(artifactToUpdate.getUniqueId());
569                         }
570                 }
571
572                 StorageOperationStatus status = StorageOperationStatus.OK;
573                 if (edgeLabelEnum != EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS && edgeLabelEnum != EdgeLabelEnum.INSTANCE_ARTIFACTS) {
574                         List<ArtifactDataDefinition> toscaDataList = new ArrayList<>();
575                         toscaDataList.add(artifactToUpdate);
576
577                         if (isNeedToClone && artifacts != null) {
578                                 artifacts.values().stream().filter(a -> !a.getArtifactLabel().equals(artifactToUpdate.getArtifactLabel())).forEach(a -> toscaDataList.add(a));
579                         }
580                         status = updateToscaDataOfToscaElement(componentId, edgeLabelEnum, vertexTypeEnum, toscaDataList, JsonPresentationFields.ARTIFACT_LABEL);
581                 } else {
582                         List<ArtifactDataDefinition> toscaDataList = new ArrayList<>();
583                         toscaDataList.add(artifactToUpdate);
584                         List<String> pathKeys = new ArrayList<>();
585                         pathKeys.add(instanceId);
586                         if (isNeedToClone) {
587                                 MapArtifactDataDefinition artifatcsOnInstance = artifactInst.get(instanceId);
588                                 if (artifatcsOnInstance != null) {
589                                         artifacts = artifatcsOnInstance.getMapToscaDataDefinition();
590                                         artifacts.put(artifactToUpdate.getArtifactLabel(), artifactToUpdate);
591                                 }
592
593                                 for ( Entry<String, MapArtifactDataDefinition> e : artifactInst.entrySet() ) {
594                                         List<ArtifactDataDefinition> toscaDataListPerInst = e.getValue().getMapToscaDataDefinition().values().stream().collect(Collectors.toList());
595                                         List<String> pathKeysPerInst = new ArrayList<>();
596                                         pathKeysPerInst.add(e.getKey());
597                                         status = updateToscaDataDeepElementsOfToscaElement(componentId, edgeLabelEnum, vertexTypeEnum, toscaDataListPerInst, pathKeysPerInst, JsonPresentationFields.ARTIFACT_LABEL);
598                                         if ( status != StorageOperationStatus.OK) {
599                                                 log.debug("Failed to update atifacts group for instance {} in component {} edge type {} error {}", instanceId, componentId, edgeLabelEnum, status);
600                                                 res = Either.right(status);
601                                                 break;
602                                         }
603                                 }
604                         } else {
605                                 status = updateToscaDataDeepElementsOfToscaElement(componentId, edgeLabelEnum, vertexTypeEnum, toscaDataList, pathKeys, JsonPresentationFields.ARTIFACT_LABEL);
606                         }
607                 }
608                 if (status == StorageOperationStatus.OK)
609                         res = Either.left(artifactToUpdate);
610                 else
611                         res = Either.right(status);
612                 return res;
613         }
614
615         public void generateUUID(ArtifactDataDefinition artifactData, String oldVesrion) {
616
617                 UUID uuid = UUID.randomUUID();
618                 artifactData.setArtifactUUID(uuid.toString());
619                 MDC.put("serviceInstanceID", uuid.toString());
620                 updateVersionAndDate(artifactData, oldVesrion);
621         }
622
623         private void updateVersionAndDate(ArtifactDataDefinition artifactData, String oldVesrion) {
624                 if (artifactData.getArtifactChecksum() != null) {
625                         long time = System.currentTimeMillis();
626                         artifactData.setPayloadUpdateDate(time);
627                 }
628                 int newVersion = new Integer(oldVesrion).intValue();
629                 newVersion++;
630                 artifactData.setArtifactVersion(String.valueOf(newVersion));
631         }
632
633         private boolean validateParentType(NodeTypeEnum type) {
634                 boolean isValid = false;
635                 switch (type) {
636                 case Resource:
637                 case InterfaceOperation:
638                 case Service:
639                 case ResourceInstance:
640                         isValid = true;
641                         break;
642                 default:
643                         log.debug("Not supported node type for artifact relation : {} ", type);
644                 }
645                 return isValid;
646         }
647
648         public Either<ArtifactDataDefinition, StorageOperationStatus> removeArtifactOnGraph(ArtifactDefinition artifactFromGraph, String componentId, String instanceId, NodeTypeEnum type, boolean deleteMandatoryArtifact) {
649
650                 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(artifactFromGraph.getArtifactGroupType(), type);
651                 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
652                 VertexTypeEnum vertexTypeEnum = triple.getRight();
653
654                 if (deleteMandatoryArtifact || !(artifactFromGraph.getMandatory() || artifactFromGraph.getServiceApi())) {
655                         StorageOperationStatus status;
656                         if (triple.getMiddle()) {
657                                 List<String> pathKeys = new ArrayList<>();
658                                 pathKeys.add(instanceId);
659                                 status = deleteToscaDataDeepElement(componentId, edgeLabelEnum, vertexTypeEnum, artifactFromGraph.getArtifactLabel(), pathKeys, JsonPresentationFields.ARTIFACT_LABEL);
660                         } else {
661                                 status = deleteToscaDataElement(componentId, edgeLabelEnum, vertexTypeEnum, artifactFromGraph.getArtifactLabel(), JsonPresentationFields.ARTIFACT_LABEL);
662                         }
663                         if (status != StorageOperationStatus.OK)
664                                 return Either.right(status);
665                 }
666                 return Either.left(artifactFromGraph);
667
668         }
669
670         public Either<ArtifactDataDefinition, StorageOperationStatus> deleteArtifactWithClonnigOnGraph(String componentId, ArtifactDefinition artifactToDelete, NodeTypeEnum type, String instanceId, boolean deleteMandatoryArtifact) {
671
672                 Either<ArtifactDataDefinition, StorageOperationStatus> result = null;
673                 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(artifactToDelete.getArtifactGroupType(), type);
674                 EdgeLabelEnum edgeLabel = triple.getLeft();
675                 VertexTypeEnum vertexLabel = triple.getRight();
676
677                 Boolean deleteElement = deleteMandatoryArtifact || !(artifactToDelete.getMandatory() || artifactToDelete.getServiceApi());
678                 Map<String, ToscaDataDefinition> artifacts = null;
679                 GraphVertex parentVertex = null;
680                 Either<Map<String, ToscaDataDefinition>, TitanOperationStatus> getArtifactsRes = null;
681
682                 Either<GraphVertex, TitanOperationStatus> getToscaElementRes = titanDao.getVertexById(componentId, JsonParseFlagEnum.NoParse);
683                 if (getToscaElementRes.isRight()) {
684                         CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to get tosca element {} upon getting tosca data from graph. Status is {}. ", componentId, getToscaElementRes.right().value());
685                         result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(getToscaElementRes.right().value()));
686                 }
687                 if (result == null) {
688                         parentVertex = getToscaElementRes.left().value();
689                         getArtifactsRes = this.getDataFromGraph(parentVertex, edgeLabel);
690                         if (getArtifactsRes.isRight()) {
691                                 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(getArtifactsRes.right().value()));
692                         }
693                 }
694                 if (result == null) {
695                         artifacts = getArtifactsRes.left().value();
696                         if (triple.getMiddle()) {
697                                 artifacts.values().forEach(ma -> ((MapArtifactDataDefinition) ma).getMapToscaDataDefinition().values().forEach(a -> a.setDuplicated(Boolean.TRUE)));
698                                 MapArtifactDataDefinition artifatcsOnInstance = (MapArtifactDataDefinition) artifacts.get(instanceId);
699                                 if (artifatcsOnInstance != null && deleteElement) {
700                                         artifatcsOnInstance.getMapToscaDataDefinition().remove(artifactToDelete.getArtifactLabel());
701                                 }
702                         } else {
703                                 if (deleteElement) {
704                                         artifacts.remove(artifactToDelete.getArtifactLabel());
705                                 }
706                                 artifacts.values().stream().forEach(a -> ((ArtifactDataDefinition) a).setDuplicated(Boolean.TRUE));
707                         }
708                         artifactToDelete.setDuplicated(Boolean.TRUE);
709                 }
710                 if (artifacts != null) {
711                         TitanOperationStatus status = titanDao.deleteEdgeByDirection(parentVertex, Direction.OUT, edgeLabel);
712                         if (status != TitanOperationStatus.OK) {
713                                 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(status));
714                         } else if (MapUtils.isNotEmpty(artifacts)) {
715                                 Either<GraphVertex, StorageOperationStatus> assosiateRes = assosiateElementToData(parentVertex, vertexLabel, edgeLabel, artifacts);
716                                 if (assosiateRes.isRight()) {
717                                         result = Either.right(result.right().value());
718                                 }
719                         }
720                 }
721                 if (result == null) {
722                         result = Either.left(artifactToDelete);
723                 }
724                 return result;
725         }
726 }