2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.sdc.be.model.jsontitan.operations;
23 import java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.List;
27 import java.util.Map.Entry;
28 import java.util.Optional;
29 import java.util.UUID;
30 import java.util.stream.Collectors;
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;
61 import fj.data.Either;
63 @org.springframework.stereotype.Component("artifacts-operations")
65 public class ArtifactsOperations extends BaseOperation {
66 private static Logger log = LoggerFactory.getLogger(ArtifactsOperations.class.getName());
68 public Either<ArtifactDefinition, StorageOperationStatus> addArifactToComponent(ArtifactDefinition artifactInfo, String parentId, NodeTypeEnum type, boolean failIfExist, String instanceId) {
70 Either<ArtifactDataDefinition, StorageOperationStatus> status = updateArtifactOnGraph(parentId, artifactInfo, type, artifactInfo.getUniqueId(), instanceId, false);
71 if (status.isRight()) {
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());
78 ArtifactDataDefinition artifactData = status.left().value();
80 ArtifactDefinition artifactDefResult = convertArtifactDataToArtifactDefinition(artifactInfo, artifactData);
81 log.debug("The returned ArtifactDefintion is {}", artifactDefResult);
82 return Either.left(artifactDefResult);
87 public Either<ArtifactDefinition, StorageOperationStatus> updateArifactOnResource(ArtifactDefinition artifactInfo, String id, String artifactId, NodeTypeEnum type, String instanceId) {
89 Either<ArtifactDataDefinition, StorageOperationStatus> status = updateArtifactOnGraph(id, artifactInfo, type, artifactId, instanceId, true);
90 if (status.isRight()) {
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());
97 ArtifactDataDefinition artifactData = status.left().value();
99 ArtifactDefinition artifactDefResult = convertArtifactDataToArtifactDefinition(artifactInfo, artifactData);
100 log.debug("The returned ArtifactDefintion is {}", artifactDefResult);
101 return Either.left(artifactDefResult);
105 public Either<Boolean, StorageOperationStatus> isCloneNeeded(String parentId, ArtifactDefinition artifactInfo, NodeTypeEnum type) {
106 ArtifactGroupTypeEnum groupType = artifactInfo.getArtifactGroupType();
108 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(groupType, type);
109 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
110 return super.isCloneNeeded(parentId, edgeLabelEnum);
113 public Either<ArtifactDefinition, StorageOperationStatus> getArtifactById(String parentId, String id) {
114 return getArtifactById(parentId, id, null, null);
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);
126 if (foundArtifact == null) {
127 foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.DEPLOYMENT_ARTIFACTS);
129 if (foundArtifact == null) {
130 foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.TOSCA_ARTIFACTS);
133 if (foundArtifact == null) {
134 foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.ARTIFACTS);
137 if (foundArtifact == null) {
138 foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.SERVICE_API_ARTIFACTS);
141 if (foundArtifact == null) {
142 result = Either.right(StorageOperationStatus.NOT_FOUND);
146 ArtifactDefinition artifactDefResult = convertArtifactDataToArtifactDefinition(null, foundArtifact);
147 return Either.left(artifactDefResult);
151 public Either<ArtifactDefinition, StorageOperationStatus> removeArifactFromResource(String id, String artifactId, NodeTypeEnum type, boolean deleteMandatoryArtifact) {
152 Either<ArtifactDefinition, StorageOperationStatus> status = removeArtifactOnGraph(id, artifactId, type, deleteMandatoryArtifact);
154 if (status.isRight()) {
156 log.debug("Failed to delete artifact {} of resource {}", artifactId, id);
158 BeEcompErrorManager.getInstance().logBeFailedDeleteNodeError("Delete Artifact", artifactId, String.valueOf(status.right().value()));
159 return Either.right(status.right().value());
162 return Either.left(status.left().value());
166 public Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getArtifacts(String parentId, NodeTypeEnum parentType, ArtifactGroupTypeEnum groupType, String instanceId) {
168 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(groupType, parentType);
169 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
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()));
179 resMap.putAll(foundArtifact.left().value());
181 return Either.left(resMap);
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
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()));
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()));
200 resMap.putAll(instArtifacts.left().value());
201 resMap.putAll(deployInstArtifacts.left().value());
202 return Either.left(convertArtifactMapToArtifactDefinitionMap(resMap));
205 public Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getArtifacts(String parentId) {
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());
214 foundArtifact = getArtifactByLabel(parentId, null, EdgeLabelEnum.DEPLOYMENT_ARTIFACTS);
215 if (foundArtifact.isLeft()) {
216 resMap.putAll(foundArtifact.left().value());
219 foundArtifact = getArtifactByLabel(parentId, null, EdgeLabelEnum.TOSCA_ARTIFACTS);
220 if (foundArtifact.isLeft()) {
221 resMap.putAll(foundArtifact.left().value());
225 return Either.left(resMap);
229 public Either<ArtifactDefinition, StorageOperationStatus> removeArtifactOnGraph(String id, String artifactId, NodeTypeEnum type, boolean deleteMandatoryArtifact) {
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());
236 ArtifactDataDefinition artifactDefinition = artifactData.left().value();
237 boolean isMandatory = false;
238 if ((artifactDefinition.getMandatory() || artifactDefinition.getServiceApi()) && !deleteMandatoryArtifact) {
239 // return Either.left(artifactData.left().value());
243 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(artifactDefinition.getArtifactGroupType(), type);
244 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
245 VertexTypeEnum vertexTypeEnum = triple.getRight();
248 StorageOperationStatus status = deleteToscaDataElement(id, edgeLabelEnum, vertexTypeEnum, artifactDefinition.getArtifactLabel(), JsonPresentationFields.ARTIFACT_LABEL);
249 if (status != StorageOperationStatus.OK)
250 return Either.right(status);
253 return Either.left(artifactData.left().value());
257 public void updateUUID(ArtifactDataDefinition artifactData, String oldChecksum, String oldVesrion, boolean isUpdate, EdgeLabelEnum edgeLabel) {
258 if (oldVesrion == null || oldVesrion.isEmpty())
261 String currentChecksum = artifactData.getArtifactChecksum();
264 ArtifactTypeEnum type = ArtifactTypeEnum.findType(artifactData.getArtifactType());
267 if (edgeLabel == EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS) {
268 generateUUID(artifactData, oldVesrion);
270 updateVersionAndDate(artifactData, oldVesrion);
272 long time = System.currentTimeMillis();
273 artifactData.setHeatParamsUpdateDate(time);
278 generateUUID(artifactData, oldVesrion);
281 if (oldChecksum == null || oldChecksum.isEmpty()) {
282 if (currentChecksum != null) {
283 generateUUID(artifactData, oldVesrion);
285 } else if ((currentChecksum != null && !currentChecksum.isEmpty()) && !oldChecksum.equals(currentChecksum)) {
286 generateUUID(artifactData, oldVesrion);
291 if (oldChecksum == null || oldChecksum.isEmpty()) {
292 if (currentChecksum != null) {
293 generateUUID(artifactData, oldVesrion);
295 } else if ((currentChecksum != null && !currentChecksum.isEmpty()) && !oldChecksum.equals(currentChecksum)) {
296 generateUUID(artifactData, oldVesrion);
301 // @TODO add implementation
303 public Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getArtifacts(String parentId, NodeTypeEnum parentType) {
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);
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;
320 compType = componentType;
322 return getArtifactById(parentId, id, compType, containerId);
325 public Either<ArtifactDefinition, StorageOperationStatus> updateHeatEnvArtifact(String id, ArtifactDefinition artifactEnvInfo, String artifactId, String newArtifactId, NodeTypeEnum type, String instanceId) {
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()));
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);
343 return Either.left(artifactEnvInfo);
346 public Either<ArtifactDefinition, StorageOperationStatus> updateHeatEnvPlaceholder(ArtifactDefinition artifactInfo, String parentId, NodeTypeEnum type) {
347 return updateArifactOnResource(artifactInfo, parentId, artifactInfo.getUniqueId(), type, null);
350 // public Either<List<HeatParameterDefinition>, StorageOperationStatus> getHeatParamsForEnv(ArtifactDefinition heatEnvArtifact, String parentId) {
354 ///////////////////////////////////////////// private methods ////////////////////////////////////////////////////
356 protected ArtifactDefinition convertArtifactDataToArtifactDefinition(ArtifactDefinition artifactInfo, ArtifactDataDefinition artifactDefResult) {
357 log.debug("The object returned after create property is {}", artifactDefResult);
359 ArtifactDefinition propertyDefResult = new ArtifactDefinition(artifactDefResult);
360 if (artifactInfo != null)
361 propertyDefResult.setPayload(artifactInfo.getPayloadData());
363 List<HeatParameterDefinition> parameters = new ArrayList<HeatParameterDefinition>();
365 * StorageOperationStatus heatParametersOfNode = heatParametersOperation.getHeatParametersOfNode(NodeTypeEnum.ArtifactRef, artifactDefResult.getUniqueId().toString(), parameters); if ((heatParametersOfNode.equals(StorageOperationStatus.OK))
366 * && !parameters.isEmpty()) { propertyDefResult.setHeatParameters(parameters); }
368 return propertyDefResult;
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());
379 Map<String, MapArtifactDataDefinition> artifacts = artifactsEither.left().value();
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());
386 Optional<ArtifactDataDefinition> op = artifactsPerInstance.getMapToscaDataDefinition().values().stream().filter(p -> p.getUniqueId().equals(id)).findAny();
387 if (op.isPresent()) {
388 foundArtifact = op.get();
390 return foundArtifact;
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());
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();
406 return foundArtifact;
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());
415 Map<String, ArtifactDataDefinition> artifactDataMap = artifactsEither.left().value();
416 return Either.left(convertArtifactMapToArtifactDefinitionMap(artifactDataMap));
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);
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())));
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());
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<>());
442 private Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> getEdgeLabelEnumFromArtifactGroupType(ArtifactGroupTypeEnum groupType, NodeTypeEnum nodeType) {
443 EdgeLabelEnum edgeLabelEnum;
444 VertexTypeEnum vertexTypeEnum;
445 Boolean isDeepElement = false;
447 * if (nodeType == NodeTypeEnum.ResourceInstance) { edgeLabelEnum = EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS; vertexTypeEnum = VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS; isDeepElement = true; } else {
451 edgeLabelEnum = EdgeLabelEnum.TOSCA_ARTIFACTS;
452 vertexTypeEnum = VertexTypeEnum.TOSCA_ARTIFACTS;
455 if (nodeType == NodeTypeEnum.ResourceInstance) {
456 edgeLabelEnum = EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS;
457 vertexTypeEnum = VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS;
458 isDeepElement = true;
460 edgeLabelEnum = EdgeLabelEnum.DEPLOYMENT_ARTIFACTS;
461 vertexTypeEnum = VertexTypeEnum.DEPLOYMENT_ARTIFACTS;
465 edgeLabelEnum = EdgeLabelEnum.SERVICE_API_ARTIFACTS;
466 vertexTypeEnum = VertexTypeEnum.SERVICE_API_ARTIFACTS;
469 if (nodeType == NodeTypeEnum.ResourceInstance) {
470 edgeLabelEnum = EdgeLabelEnum.INSTANCE_ARTIFACTS;
471 vertexTypeEnum = VertexTypeEnum.INSTANCE_ARTIFACTS;
472 isDeepElement = true;
474 edgeLabelEnum = EdgeLabelEnum.ARTIFACTS;
475 vertexTypeEnum = VertexTypeEnum.ARTIFACTS;
480 return new ImmutableTriple<EdgeLabelEnum, Boolean, VertexTypeEnum>(edgeLabelEnum, isDeepElement, vertexTypeEnum);
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();
489 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(groupType, type);
490 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
491 VertexTypeEnum vertexTypeEnum = triple.getRight();
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());
499 boolean isNeedToClone = isNeedToCloneEither.left().value();
501 if (artifactId == null || isNeedToClone) {
503 if (edgeLabelEnum != EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS && edgeLabelEnum != EdgeLabelEnum.INSTANCE_ARTIFACTS) {
504 uniqueId = UniqueIdBuilder.buildPropertyUniqueId(componentId, artifactToUpdate.getArtifactLabel());
506 uniqueId = UniqueIdBuilder.buildPropertyUniqueId(instanceId, artifactToUpdate.getArtifactLabel());
508 artifactToUpdate.setUniqueId(uniqueId);
509 artifactToUpdate.setEsId(uniqueId);
511 artifactToUpdate.setUniqueId(artifactId);
513 Map<String, ArtifactDataDefinition> artifacts = new HashMap<>();
514 Map<String, MapArtifactDataDefinition> artifactInst = null;
515 if (edgeLabelEnum != EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS && edgeLabelEnum != EdgeLabelEnum.INSTANCE_ARTIFACTS) {
517 Either<Map<String, ArtifactDataDefinition>, TitanOperationStatus> artifactsEither = this.getDataFromGraph(componentId, edgeLabelEnum);
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));
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)));
533 MapArtifactDataDefinition artifatcsOnInstance = artifactInst.get(instanceId);
534 if (artifatcsOnInstance != null) {
535 artifacts = artifatcsOnInstance.getMapToscaDataDefinition();
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());
549 artifactToUpdate.setDuplicated(Boolean.FALSE);
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);
560 updateUUID(artifactToUpdate, oldChecksum, oldVersion, isUpdate, edgeLabelEnum);
562 if (artifactInfo.getPayloadData() == null) {
563 if (!artifactToUpdate.getMandatory() || artifactToUpdate.getEsId() != null) {
564 artifactToUpdate.setEsId(artifactToUpdate.getUniqueId());
567 if (artifactToUpdate.getEsId() == null) {
568 artifactToUpdate.setEsId(artifactToUpdate.getUniqueId());
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);
577 if (isNeedToClone && artifacts != null) {
578 artifacts.values().stream().filter(a -> !a.getArtifactLabel().equals(artifactToUpdate.getArtifactLabel())).forEach(a -> toscaDataList.add(a));
580 status = updateToscaDataOfToscaElement(componentId, edgeLabelEnum, vertexTypeEnum, toscaDataList, JsonPresentationFields.ARTIFACT_LABEL);
582 List<ArtifactDataDefinition> toscaDataList = new ArrayList<>();
583 toscaDataList.add(artifactToUpdate);
584 List<String> pathKeys = new ArrayList<>();
585 pathKeys.add(instanceId);
587 MapArtifactDataDefinition artifatcsOnInstance = artifactInst.get(instanceId);
588 if (artifatcsOnInstance != null) {
589 artifacts = artifatcsOnInstance.getMapToscaDataDefinition();
590 artifacts.put(artifactToUpdate.getArtifactLabel(), artifactToUpdate);
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);
605 status = updateToscaDataDeepElementsOfToscaElement(componentId, edgeLabelEnum, vertexTypeEnum, toscaDataList, pathKeys, JsonPresentationFields.ARTIFACT_LABEL);
608 if (status == StorageOperationStatus.OK)
609 res = Either.left(artifactToUpdate);
611 res = Either.right(status);
615 public void generateUUID(ArtifactDataDefinition artifactData, String oldVesrion) {
617 UUID uuid = UUID.randomUUID();
618 artifactData.setArtifactUUID(uuid.toString());
619 MDC.put("serviceInstanceID", uuid.toString());
620 updateVersionAndDate(artifactData, oldVesrion);
623 private void updateVersionAndDate(ArtifactDataDefinition artifactData, String oldVesrion) {
624 if (artifactData.getArtifactChecksum() != null) {
625 long time = System.currentTimeMillis();
626 artifactData.setPayloadUpdateDate(time);
628 int newVersion = new Integer(oldVesrion).intValue();
630 artifactData.setArtifactVersion(String.valueOf(newVersion));
633 private boolean validateParentType(NodeTypeEnum type) {
634 boolean isValid = false;
637 case InterfaceOperation:
639 case ResourceInstance:
643 log.debug("Not supported node type for artifact relation : {} ", type);
648 public Either<ArtifactDataDefinition, StorageOperationStatus> removeArtifactOnGraph(ArtifactDefinition artifactFromGraph, String componentId, String instanceId, NodeTypeEnum type, boolean deleteMandatoryArtifact) {
650 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(artifactFromGraph.getArtifactGroupType(), type);
651 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
652 VertexTypeEnum vertexTypeEnum = triple.getRight();
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);
661 status = deleteToscaDataElement(componentId, edgeLabelEnum, vertexTypeEnum, artifactFromGraph.getArtifactLabel(), JsonPresentationFields.ARTIFACT_LABEL);
663 if (status != StorageOperationStatus.OK)
664 return Either.right(status);
666 return Either.left(artifactFromGraph);
670 public Either<ArtifactDataDefinition, StorageOperationStatus> deleteArtifactWithClonnigOnGraph(String componentId, ArtifactDefinition artifactToDelete, NodeTypeEnum type, String instanceId, boolean deleteMandatoryArtifact) {
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();
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;
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()));
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()));
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());
704 artifacts.remove(artifactToDelete.getArtifactLabel());
706 artifacts.values().stream().forEach(a -> ((ArtifactDataDefinition) a).setDuplicated(Boolean.TRUE));
708 artifactToDelete.setDuplicated(Boolean.TRUE);
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());
721 if (result == null) {
722 result = Either.left(artifactToDelete);