2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.sdc.be.model.jsonjanusgraph.operations;
23 import fj.data.Either;
24 import org.apache.commons.collections.MapUtils;
25 import org.apache.commons.lang3.tuple.ImmutableTriple;
26 import org.apache.commons.lang3.tuple.Triple;
27 import org.apache.tinkerpop.gremlin.structure.Direction;
28 import org.openecomp.sdc.be.config.BeEcompErrorManager;
29 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
30 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
31 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
32 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
33 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
34 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
35 import org.openecomp.sdc.be.datatypes.elements.InterfaceDataDefinition;
36 import org.openecomp.sdc.be.datatypes.elements.MapArtifactDataDefinition;
37 import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
38 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
39 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
40 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
41 import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
42 import org.openecomp.sdc.be.model.ArtifactDefinition;
43 import org.openecomp.sdc.be.model.HeatParameterDefinition;
44 import org.openecomp.sdc.be.model.InterfaceDefinition;
45 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
46 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
47 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
48 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
49 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
50 import org.openecomp.sdc.common.jsongraph.util.CommonUtility;
51 import org.openecomp.sdc.common.jsongraph.util.CommonUtility.LogLevelEnum;
52 import org.openecomp.sdc.common.log.wrappers.Logger;
56 import java.util.Map.Entry;
57 import java.util.stream.Collectors;
59 @org.springframework.stereotype.Component("artifacts-operations")
61 public class ArtifactsOperations extends BaseOperation {
62 private static final String FAILED_TO_FETCH_FOR_TOSCA_ELEMENT_WITH_ID_ERROR = "failed to fetch {} for tosca element with id {}, error {}";
63 private static final Logger log = Logger.getLogger(ArtifactsOperations.class.getName());
65 public Either<ArtifactDefinition, StorageOperationStatus> addArifactToComponent(ArtifactDefinition artifactInfo, String parentId, NodeTypeEnum type, boolean failIfExist, String instanceId) {
67 String artifactId = artifactInfo.getUniqueId();
68 if (artifactId == null && artifactInfo.getEsId() != null) {
69 artifactId = artifactInfo.getEsId();
71 Either<ArtifactDataDefinition, StorageOperationStatus> status = updateArtifactOnGraph(parentId, artifactInfo, type, artifactId, instanceId, false, false);
72 if (status.isRight()) {
74 log.debug("Failed to update artifact {} of {} {}. status is {}", artifactInfo.getArtifactName(), type.getName(), parentId, status.right().value());
75 BeEcompErrorManager.getInstance().logBeFailedUpdateNodeError("Update Artifact", artifactInfo.getArtifactName(), String.valueOf(status.right().value()));
76 return Either.right(status.right().value());
79 ArtifactDataDefinition artifactData = status.left().value();
81 ArtifactDefinition artifactDefResult = convertArtifactDataToArtifactDefinition(artifactInfo, artifactData);
82 log.debug("The returned ArtifactDefintion is {}", artifactDefResult);
83 return Either.left(artifactDefResult);
88 public Either<ArtifactDefinition, StorageOperationStatus> updateArtifactOnResource(ArtifactDefinition artifactInfo, String id, String artifactId, NodeTypeEnum type, String instanceId) {
90 Either<ArtifactDataDefinition, StorageOperationStatus> status = updateArtifactOnGraph(id, artifactInfo, type, artifactId, instanceId, true, false);
91 if (status.isRight()) {
93 log.debug("Failed to update artifact {} of {} {}. status is {}", artifactInfo.getArtifactName(), type.getName(), id, status.right().value());
94 BeEcompErrorManager.getInstance().logBeFailedUpdateNodeError("Update Artifact", artifactInfo.getArtifactName(), String.valueOf(status.right().value()));
95 return Either.right(status.right().value());
98 ArtifactDataDefinition artifactData = status.left().value();
100 ArtifactDefinition artifactDefResult = convertArtifactDataToArtifactDefinition(artifactInfo, artifactData);
101 log.debug("The returned ArtifactDefintion is {}", artifactDefResult);
102 return Either.left(artifactDefResult);
106 public Either<Boolean, StorageOperationStatus> isCloneNeeded(String parentId, ArtifactDefinition artifactInfo, NodeTypeEnum type) {
107 ArtifactGroupTypeEnum groupType = artifactInfo.getArtifactGroupType();
109 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(groupType, type);
110 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
111 return super.isCloneNeeded(parentId, edgeLabelEnum);
114 public Either<ArtifactDefinition, StorageOperationStatus> getArtifactById(String parentId, String id) {
115 return getArtifactById(parentId, id, null, null);
118 public Either<ArtifactDefinition, StorageOperationStatus> getArtifactById(String parentId, String id, ComponentTypeEnum componentType, String containerId) {
119 Either<ArtifactDefinition, StorageOperationStatus> result = null;
120 ArtifactDataDefinition foundArtifact = null;
121 if (componentType != null && componentType == ComponentTypeEnum.RESOURCE_INSTANCE) {
122 foundArtifact = getInstanceArtifactByLabelAndId(parentId, id, containerId, EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS);
123 if (foundArtifact == null) {
124 foundArtifact = getInstanceArtifactByLabelAndId(parentId, id, containerId, EdgeLabelEnum.INSTANCE_ARTIFACTS);
127 if (foundArtifact == null) {
128 foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.DEPLOYMENT_ARTIFACTS);
130 if (foundArtifact == null) {
131 foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.TOSCA_ARTIFACTS);
134 if (foundArtifact == null) {
135 foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.ARTIFACTS);
138 if (foundArtifact == null) {
139 foundArtifact = getArtifactByLabelAndId(parentId, id, EdgeLabelEnum.SERVICE_API_ARTIFACTS);
141 if (foundArtifact == null) {
142 foundArtifact = findInterfaceArtifact(parentId, id);
146 if (foundArtifact == null) {
147 result = Either.right(StorageOperationStatus.NOT_FOUND);
151 ArtifactDefinition artifactDefResult = convertArtifactDataToArtifactDefinition(null, foundArtifact);
152 return Either.left(artifactDefResult);
155 private ArtifactDataDefinition findInterfaceArtifact(String parentId, String id) {
156 Either<Map<String, InterfaceDefinition>, JanusGraphOperationStatus> dataFromGraph = getDataFromGraph(parentId, EdgeLabelEnum.INTERFACE);
157 if (dataFromGraph.isRight()){
158 log.debug("failed to fetch interfaces {} for tosca element with id {}, error {}", id, parentId ,dataFromGraph.right().value());
162 Map<String, InterfaceDefinition> interfaceDefinitionMap = dataFromGraph.left().value();
163 if(interfaceDefinitionMap == null) {
166 Collection<InterfaceDefinition> interfaces = interfaceDefinitionMap.values();
167 if (interfaces == null){
170 for (InterfaceDataDefinition interfaceDataDefinition : interfaces){
171 Map<String, OperationDataDefinition> operationsMap = interfaceDataDefinition.getOperations();
172 if (operationsMap == null) {
175 ArtifactDataDefinition implementationArtifact = getArtifactDataDefinition(id, operationsMap);
176 if (implementationArtifact != null)
177 return implementationArtifact;
182 private ArtifactDataDefinition getArtifactDataDefinition(String id,
183 Map<String, OperationDataDefinition> operationsMap) {
184 for(OperationDataDefinition operationDataDefinition : operationsMap.values()){
185 ArtifactDataDefinition implementationArtifact = operationDataDefinition.getImplementation();
186 if(implementationArtifact != null){
187 String uniqueId = implementationArtifact.getUniqueId();
188 if (id.equals(uniqueId)) {
189 return implementationArtifact;
197 public Either<ArtifactDefinition, StorageOperationStatus> removeArifactFromResource(String id, String artifactId, NodeTypeEnum type, boolean deleteMandatoryArtifact) {
198 Either<ArtifactDefinition, StorageOperationStatus> status = removeArtifactOnGraph(id, artifactId, type, deleteMandatoryArtifact);
200 if (status.isRight()) {
202 log.debug("Failed to delete artifact {} of resource {}", artifactId, id);
204 BeEcompErrorManager.getInstance().logBeFailedDeleteNodeError("Delete Artifact", artifactId, String.valueOf(status.right().value()));
205 return Either.right(status.right().value());
208 return Either.left(status.left().value());
212 public Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getArtifacts(String parentId, NodeTypeEnum parentType, ArtifactGroupTypeEnum groupType, String instanceId) {
214 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(groupType, parentType);
215 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
217 Either<Map<String, ArtifactDefinition>, JanusGraphOperationStatus> foundArtifact = null;
218 Map<String, ArtifactDefinition> resMap = new HashMap<>();
219 foundArtifact = getArtifactByLabel(parentId, instanceId, edgeLabelEnum);
220 if (foundArtifact.isRight()) {
221 log.debug("Failed to find artifact in component {} with label {} ", parentId, edgeLabelEnum);
222 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(foundArtifact.right().value()));
225 resMap.putAll(foundArtifact.left().value());
227 return Either.left(resMap);
231 * @param parentId the id of the instance container
232 * @param instanceId the id of the instance of which to return its artifacts
233 * @return instance and instance deployment artifacts mapped by artifact label name
235 public Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getAllInstanceArtifacts(String parentId, String instanceId) {
236 Map<String, ArtifactDataDefinition> resMap = new HashMap<>();
237 Either<Map<String, ArtifactDataDefinition>, JanusGraphOperationStatus> instArtifacts = getInstanceArtifactsByLabel(parentId, instanceId, EdgeLabelEnum.INSTANCE_ARTIFACTS);
238 if (instArtifacts.isRight()) {
239 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(instArtifacts.right().value()));
241 Either<Map<String, ArtifactDataDefinition>, JanusGraphOperationStatus> deployInstArtifacts = getInstanceArtifactsByLabel(parentId, instanceId, EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS);
242 if (deployInstArtifacts.isRight()) {
243 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(deployInstArtifacts.right().value()));
245 resMap.putAll(instArtifacts.left().value());
246 resMap.putAll(deployInstArtifacts.left().value());
247 return Either.left(convertArtifactMapToArtifactDefinitionMap(resMap));
250 public Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getArtifacts(String parentId) {
252 Either<Map<String, ArtifactDefinition>, JanusGraphOperationStatus> foundArtifact = null;
253 Map<String, ArtifactDefinition> resMap = new HashMap<>();
254 foundArtifact = getArtifactByLabel(parentId, null, EdgeLabelEnum.ARTIFACTS);
255 if (foundArtifact.isLeft()) {
256 resMap.putAll(foundArtifact.left().value());
259 foundArtifact = getArtifactByLabel(parentId, null, EdgeLabelEnum.DEPLOYMENT_ARTIFACTS);
260 if (foundArtifact.isLeft()) {
261 resMap.putAll(foundArtifact.left().value());
264 foundArtifact = getArtifactByLabel(parentId, null, EdgeLabelEnum.TOSCA_ARTIFACTS);
265 if (foundArtifact.isLeft()) {
266 resMap.putAll(foundArtifact.left().value());
270 return Either.left(resMap);
274 public Either<ArtifactDefinition, StorageOperationStatus> removeArtifactOnGraph(String id, String artifactId, NodeTypeEnum type, boolean deleteMandatoryArtifact) {
276 Either<ArtifactDefinition, StorageOperationStatus> artifactData = this.getArtifactById(id, artifactId);
277 if (artifactData.isRight()) {
278 log.debug("Failed to find artifact in component {} with id {} ", id, artifactId);
279 return Either.right(artifactData.right().value());
281 ArtifactDataDefinition artifactDefinition = artifactData.left().value();
282 boolean isMandatory = false;
283 if ((artifactDefinition.getMandatory() || artifactDefinition.getServiceApi()) && !deleteMandatoryArtifact) {
284 // return Either.left(artifactData.left().value());
288 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(artifactDefinition.getArtifactGroupType(), type);
289 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
290 VertexTypeEnum vertexTypeEnum = triple.getRight();
293 StorageOperationStatus status = deleteToscaDataElement(id, edgeLabelEnum, vertexTypeEnum, artifactDefinition.getArtifactLabel(), JsonPresentationFields.ARTIFACT_LABEL);
294 if (status != StorageOperationStatus.OK)
295 return Either.right(status);
298 return Either.left(artifactData.left().value());
302 public void updateUUID(ArtifactDataDefinition artifactData, String oldChecksum, String oldVesrion, boolean isUpdate, EdgeLabelEnum edgeLabel) {
303 if (oldVesrion == null || oldVesrion.isEmpty())
306 String currentChecksum = artifactData.getArtifactChecksum();
309 ArtifactTypeEnum type = ArtifactTypeEnum.findType(artifactData.getArtifactType());
312 if (edgeLabel == EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS) {
313 generateUUID(artifactData, oldVesrion);
315 updateVersionAndDate(artifactData, oldVesrion);
321 generateUUID(artifactData, oldVesrion);
324 if (oldChecksum == null || oldChecksum.isEmpty()) {
325 if (currentChecksum != null) {
326 generateUUID(artifactData, oldVesrion);
328 } else if ((currentChecksum != null && !currentChecksum.isEmpty()) && !oldChecksum.equals(currentChecksum)) {
329 generateUUID(artifactData, oldVesrion);
334 if (oldChecksum == null || oldChecksum.isEmpty()) {
335 if (currentChecksum != null) {
336 generateUUID(artifactData, oldVesrion);
338 } else if ((currentChecksum != null && !currentChecksum.isEmpty()) && !oldChecksum.equals(currentChecksum)) {
339 generateUUID(artifactData, oldVesrion);
344 // @TODO add implementation
346 public Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getArtifacts(String parentId, NodeTypeEnum parentType) {
350 public Either<ArtifactDefinition, StorageOperationStatus> addHeatEnvArtifact(ArtifactDefinition artifactHeatEnv, ArtifactDefinition artifactHeat, String componentId, NodeTypeEnum parentType, boolean failIfExist, String instanceId) {
351 artifactHeatEnv.setGeneratedFromId(artifactHeat.getUniqueId());
352 return addArifactToComponent(artifactHeatEnv, componentId, parentType, failIfExist, instanceId);
355 public Either<ArtifactDefinition, StorageOperationStatus> getHeatArtifactByHeatEnvId(String parentId, ArtifactDefinition heatEnv, NodeTypeEnum parentType, String containerId, ComponentTypeEnum componentType) {
356 String id = heatEnv.getGeneratedFromId();
357 ComponentTypeEnum compType;
358 switch (parentType) {
359 case ResourceInstance:
360 compType = ComponentTypeEnum.RESOURCE_INSTANCE;
363 compType = componentType;
365 return getArtifactById(parentId, id, compType, containerId);
368 public Either<ArtifactDefinition, StorageOperationStatus> updateHeatEnvArtifact(String id, ArtifactDefinition artifactEnvInfo, String artifactId, String newArtifactId, NodeTypeEnum type, String instanceId) {
370 Either<Map<String, ArtifactDefinition>, JanusGraphOperationStatus> artifactsEither = getArtifactByLabel(id, instanceId, EdgeLabelEnum.DEPLOYMENT_ARTIFACTS);
371 if (artifactsEither.isRight()) {
372 log.debug("Failed to find artifacts in component {} with id {} ", id, artifactsEither.right().value());
373 return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(artifactsEither.right().value()));
376 Map<String, ArtifactDefinition> artifacts = artifactsEither.left().value();
377 List<ArtifactDefinition> envList = artifacts.values().stream().filter(a -> a.getGeneratedFromId() != null && a.getGeneratedFromId().equals(artifactId)).collect(Collectors.toList());
378 if (envList != null && !envList.isEmpty()) {
379 envList.forEach(a -> {
380 a.setGeneratedFromId(newArtifactId);
381 updateArtifactOnResource(a, id, a.getUniqueId(), type, instanceId);
386 return Either.left(artifactEnvInfo);
389 public Either<ArtifactDefinition, StorageOperationStatus> updateHeatEnvPlaceholder(ArtifactDefinition artifactInfo, String parentId, NodeTypeEnum type) {
390 return updateArtifactOnResource(artifactInfo, parentId, artifactInfo.getUniqueId(), type, null);
394 ///////////////////////////////////////////// private methods ////////////////////////////////////////////////////
396 protected ArtifactDefinition convertArtifactDataToArtifactDefinition(ArtifactDefinition artifactInfo, ArtifactDataDefinition artifactDefResult) {
397 log.debug("The object returned after create property is {}", artifactDefResult);
399 ArtifactDefinition propertyDefResult = new ArtifactDefinition(artifactDefResult);
400 if (artifactInfo != null)
401 propertyDefResult.setPayload(artifactInfo.getPayloadData());
403 List<HeatParameterDefinition> parameters = new ArrayList<>();
405 * StorageOperationStatus heatParametersOfNode = heatParametersOperation.getHeatParametersOfNode(NodeTypeEnum.ArtifactRef, artifactDefResult.getUniqueId().toString(), parameters); if ((heatParametersOfNode.equals(StorageOperationStatus.OK))
406 * && !parameters.isEmpty()) { propertyDefResult.setHeatParameters(parameters); }
408 return propertyDefResult;
411 private ArtifactDataDefinition getInstanceArtifactByLabelAndId(String parentId, String id, String containerId, EdgeLabelEnum edgeLabelEnum) {
412 ArtifactDataDefinition foundArtifact = null;
413 Either<Map<String, MapArtifactDataDefinition>, JanusGraphOperationStatus> artifactsEither = getDataFromGraph(containerId, edgeLabelEnum);
414 if (artifactsEither.isRight()) {
415 log.debug(FAILED_TO_FETCH_FOR_TOSCA_ELEMENT_WITH_ID_ERROR, edgeLabelEnum, containerId, artifactsEither.right().value());
419 Map<String, MapArtifactDataDefinition> artifacts = artifactsEither.left().value();
421 MapArtifactDataDefinition artifactsPerInstance = artifacts.get(parentId);
422 if (artifactsPerInstance == null) {
423 log.debug("failed to fetch artifacts for instance {} in tosca element with id {}, error {}", parentId, containerId, artifactsEither.right().value());
426 Optional<ArtifactDataDefinition> op = artifactsPerInstance.getMapToscaDataDefinition().values().stream().filter(p -> p.getUniqueId().equals(id)).findAny();
427 if (op.isPresent()) {
428 foundArtifact = op.get();
430 return foundArtifact;
433 private ArtifactDataDefinition getArtifactByLabelAndId(String parentId, String id, EdgeLabelEnum edgeLabelEnum) {
434 ArtifactDataDefinition foundArtifact = null;
435 Either<Map<String, ArtifactDataDefinition>, JanusGraphOperationStatus> artifactsEither = getDataFromGraph(parentId, edgeLabelEnum);
436 if (artifactsEither.isRight()) {
437 log.debug(FAILED_TO_FETCH_FOR_TOSCA_ELEMENT_WITH_ID_ERROR, edgeLabelEnum, parentId, artifactsEither.right().value());
441 Map<String, ArtifactDataDefinition> artifacts = artifactsEither.left().value();
442 Optional<ArtifactDataDefinition> op = artifacts.values().stream().filter(p -> p.getUniqueId().equals(id)).findAny();
443 if (op.isPresent()) {
444 foundArtifact = op.get();
446 return foundArtifact;
449 private Either<Map<String, ArtifactDefinition>, JanusGraphOperationStatus> getArtifactByLabel(String parentId, String instanceId, EdgeLabelEnum edgeLabelEnum) {
450 Either<Map<String, ArtifactDataDefinition>, JanusGraphOperationStatus> artifactsEither = getArtifactsDataByLabel(parentId, instanceId, edgeLabelEnum);
451 if (artifactsEither.isRight()) {
452 log.debug(FAILED_TO_FETCH_FOR_TOSCA_ELEMENT_WITH_ID_ERROR, edgeLabelEnum, parentId, artifactsEither.right().value());
453 return Either.right(artifactsEither.right().value());
455 Map<String, ArtifactDataDefinition> artifactDataMap = artifactsEither.left().value();
456 return Either.left(convertArtifactMapToArtifactDefinitionMap(artifactDataMap));
459 private Either<Map<String, ArtifactDataDefinition>, JanusGraphOperationStatus> getArtifactsDataByLabel(String parentId, String instanceId, EdgeLabelEnum edgeLabelEnum) {
460 return edgeLabelEnum.isInstanceArtifactsLabel() ? getInstanceArtifactsByLabel(parentId, instanceId, edgeLabelEnum) : getDataFromGraph(parentId, edgeLabelEnum);
463 private Map<String, ArtifactDefinition> convertArtifactMapToArtifactDefinitionMap(Map<String, ArtifactDataDefinition> artifactDataMap) {
464 Map<String, ArtifactDefinition> artMap = new HashMap<>();
465 if (artifactDataMap != null && !artifactDataMap.isEmpty()) {
466 artMap = artifactDataMap.entrySet().stream().collect(Collectors.toMap(Entry::getKey, e -> convertArtifactDataToArtifactDefinition(null, e.getValue())));
471 private Either<Map<String, ArtifactDataDefinition>, JanusGraphOperationStatus> getInstanceArtifactsByLabel(String parentId, String instanceId, EdgeLabelEnum edgeLabelEnum) {
472 Either<Map<String, MapArtifactDataDefinition>, JanusGraphOperationStatus> resultEither = getDataFromGraph(parentId, edgeLabelEnum);
473 if (resultEither.isRight()) {
474 log.debug(FAILED_TO_FETCH_FOR_TOSCA_ELEMENT_WITH_ID_ERROR, edgeLabelEnum, parentId, resultEither.right().value());
475 return Either.right(resultEither.right().value());
477 Map<String, MapArtifactDataDefinition> mapArtifacts = resultEither.left().value();
478 MapArtifactDataDefinition artifactPerInstance = mapArtifacts.get(instanceId);
479 return artifactPerInstance != null ? Either.left(artifactPerInstance.getMapToscaDataDefinition()) : Either.left(new HashMap<>());
482 private Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> getEdgeLabelEnumFromArtifactGroupType(ArtifactGroupTypeEnum groupType, NodeTypeEnum nodeType) {
483 EdgeLabelEnum edgeLabelEnum;
484 VertexTypeEnum vertexTypeEnum;
485 Boolean isDeepElement = false;
487 * if (nodeType == NodeTypeEnum.ResourceInstance) { edgeLabelEnum = EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS; vertexTypeEnum = VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS; isDeepElement = true; } else {
491 edgeLabelEnum = EdgeLabelEnum.TOSCA_ARTIFACTS;
492 vertexTypeEnum = VertexTypeEnum.TOSCA_ARTIFACTS;
495 if (nodeType == NodeTypeEnum.ResourceInstance) {
496 edgeLabelEnum = EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS;
497 vertexTypeEnum = VertexTypeEnum.INST_DEPLOYMENT_ARTIFACTS;
498 isDeepElement = true;
500 edgeLabelEnum = EdgeLabelEnum.DEPLOYMENT_ARTIFACTS;
501 vertexTypeEnum = VertexTypeEnum.DEPLOYMENT_ARTIFACTS;
505 edgeLabelEnum = EdgeLabelEnum.SERVICE_API_ARTIFACTS;
506 vertexTypeEnum = VertexTypeEnum.SERVICE_API_ARTIFACTS;
509 if (nodeType == NodeTypeEnum.ResourceInstance) {
510 edgeLabelEnum = EdgeLabelEnum.INSTANCE_ARTIFACTS;
511 vertexTypeEnum = VertexTypeEnum.INSTANCE_ARTIFACTS;
512 isDeepElement = true;
514 edgeLabelEnum = EdgeLabelEnum.ARTIFACTS;
515 vertexTypeEnum = VertexTypeEnum.ARTIFACTS;
520 return new ImmutableTriple<>(edgeLabelEnum, isDeepElement, vertexTypeEnum);
524 public Either<ArtifactDataDefinition, StorageOperationStatus> updateArtifactOnGraph(String componentId, ArtifactDefinition artifactInfo, NodeTypeEnum type, String artifactId, String instanceId, boolean isUpdate, boolean isDeletePlaceholder) {
525 Either<ArtifactDataDefinition, StorageOperationStatus> res = null;
526 ArtifactDataDefinition artifactToUpdate = new ArtifactDataDefinition(artifactInfo);
527 ArtifactGroupTypeEnum groupType = artifactInfo.getArtifactGroupType();
529 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(groupType, type);
530 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
531 VertexTypeEnum vertexTypeEnum = triple.getRight();
533 Either<Boolean, StorageOperationStatus> isNeedToCloneEither = isCloneNeeded(componentId, edgeLabelEnum);
534 if (isNeedToCloneEither.isRight()) {
535 log.debug("Failed check is clone needed {}", componentId);
536 return Either.right(isNeedToCloneEither.right().value());
539 boolean isNeedToClone = isNeedToCloneEither.left().value();
541 if (artifactId == null || isNeedToClone) {
543 if (edgeLabelEnum != EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS && edgeLabelEnum != EdgeLabelEnum.INSTANCE_ARTIFACTS) {
544 uniqueId = UniqueIdBuilder.buildPropertyUniqueId(componentId, artifactToUpdate.getArtifactLabel());
546 uniqueId = UniqueIdBuilder.buildInstanceArtifactUniqueId(componentId, instanceId, artifactToUpdate.getArtifactLabel());
548 artifactToUpdate.setUniqueId(uniqueId);
549 if (!isDeletePlaceholder)
550 artifactToUpdate.setEsId(uniqueId);
552 artifactToUpdate.setUniqueId(artifactId);
554 Map<String, ArtifactDataDefinition> artifacts = new HashMap<>();
555 Map<String, MapArtifactDataDefinition> artifactInst = null;
556 if (edgeLabelEnum != EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS && edgeLabelEnum != EdgeLabelEnum.INSTANCE_ARTIFACTS) {
558 Either<Map<String, ArtifactDataDefinition>, JanusGraphOperationStatus> artifactsEither = this.getDataFromGraph(componentId, edgeLabelEnum);
560 if (artifactsEither.isLeft() && artifactsEither.left().value() != null && !artifactsEither.left().value().isEmpty()) {
561 artifacts = artifactsEither.left().value();
562 if (isNeedToClone && artifacts != null) {
563 artifacts.values().stream().forEach(a -> a.setDuplicated(Boolean.TRUE));
568 Either<Map<String, MapArtifactDataDefinition>, JanusGraphOperationStatus> artifactsEither = this.getDataFromGraph(componentId, edgeLabelEnum);
569 if (artifactsEither.isLeft()) {
570 artifactInst = artifactsEither.left().value();
571 if (isNeedToClone && artifactInst != null) {
572 artifactInst.values().forEach(ma -> ma.getMapToscaDataDefinition().values().forEach(a -> a.setDuplicated(Boolean.TRUE)));
574 MapArtifactDataDefinition artifatcsOnInstance = artifactInst.get(instanceId);
575 if (artifatcsOnInstance != null) {
576 artifacts = artifatcsOnInstance.getMapToscaDataDefinition();
580 String oldChecksum = null;
581 String oldVersion = null;
582 if (artifacts != null && artifacts.containsKey(artifactInfo.getArtifactLabel())) {
583 ArtifactDataDefinition oldArtifactData = artifacts.get(artifactInfo.getArtifactLabel());
584 oldChecksum = oldArtifactData.getArtifactChecksum();
585 oldVersion = oldArtifactData.getArtifactVersion();
586 //duplicated flag didn't receive from UI, take from DB
587 artifactToUpdate.setDuplicated(oldArtifactData.getDuplicated());
590 artifactToUpdate.setDuplicated(Boolean.FALSE);
592 if (artifactToUpdate.getDuplicated()) {
593 String uniqueId = "";
594 if(type != NodeTypeEnum.ResourceInstance)
595 uniqueId = UniqueIdBuilder.buildPropertyUniqueId(componentId, artifactToUpdate.getArtifactLabel());
597 uniqueId = UniqueIdBuilder.buildInstanceArtifactUniqueId(componentId, instanceId, artifactToUpdate.getArtifactLabel());
599 artifactToUpdate.setUniqueId(uniqueId);
600 if (!isDeletePlaceholder)
601 artifactToUpdate.setEsId(uniqueId);
602 artifactToUpdate.setDuplicated(Boolean.FALSE);
606 updateUUID(artifactToUpdate, oldChecksum, oldVersion, isUpdate, edgeLabelEnum);
608 if (artifactInfo.getPayloadData() == null) {
609 if (!artifactToUpdate.getMandatory() || artifactToUpdate.getEsId() != null) {
610 artifactToUpdate.setEsId(artifactToUpdate.getUniqueId());
613 if (artifactToUpdate.getEsId() == null) {
614 artifactToUpdate.setEsId(artifactToUpdate.getUniqueId());
618 StorageOperationStatus status = StorageOperationStatus.OK;
619 if (edgeLabelEnum != EdgeLabelEnum.INST_DEPLOYMENT_ARTIFACTS && edgeLabelEnum != EdgeLabelEnum.INSTANCE_ARTIFACTS) {
620 List<ArtifactDataDefinition> toscaDataList = new ArrayList<>();
621 toscaDataList.add(artifactToUpdate);
623 if (isNeedToClone && artifacts != null) {
624 artifacts.values().stream().filter(a -> !a.getArtifactLabel().equals(artifactToUpdate.getArtifactLabel())).forEach(toscaDataList::add);
626 status = updateToscaDataOfToscaElement(componentId, edgeLabelEnum, vertexTypeEnum, toscaDataList, JsonPresentationFields.ARTIFACT_LABEL);
628 List<ArtifactDataDefinition> toscaDataList = new ArrayList<>();
629 toscaDataList.add(artifactToUpdate);
630 List<String> pathKeys = new ArrayList<>();
631 pathKeys.add(instanceId);
633 MapArtifactDataDefinition artifatcsOnInstance = artifactInst.get(instanceId);
634 if (artifatcsOnInstance != null) {
635 artifacts = artifatcsOnInstance.getMapToscaDataDefinition();
636 artifacts.put(artifactToUpdate.getArtifactLabel(), artifactToUpdate);
639 for (Entry<String, MapArtifactDataDefinition> e : artifactInst.entrySet()) {
640 List<ArtifactDataDefinition> toscaDataListPerInst = e.getValue().getMapToscaDataDefinition().values().stream().collect(Collectors.toList());
641 List<String> pathKeysPerInst = new ArrayList<>();
642 pathKeysPerInst.add(e.getKey());
643 status = updateToscaDataDeepElementsOfToscaElement(componentId, edgeLabelEnum, vertexTypeEnum, toscaDataListPerInst, pathKeysPerInst, JsonPresentationFields.ARTIFACT_LABEL);
644 if (status != StorageOperationStatus.OK) {
645 log.debug("Failed to update atifacts group for instance {} in component {} edge type {} error {}", instanceId, componentId, edgeLabelEnum, status);
646 res = Either.right(status);
651 status = updateToscaDataDeepElementsOfToscaElement(componentId, edgeLabelEnum, vertexTypeEnum, toscaDataList, pathKeys, JsonPresentationFields.ARTIFACT_LABEL);
654 if (status == StorageOperationStatus.OK)
655 res = Either.left(artifactToUpdate);
657 res = Either.right(status);
661 public void generateUUID(ArtifactDataDefinition artifactData, String oldVesrion) {
663 UUID uuid = UUID.randomUUID();
664 artifactData.setArtifactUUID(uuid.toString());
665 MDC.put("serviceInstanceID", uuid.toString());
666 updateVersionAndDate(artifactData, oldVesrion);
669 private void updateVersionAndDate(ArtifactDataDefinition artifactData, String oldVesrion) {
670 if (artifactData.getArtifactChecksum() != null) {
671 long time = System.currentTimeMillis();
672 artifactData.setPayloadUpdateDate(time);
674 int newVersion = new Integer(oldVesrion).intValue();
676 artifactData.setArtifactVersion(String.valueOf(newVersion));
679 public Either<ArtifactDataDefinition, StorageOperationStatus> removeArtifactOnGraph(ArtifactDefinition artifactFromGraph, String componentId, String instanceId, NodeTypeEnum type, boolean deleteMandatoryArtifact) {
681 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(artifactFromGraph.getArtifactGroupType(), type);
682 EdgeLabelEnum edgeLabelEnum = triple.getLeft();
683 VertexTypeEnum vertexTypeEnum = triple.getRight();
685 if (deleteMandatoryArtifact || !(artifactFromGraph.getMandatory() || artifactFromGraph.getServiceApi())) {
686 StorageOperationStatus status;
687 if (triple.getMiddle()) {
688 List<String> pathKeys = new ArrayList<>();
689 pathKeys.add(instanceId);
690 status = deleteToscaDataDeepElement(componentId, edgeLabelEnum, vertexTypeEnum, artifactFromGraph.getArtifactLabel(), pathKeys, JsonPresentationFields.ARTIFACT_LABEL);
692 status = deleteToscaDataElement(componentId, edgeLabelEnum, vertexTypeEnum, artifactFromGraph.getArtifactLabel(), JsonPresentationFields.ARTIFACT_LABEL);
694 if (status != StorageOperationStatus.OK)
695 return Either.right(status);
697 return Either.left(artifactFromGraph);
701 public Either<ArtifactDataDefinition, StorageOperationStatus> deleteArtifactWithCloningOnGraph(String componentId, ArtifactDefinition artifactToDelete, NodeTypeEnum type, String instanceId, boolean deleteMandatoryArtifact) {
703 Either<ArtifactDataDefinition, StorageOperationStatus> result = null;
704 Triple<EdgeLabelEnum, Boolean, VertexTypeEnum> triple = getEdgeLabelEnumFromArtifactGroupType(artifactToDelete.getArtifactGroupType(), type);
705 EdgeLabelEnum edgeLabel = triple.getLeft();
706 VertexTypeEnum vertexLabel = triple.getRight();
708 Boolean deleteElement = deleteMandatoryArtifact || !(artifactToDelete.getMandatory() || artifactToDelete.getServiceApi());
709 Map<String, ToscaDataDefinition> artifacts = null;
710 GraphVertex parentVertex = null;
711 Either<Map<String, ToscaDataDefinition>, JanusGraphOperationStatus> getArtifactsRes = null;
713 Either<GraphVertex, JanusGraphOperationStatus> getToscaElementRes = janusGraphDao
714 .getVertexById(componentId, JsonParseFlagEnum.NoParse);
715 if (getToscaElementRes.isRight()) {
716 CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to get tosca element {} upon getting tosca data from graph. Status is {}. ", componentId, getToscaElementRes.right().value());
717 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(getToscaElementRes.right().value()));
719 if (result == null) {
720 parentVertex = getToscaElementRes.left().value();
721 getArtifactsRes = this.getDataFromGraph(parentVertex, edgeLabel);
722 if (getArtifactsRes.isRight()) {
723 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(getArtifactsRes.right().value()));
726 if (result == null) {
727 artifacts = getArtifactsRes.left().value();
728 if (triple.getMiddle()) {
729 artifacts.values().forEach(ma -> ((MapArtifactDataDefinition) ma).getMapToscaDataDefinition().values().forEach(a -> a.setDuplicated(Boolean.TRUE)));
730 MapArtifactDataDefinition artifatcsOnInstance = (MapArtifactDataDefinition) artifacts.get(instanceId);
731 if (artifatcsOnInstance != null && deleteElement) {
732 artifatcsOnInstance.getMapToscaDataDefinition().remove(artifactToDelete.getArtifactLabel());
736 artifacts.remove(artifactToDelete.getArtifactLabel());
738 artifacts.values().stream().forEach(a -> ((ArtifactDataDefinition) a).setDuplicated(Boolean.TRUE));
740 artifactToDelete.setDuplicated(Boolean.TRUE);
742 if (artifacts != null) {
743 JanusGraphOperationStatus
744 status = janusGraphDao.deleteEdgeByDirection(parentVertex, Direction.OUT, edgeLabel);
745 if (status != JanusGraphOperationStatus.OK) {
746 result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
747 } else if (MapUtils.isNotEmpty(artifacts)) {
748 Either<GraphVertex, StorageOperationStatus> associateResult = associateElementToData(parentVertex, vertexLabel, edgeLabel, artifacts);
749 if (associateResult.isRight()) {
750 result = Either.right(associateResult.right().value());
754 if (result == null) {
755 result = Either.left(artifactToDelete);