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