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.operations.impl;
23 import com.thinkaurelius.titan.core.TitanGraph;
24 import com.thinkaurelius.titan.core.TitanVertex;
25 import fj.data.Either;
26 import org.apache.commons.collections.MapUtils;
27 import org.apache.commons.lang3.tuple.ImmutablePair;
28 import org.apache.tinkerpop.gremlin.structure.Vertex;
29 import org.openecomp.sdc.be.config.BeEcompErrorManager;
30 import org.openecomp.sdc.be.config.BeEcompErrorManager.ErrorSeverity;
31 import org.openecomp.sdc.be.dao.graph.datatype.GraphEdge;
32 import org.openecomp.sdc.be.dao.graph.datatype.GraphNode;
33 import org.openecomp.sdc.be.dao.graph.datatype.GraphRelation;
34 import org.openecomp.sdc.be.dao.neo4j.GraphEdgeLabels;
35 import org.openecomp.sdc.be.dao.neo4j.GraphPropertiesDictionary;
36 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
37 import org.openecomp.sdc.be.datatypes.elements.GroupInstanceDataDefinition;
38 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
39 import org.openecomp.sdc.be.datatypes.elements.SchemaDefinition;
40 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
41 import org.openecomp.sdc.be.model.*;
42 import org.openecomp.sdc.be.model.cache.ApplicationDataTypeCache;
43 import org.openecomp.sdc.be.model.operations.api.IGroupInstanceOperation;
44 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
45 import org.openecomp.sdc.be.model.tosca.ToscaPropertyType;
46 import org.openecomp.sdc.be.resources.data.*;
47 import org.openecomp.sdc.common.datastructure.Wrapper;
48 import org.openecomp.sdc.common.log.wrappers.Logger;
49 import org.springframework.beans.factory.annotation.Autowired;
52 import java.util.function.Supplier;
53 import java.util.stream.Collectors;
55 @org.springframework.stereotype.Component("group-instance-operation")
56 public class GroupInstanceOperation extends AbstractOperation implements IGroupInstanceOperation {
58 private static final String UPDATE_PROPERTY_VALUE_ON_COMPONENT_INSTANCE = "UpdatePropertyValueOnComponentInstance";
59 private static final String FAILED_TO_UPDATE_PROPERTY_VALUE_ON_INSTANCE_STATUS_IS = "Failed to update property value on instance. Status is ";
60 private static final Logger log = Logger.getLogger(GroupInstanceOperation.class.getName());
63 GroupOperation groupOperation;
66 PropertyOperation propertyOperation;
68 @javax.annotation.Resource
69 private ApplicationDataTypeCache dataTypeCache;
73 public Either<List<GroupInstance>, StorageOperationStatus> getAllGroupInstances(String parentId, NodeTypeEnum parentType) {
74 Either<List<GroupInstance>, StorageOperationStatus> result = null;
75 List<GroupInstance> groupInstanceRes = new ArrayList<>();
77 Either<TitanGraph, TitanOperationStatus> graph = titanGenericDao.getGraph();
78 if (graph.isRight()) {
79 log.debug("Failed to work with graph {}", graph.right().value());
80 return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(graph.right().value()));
82 TitanGraph tGraph = graph.left().value();
83 @SuppressWarnings("unchecked")
84 Iterable<TitanVertex> vertices = tGraph.query().has(UniqueIdBuilder.getKeyByNodeType(parentType), parentId).vertices();
85 if (vertices == null || vertices.iterator() == null || !vertices.iterator().hasNext()) {
86 log.debug("No nodes for type {} for id = {}", parentType, parentId);
87 result = Either.right(StorageOperationStatus.NOT_FOUND);
91 Iterator<TitanVertex> iterator = vertices.iterator();
92 Vertex vertex = iterator.next();
94 Map<String, Object> edgeProperties = null;
96 Either<List<ImmutablePair<GroupInstanceData, GraphEdge>>, TitanOperationStatus> childrenByEdgeCriteria = titanGenericDao.getChildrenByEdgeCriteria(vertex, parentId, GraphEdgeLabels.GROUP_INST, NodeTypeEnum.GroupInstance,
97 GroupInstanceData.class, edgeProperties);
99 if (childrenByEdgeCriteria.isRight()) {
100 TitanOperationStatus status = childrenByEdgeCriteria.right().value();
101 log.debug("Failed to find group instance {} on graph", childrenByEdgeCriteria.right().value());
103 if (status == TitanOperationStatus.NOT_FOUND) {
104 return Either.left(groupInstanceRes);
107 return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(status));
110 List<ImmutablePair<GroupInstanceData, GraphEdge>> list = childrenByEdgeCriteria.left().value();
112 for (ImmutablePair<GroupInstanceData, GraphEdge> pair : list) {
113 GroupInstanceData groupInstData = pair.getLeft();
114 GroupInstance groupInstance = new GroupInstance(groupInstData.getGroupDataDefinition());
115 String instOriginGroupId = groupInstance.getGroupUid();
116 Either<GroupDefinition, StorageOperationStatus> groupRes = groupOperation.getGroupFromGraph(instOriginGroupId, false, true, false);
118 if (groupRes.isRight()) {
119 return Either.right(groupRes.right().value());
122 GroupDefinition groupDefinition = groupRes.left().value();
123 Either<Map<String, PropertyValueData>, TitanOperationStatus> groupInstancePropertyValuesRes = getAllGroupInstancePropertyValuesData(groupInstData);
124 if(groupInstancePropertyValuesRes.isRight()){
125 return Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(groupInstancePropertyValuesRes.right().value()));
127 buildGroupInstanceFromGroup(groupInstance, groupDefinition, groupInstancePropertyValuesRes.left().value());
128 Either<List<ImmutablePair<String, String>>, TitanOperationStatus> artifactsRes = getGroupArtifactsPairs(groupInstance.getUniqueId());
129 if (artifactsRes.isRight()) {
130 TitanOperationStatus status = artifactsRes.right().value();
131 if (status != TitanOperationStatus.OK) {
132 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(status));
136 List<String> artifactsUid = new ArrayList<>();
137 List<String> artifactsUUID = new ArrayList<>();
139 List<ImmutablePair<String, String>> list1 = artifactsRes.left().value();
141 for (ImmutablePair<String, String> pair1 : list1) {
142 String uid = pair1.left;
143 String UUID = pair1.right;
144 artifactsUid.add(uid);
145 artifactsUUID.add(UUID);
147 groupInstance.setGroupInstanceArtifacts(artifactsUid);
148 groupInstance.setGroupInstanceArtifactsUuid(artifactsUUID);
152 groupInstanceRes.add(groupInstance);
153 log.debug("GroupInstance {} was added to list ", groupInstance.getUniqueId());
156 result = Either.left(groupInstanceRes);
162 public Either<Integer, StorageOperationStatus> increaseAndGetGroupInstancePropertyCounter(String instanceId) {
163 return propertyOperation.increaseAndGetObjInstancePropertyCounter(instanceId, NodeTypeEnum.GroupInstance);
167 public Either<ComponentInstanceProperty, StorageOperationStatus> addPropertyValueToGroupInstance(ComponentInstanceProperty groupInstanceProperty, String groupInstanceId, Integer index, boolean inTransaction) {
169 /// Ignore rules received from client till support
170 groupInstanceProperty.setRules(null);
174 Either<ComponentInstanceProperty, StorageOperationStatus> result = null;
178 Either<PropertyValueData, TitanOperationStatus> eitherStatus = addPropertyToGroupInstance(groupInstanceProperty, groupInstanceId, index);
180 if (eitherStatus.isRight()) {
181 log.error("Failed to add property value {} to resource instance {} in Graph. status is {}", groupInstanceProperty, groupInstanceId, eitherStatus.right().value().name());
182 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(eitherStatus.right().value()));
185 PropertyValueData propertyValueData = eitherStatus.left().value();
187 ComponentInstanceProperty propertyValueResult = propertyOperation.buildResourceInstanceProperty(propertyValueData, groupInstanceProperty);
188 log.debug("The returned GroupInstanceProperty is {}", propertyValueResult);
190 Either<String, TitanOperationStatus> findDefaultValue = propertyOperation.findDefaultValueFromSecondPosition(groupInstanceProperty.getPath(), groupInstanceProperty.getUniqueId(), groupInstanceProperty.getDefaultValue());
191 if (findDefaultValue.isRight()) {
192 result = Either.right(DaoStatusConverter.convertTitanStatusToStorageStatus(findDefaultValue.right().value()));
195 String defaultValue = findDefaultValue.left().value();
196 propertyValueResult.setDefaultValue(defaultValue);
197 log.debug("The returned default value in ResourceInstanceProperty is {}", defaultValue);
199 result = Either.left(propertyValueResult);
205 if (!inTransaction) {
206 if (result == null || result.isRight()) {
207 log.error("Going to execute rollback on graph.");
208 titanGenericDao.rollback();
210 log.debug("Going to execute commit on graph.");
211 titanGenericDao.commit();
219 public Either<ComponentInstanceProperty, StorageOperationStatus> updatePropertyValueInGroupInstance(ComponentInstanceProperty gropuInstanceProperty, String groupInstanceId, boolean inTransaction) {
220 // TODO Auto-generated method stub
221 // change Propety class
225 public void generateCustomizationUUID(GroupInstance groupInstance) {
226 UUID uuid = UUID.randomUUID();
227 groupInstance.setCustomizationUUID(uuid.toString());
231 * add property to resource instance
236 public Either<PropertyValueData, TitanOperationStatus> addPropertyToGroupInstance(ComponentInstanceProperty groupInstanceProperty, String groupInstanceId, Integer index) {
238 Either<GroupInstanceData, TitanOperationStatus> findResInstanceRes = titanGenericDao.getNode(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.GroupInstance), groupInstanceId, GroupInstanceData.class);
240 if (findResInstanceRes.isRight()) {
241 TitanOperationStatus status = findResInstanceRes.right().value();
242 if (status == TitanOperationStatus.NOT_FOUND) {
243 status = TitanOperationStatus.INVALID_ID;
245 return Either.right(status);
248 String propertyId = groupInstanceProperty.getUniqueId();
249 Either<PropertyData, TitanOperationStatus> findPropertyDefRes = titanGenericDao.getNode(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.Property), propertyId, PropertyData.class);
251 if (findPropertyDefRes.isRight()) {
252 TitanOperationStatus status = findPropertyDefRes.right().value();
253 if (status == TitanOperationStatus.NOT_FOUND) {
254 status = TitanOperationStatus.INVALID_ID;
256 return Either.right(status);
259 String valueUniqueUid = groupInstanceProperty.getValueUniqueUid();
260 if (valueUniqueUid == null) {
262 PropertyData propertyData = findPropertyDefRes.left().value();
263 GroupInstanceData resourceInstanceData = findResInstanceRes.left().value();
265 ImmutablePair<TitanOperationStatus, String> isPropertyValueExists = propertyOperation.findPropertyValue(groupInstanceId, propertyId);
266 if (isPropertyValueExists.getLeft() == TitanOperationStatus.ALREADY_EXIST) {
267 log.debug("The property {} already added to the resource instance {}", propertyId, groupInstanceId);
268 groupInstanceProperty.setValueUniqueUid(isPropertyValueExists.getRight());
269 Either<PropertyValueData, TitanOperationStatus> updatePropertyOfResourceInstance = updatePropertyOfGroupInstance(groupInstanceProperty, groupInstanceId);
270 if (updatePropertyOfResourceInstance.isRight()) {
271 BeEcompErrorManager.getInstance().logInternalFlowError(UPDATE_PROPERTY_VALUE_ON_COMPONENT_INSTANCE, FAILED_TO_UPDATE_PROPERTY_VALUE_ON_INSTANCE_STATUS_IS + updatePropertyOfResourceInstance.right().value(), ErrorSeverity.ERROR);
272 return Either.right(updatePropertyOfResourceInstance.right().value());
274 return Either.left(updatePropertyOfResourceInstance.left().value());
277 if (isPropertyValueExists.getLeft() != TitanOperationStatus.NOT_FOUND) {
278 log.debug("After finding property value of {} on componenet instance {}", propertyId, groupInstanceId);
279 return Either.right(isPropertyValueExists.getLeft());
282 String innerType = null;
284 PropertyDataDefinition propDataDef = propertyData.getPropertyDataDefinition();
285 String propertyType = propDataDef.getType();
286 String value = groupInstanceProperty.getValue();
287 ToscaPropertyType type = ToscaPropertyType.isValidType(propertyType);
289 if (type == ToscaPropertyType.LIST || type == ToscaPropertyType.MAP) {
290 SchemaDefinition def = propDataDef.getSchema();
292 log.debug("Schema doesn't exists for property of type {}", type);
293 return Either.right(TitanOperationStatus.ILLEGAL_ARGUMENT);
295 PropertyDataDefinition propDef = def.getProperty();
296 if (propDef == null) {
297 log.debug("Property in Schema Definition inside property of type {} doesn't exist", type);
298 return Either.right(TitanOperationStatus.ILLEGAL_ARGUMENT);
300 innerType = propDef.getType();
303 log.debug("Before validateAndUpdatePropertyValue");
304 Either<Map<String, DataTypeDefinition>, TitanOperationStatus> allDataTypes = dataTypeCache.getAll();
305 if (allDataTypes.isRight()) {
306 TitanOperationStatus status = allDataTypes.right().value();
307 BeEcompErrorManager.getInstance().logInternalFlowError(UPDATE_PROPERTY_VALUE_ON_COMPONENT_INSTANCE, FAILED_TO_UPDATE_PROPERTY_VALUE_ON_INSTANCE_STATUS_IS + status, ErrorSeverity.ERROR);
308 return Either.right(status);
310 Either<Object, Boolean> isValid = propertyOperation.validateAndUpdatePropertyValue(propertyType, value, innerType, allDataTypes.left().value());
311 log.debug("After validateAndUpdatePropertyValue. isValid = {}", isValid);
313 String newValue = value;
314 if (isValid.isRight()) {
315 Boolean res = isValid.right().value();
317 return Either.right(TitanOperationStatus.ILLEGAL_ARGUMENT);
320 Object object = isValid.left().value();
321 if (object != null) {
322 newValue = object.toString();
326 String uniqueId = UniqueIdBuilder.buildResourceInstancePropertyValueUid(resourceInstanceData.getUniqueId(), index);
327 PropertyValueData propertyValueData = new PropertyValueData();
328 propertyValueData.setUniqueId(uniqueId);
329 propertyValueData.setValue(newValue);
331 log.debug("Before validateAndUpdateRules");
332 ImmutablePair<String, Boolean> pair = propertyOperation.validateAndUpdateRules(propertyType, groupInstanceProperty.getRules(), innerType, allDataTypes.left().value(), false);
333 log.debug("After validateAndUpdateRules. pair = {}", pair);
334 if (pair.getRight() != null && !pair.getRight()) {
335 BeEcompErrorManager.getInstance().logBeInvalidValueError("Add property value", pair.getLeft(), groupInstanceProperty.getName(), propertyType);
336 return Either.right(TitanOperationStatus.ILLEGAL_ARGUMENT);
338 propertyOperation.addRulesToNewPropertyValue(propertyValueData, groupInstanceProperty, groupInstanceId);
340 log.debug("Before adding property value to graph {}", propertyValueData);
341 Either<PropertyValueData, TitanOperationStatus> createNodeResult = titanGenericDao.createNode(propertyValueData, PropertyValueData.class);
342 log.debug("After adding property value to graph {}", propertyValueData);
344 if (createNodeResult.isRight()) {
345 TitanOperationStatus operationStatus = createNodeResult.right().value();
346 return Either.right(operationStatus);
348 propertyValueData = createNodeResult.left().value();
350 Either<GraphRelation, TitanOperationStatus> createRelResult = titanGenericDao.createRelation(propertyValueData, propertyData, GraphEdgeLabels.PROPERTY_IMPL, null);
352 if (createRelResult.isRight()) {
353 TitanOperationStatus operationStatus = createRelResult.right().value();
354 log.error("Failed to associate property value {} to property {} in graph. status is {}", uniqueId, propertyId, operationStatus);
355 return Either.right(operationStatus);
358 createRelResult = titanGenericDao.createRelation(resourceInstanceData, propertyValueData, GraphEdgeLabels.PROPERTY_VALUE, null);
360 if (createRelResult.isRight()) {
361 TitanOperationStatus operationStatus = createRelResult.right().value();
362 log.error("Failed to associate resource instance {} property value {} in graph. status is {}", groupInstanceId, uniqueId, operationStatus);
363 return Either.right(operationStatus);
366 return Either.left(propertyValueData);
368 log.error("property value already exists.");
369 return Either.right(TitanOperationStatus.ALREADY_EXIST);
375 * update value of attribute on resource instance
379 public Either<PropertyValueData, TitanOperationStatus> updatePropertyOfGroupInstance(ComponentInstanceProperty groupInstanceProerty, String groupInstanceId) {
381 Wrapper<TitanOperationStatus> errorWrapper = new Wrapper<>();
382 UpdateDataContainer<PropertyData, PropertyValueData> updateDataContainer = new UpdateDataContainer<>(GraphEdgeLabels.PROPERTY_IMPL, (() -> PropertyData.class), (() -> PropertyValueData.class), NodeTypeEnum.Property,
383 NodeTypeEnum.PropertyValue);
385 preUpdateElementOfResourceInstanceValidations(updateDataContainer, groupInstanceProerty, groupInstanceId, errorWrapper);
386 if (!errorWrapper.isEmpty()) {
387 return Either.right(errorWrapper.getInnerElement());
391 String value = groupInstanceProerty.getValue();
392 // Specific Validation Logic
393 PropertyData propertyData = updateDataContainer.getDataWrapper().getInnerElement();
395 String innerType = null;
397 PropertyDataDefinition propDataDef = propertyData.getPropertyDataDefinition();
398 String propertyType = propDataDef.getType();
399 ToscaPropertyType type = ToscaPropertyType.isValidType(propertyType);
400 log.debug("The type of the property {} is {}", propertyData.getUniqueId(), propertyType);
402 if (type == ToscaPropertyType.LIST || type == ToscaPropertyType.MAP) {
403 SchemaDefinition def = propDataDef.getSchema();
405 log.debug("Schema doesn't exists for property of type {}", type);
406 return Either.right(TitanOperationStatus.ILLEGAL_ARGUMENT);
408 PropertyDataDefinition propDef = def.getProperty();
409 if (propDef == null) {
410 log.debug("Property in Schema Definition inside property of type {} doesn't exist", type);
411 return Either.right(TitanOperationStatus.ILLEGAL_ARGUMENT);
413 innerType = propDef.getType();
415 // Specific Update Logic
416 Either<Map<String, DataTypeDefinition>, TitanOperationStatus> allDataTypes = dataTypeCache.getAll();
417 if (allDataTypes.isRight()) {
418 TitanOperationStatus status = allDataTypes.right().value();
419 BeEcompErrorManager.getInstance().logInternalFlowError(UPDATE_PROPERTY_VALUE_ON_COMPONENT_INSTANCE, FAILED_TO_UPDATE_PROPERTY_VALUE_ON_INSTANCE_STATUS_IS + status, ErrorSeverity.ERROR);
420 return Either.right(status);
422 Either<Object, Boolean> isValid = propertyOperation.validateAndUpdatePropertyValue(propertyType, value, innerType, allDataTypes.left().value());
424 String newValue = value;
425 if (isValid.isRight()) {
426 Boolean res = isValid.right().value();
428 return Either.right(TitanOperationStatus.ILLEGAL_ARGUMENT);
431 Object object = isValid.left().value();
432 if (object != null) {
433 newValue = object.toString();
436 PropertyValueData propertyValueData = updateDataContainer.getValueDataWrapper().getInnerElement();
437 log.debug("Going to update property value from {} to {}", propertyValueData.getValue(), newValue);
438 propertyValueData.setValue(newValue);
440 ImmutablePair<String, Boolean> pair = propertyOperation.validateAndUpdateRules(propertyType, groupInstanceProerty.getRules(), innerType, allDataTypes.left().value(), true);
441 if (pair.getRight() != null && !pair.getRight()) {
442 BeEcompErrorManager.getInstance().logBeInvalidValueError("Add property value", pair.getLeft(), groupInstanceProerty.getName(), propertyType);
443 return Either.right(TitanOperationStatus.ILLEGAL_ARGUMENT);
445 propertyOperation.updateRulesInPropertyValue(propertyValueData, groupInstanceProerty, groupInstanceId);
447 Either<PropertyValueData, TitanOperationStatus> updateRes = titanGenericDao.updateNode(propertyValueData, PropertyValueData.class);
448 if (updateRes.isRight()) {
449 TitanOperationStatus status = updateRes.right().value();
450 return Either.right(status);
452 return Either.left(updateRes.left().value());
458 private static final class UpdateDataContainer<SomeData, SomeValueData> {
459 final Wrapper<SomeValueData> valueDataWrapper;
460 final Wrapper<SomeData> dataWrapper;
461 final GraphEdgeLabels graphEdge;
462 final Supplier<Class<SomeData>> someDataClassGen;
463 final Supplier<Class<SomeValueData>> someValueDataClassGen;
464 final NodeTypeEnum nodeType;
465 final NodeTypeEnum nodeTypeValue;
467 private UpdateDataContainer(GraphEdgeLabels graphEdge, Supplier<Class<SomeData>> someDataClassGen, Supplier<Class<SomeValueData>> someValueDataClassGen, NodeTypeEnum nodeType, NodeTypeEnum nodeTypeValue) {
469 this.valueDataWrapper = new Wrapper<>();
470 this.dataWrapper = new Wrapper<>();
471 this.graphEdge = graphEdge;
472 this.someDataClassGen = someDataClassGen;
473 this.someValueDataClassGen = someValueDataClassGen;
474 this.nodeType = nodeType;
475 this.nodeTypeValue = nodeTypeValue;
478 public Wrapper<SomeValueData> getValueDataWrapper() {
479 return valueDataWrapper;
482 public Wrapper<SomeData> getDataWrapper() {
486 public GraphEdgeLabels getGraphEdge() {
490 public Supplier<Class<SomeData>> getSomeDataClassGen() {
491 return someDataClassGen;
494 public Supplier<Class<SomeValueData>> getSomeValueDataClassGen() {
495 return someValueDataClassGen;
498 public NodeTypeEnum getNodeType() {
502 public NodeTypeEnum getNodeTypeValue() {
503 return nodeTypeValue;
507 private <SomeData extends GraphNode, SomeValueData extends GraphNode> void preUpdateElementOfResourceInstanceValidations(UpdateDataContainer<SomeData, SomeValueData> updateDataContainer, IComponentInstanceConnectedElement resourceInstanceProerty,
508 String resourceInstanceId, Wrapper<TitanOperationStatus> errorWrapper) {
510 if (errorWrapper.isEmpty()) {
511 // Verify VFC instance Exist
512 validateGIExist(resourceInstanceId, errorWrapper);
515 if (errorWrapper.isEmpty()) {
516 // Example: Verify Property connected to VFC exist
517 validateElementConnectedToComponentExist(updateDataContainer, resourceInstanceProerty, errorWrapper);
520 if (errorWrapper.isEmpty()) {
521 // Example: Verify PropertyValue connected to VFC Instance exist
522 validateElementConnectedToComponentInstanceExist(updateDataContainer, resourceInstanceProerty, errorWrapper);
525 if (errorWrapper.isEmpty()) {
526 // Example: Verify PropertyValue connected Property
527 validateElementConnectedToInstance(updateDataContainer, resourceInstanceProerty, errorWrapper);
531 private <SomeData extends GraphNode, SomeValueData extends GraphNode> void validateElementConnectedToInstance(UpdateDataContainer<SomeData, SomeValueData> updateDataContainer, IComponentInstanceConnectedElement resourceInstanceProerty,
532 Wrapper<TitanOperationStatus> errorWrapper) {
533 Either<ImmutablePair<SomeData, GraphEdge>, TitanOperationStatus> child = titanGenericDao.getChild(UniqueIdBuilder.getKeyByNodeType(updateDataContainer.getNodeTypeValue()), resourceInstanceProerty.getValueUniqueUid(),
534 updateDataContainer.getGraphEdge(), updateDataContainer.getNodeType(), updateDataContainer.getSomeDataClassGen().get());
536 if (child.isRight()) {
537 TitanOperationStatus status = child.right().value();
538 if (status == TitanOperationStatus.NOT_FOUND) {
539 status = TitanOperationStatus.INVALID_ID;
541 errorWrapper.setInnerElement(status);
544 updateDataContainer.getDataWrapper().setInnerElement(child.left().value().left);
548 private <SomeValueData extends GraphNode, SomeData extends GraphNode> void validateElementConnectedToComponentInstanceExist(UpdateDataContainer<SomeData, SomeValueData> updateDataContainer,
549 IComponentInstanceConnectedElement resourceInstanceProerty, Wrapper<TitanOperationStatus> errorWrapper) {
550 String valueUniqueUid = resourceInstanceProerty.getValueUniqueUid();
551 if (valueUniqueUid == null) {
552 errorWrapper.setInnerElement(TitanOperationStatus.INVALID_ID);
554 Either<SomeValueData, TitanOperationStatus> findPropertyValueRes = titanGenericDao.getNode(UniqueIdBuilder.getKeyByNodeType(updateDataContainer.getNodeTypeValue()), valueUniqueUid, updateDataContainer.getSomeValueDataClassGen().get());
555 if (findPropertyValueRes.isRight()) {
556 TitanOperationStatus status = findPropertyValueRes.right().value();
557 if (status == TitanOperationStatus.NOT_FOUND) {
558 status = TitanOperationStatus.INVALID_ID;
560 errorWrapper.setInnerElement(status);
562 updateDataContainer.getValueDataWrapper().setInnerElement(findPropertyValueRes.left().value());
567 private <SomeData extends GraphNode, SomeValueData extends GraphNode> void validateElementConnectedToComponentExist(UpdateDataContainer<SomeData, SomeValueData> updateDataContainer,
568 IComponentInstanceConnectedElement resourceInstanceElementConnected, Wrapper<TitanOperationStatus> errorWrapper) {
569 String uniqueId = resourceInstanceElementConnected.getUniqueId();
570 Either<SomeData, TitanOperationStatus> findPropertyDefRes = titanGenericDao.getNode(UniqueIdBuilder.getKeyByNodeType(updateDataContainer.getNodeType()), uniqueId, updateDataContainer.getSomeDataClassGen().get());
572 if (findPropertyDefRes.isRight()) {
573 TitanOperationStatus status = findPropertyDefRes.right().value();
574 errorWrapper.setInnerElement(status);
578 private void validateGIExist(String resourceInstanceId, Wrapper<TitanOperationStatus> errorWrapper) {
579 validateGIExist(resourceInstanceId, null, errorWrapper);
582 private void validateGIExist(String resourceInstanceId, Wrapper<GroupInstanceData> compInsDataWrapper, Wrapper<TitanOperationStatus> errorWrapper) {
583 validateElementExistInGraph(resourceInstanceId, NodeTypeEnum.GroupInstance, () -> GroupInstanceData.class, compInsDataWrapper, errorWrapper);
586 public <ElementData extends GraphNode> void validateElementExistInGraph(String elementUniqueId, NodeTypeEnum elementNodeType, Supplier<Class<ElementData>> elementClassGen, Wrapper<ElementData> elementDataWrapper,
587 Wrapper<TitanOperationStatus> errorWrapper) {
588 Either<ElementData, TitanOperationStatus> findResInstanceRes = titanGenericDao.getNode(UniqueIdBuilder.getKeyByNodeType(elementNodeType), elementUniqueId, elementClassGen.get());
589 if (findResInstanceRes.isRight()) {
590 TitanOperationStatus status = findResInstanceRes.right().value();
591 if (status == TitanOperationStatus.NOT_FOUND) {
592 status = TitanOperationStatus.INVALID_ID;
594 errorWrapper.setInnerElement(status);
596 if (elementDataWrapper != null) {
597 elementDataWrapper.setInnerElement(findResInstanceRes.left().value());
602 private void buildGroupInstanceFromGroup(GroupInstance groupInstance, GroupDefinition groupDefinition, Map<String, PropertyValueData> groupInstancePropertyValues) {
604 groupInstance.setGroupName(groupDefinition.getName());
605 groupInstance.setInvariantUUID(groupDefinition.getInvariantUUID());
606 groupInstance.setDescription(groupDefinition.getDescription());
607 groupInstance.setVersion(groupDefinition.getVersion());
608 groupInstance.setArtifacts(groupDefinition.getArtifacts());
609 groupInstance.setArtifactsUuid(groupDefinition.getArtifactsUuid());
610 groupInstance.setType(groupDefinition.getType());
611 groupInstance.setGroupUUID(groupDefinition.getGroupUUID());
613 List<GroupInstanceProperty> groupInstanceProperties = groupDefinition.convertToGroupProperties()
614 //converts List of GroupProperties to List of GroupInstanceProperties and updates it with group instance property data
615 .stream().map(p -> getUpdatedConvertedProperty(p, groupInstancePropertyValues)).collect(Collectors.toList());
616 groupInstance.convertFromGroupInstancesProperties(groupInstanceProperties);
619 private GroupInstanceProperty getUpdatedConvertedProperty(GroupProperty groupProperty, Map<String, PropertyValueData> groupInstancePropertyValues){
621 GroupInstanceProperty updatedProperty = new GroupInstanceProperty(groupProperty, groupProperty.getValue());
622 if(!MapUtils.isEmpty(groupInstancePropertyValues) && groupInstancePropertyValues.containsKey(groupProperty.getName())){
623 PropertyValueData groupInstancePropertyValue = groupInstancePropertyValues.get(groupProperty.getName());
624 updatedProperty.setValue(groupInstancePropertyValue.getValue());
625 updatedProperty.setValueUniqueUid(groupInstancePropertyValue.getUniqueId());
627 return updatedProperty;
630 private Either<List<ImmutablePair<String, String>>, TitanOperationStatus> getGroupArtifactsPairs(String groupUniqueId) {
632 Either<List<ImmutablePair<String, String>>, TitanOperationStatus> result = null;
634 Either<List<ImmutablePair<ArtifactData, GraphEdge>>, TitanOperationStatus> childrenNodes = titanGenericDao.getChildrenNodes(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.GroupInstance), groupUniqueId, GraphEdgeLabels.GROUP_ARTIFACT_REF,
635 NodeTypeEnum.ArtifactRef, ArtifactData.class);
636 if (childrenNodes.isRight()) {
637 TitanOperationStatus status = childrenNodes.right().value();
638 if (status == TitanOperationStatus.NOT_FOUND) {
639 status = TitanOperationStatus.OK;
641 result = Either.right(status);
645 List<ImmutablePair<String, String>> artifactsList = new ArrayList<>();
646 List<ImmutablePair<ArtifactData, GraphEdge>> list = childrenNodes.left().value();
648 for (ImmutablePair<ArtifactData, GraphEdge> pair : list) {
649 ArtifactData artifactData = pair.getKey();
650 String uniqueId = artifactData.getArtifactDataDefinition().getUniqueId();
651 String UUID = artifactData.getArtifactDataDefinition().getArtifactUUID();
652 ImmutablePair<String, String> artifact = new ImmutablePair<>(uniqueId, UUID);
653 artifactsList.add(artifact);
657 log.debug("The artifacts list related to group {} is {}",groupUniqueId,artifactsList);
658 result = Either.left(artifactsList);
666 public StorageOperationStatus dissociateAndAssociateGroupsInstanceFromArtifact(String componentId, NodeTypeEnum componentTypeEnum, String oldArtifactId, ArtifactData newArtifact) {
668 return this.dissociateAndAssociateGroupsInstanceFromArtifactOnGraph(componentId, componentTypeEnum, oldArtifactId, newArtifact);
672 private StorageOperationStatus dissociateAndAssociateGroupsInstanceFromArtifactOnGraph(String componentId, NodeTypeEnum componentTypeEnum, String oldArtifactId, ArtifactData newArtifact) {
674 Either<List<GroupInstance>, StorageOperationStatus> allGroupsFromGraph = getAllGroupInstances(componentId, componentTypeEnum);
675 if (allGroupsFromGraph.isRight()) {
676 return allGroupsFromGraph.right().value();
679 List<GroupInstance> allGroups = allGroupsFromGraph.left().value();
680 if (allGroups == null || allGroups.isEmpty()) {
681 return StorageOperationStatus.OK;
684 // Find all groups which contains this artifact id
685 List<GroupInstance> associatedGroups = allGroups.stream().filter(p -> p.getGroupInstanceArtifacts() != null && p.getGroupInstanceArtifacts().contains(oldArtifactId)).collect(Collectors.toList());
687 if (associatedGroups != null && !associatedGroups.isEmpty()) {
689 log.debug("The groups {} contains the artifact {}",associatedGroups.stream().map(GroupInstanceDataDefinition::getName).collect(Collectors.toList()),oldArtifactId);
691 UniqueIdData oldArtifactData = new UniqueIdData(NodeTypeEnum.ArtifactRef, oldArtifactId);
692 UniqueIdData newArtifactData = new UniqueIdData(NodeTypeEnum.ArtifactRef, newArtifact.getArtifactDataDefinition().getUniqueId());
693 Map<String, Object> props = new HashMap<>();
694 props.put(GraphPropertiesDictionary.NAME.getProperty(), newArtifactData.getLabel());
696 for (GroupInstance groupDefinition : associatedGroups) {
697 UniqueIdData groupData = new UniqueIdData(NodeTypeEnum.GroupInstance, groupDefinition.getUniqueId());
699 Either<GraphRelation, TitanOperationStatus> deleteRelation = titanGenericDao.deleteRelation(groupData, oldArtifactData, GraphEdgeLabels.GROUP_ARTIFACT_REF);
700 log.trace("After dissociate group {} from artifact {}", groupDefinition.getName(), oldArtifactId);
701 if (deleteRelation.isRight()) {
702 TitanOperationStatus status = deleteRelation.right().value();
703 if (status == TitanOperationStatus.NOT_FOUND) {
704 status = TitanOperationStatus.INVALID_ID;
706 return DaoStatusConverter.convertTitanStatusToStorageStatus(status);
709 Either<GraphRelation, TitanOperationStatus> createRelation = titanGenericDao.createRelation(groupData, newArtifactData, GraphEdgeLabels.GROUP_ARTIFACT_REF, props);
710 log.trace("After associate group {} to artifact {}", groupDefinition.getName(), newArtifact.getUniqueIdKey());
711 if (createRelation.isRight()) {
712 TitanOperationStatus status = createRelation.right().value();
713 if (status == TitanOperationStatus.NOT_FOUND) {
714 status = TitanOperationStatus.INVALID_ID;
716 return DaoStatusConverter.convertTitanStatusToStorageStatus(status);
721 return StorageOperationStatus.OK;
724 private Either<Map<String, PropertyValueData>, TitanOperationStatus> getAllGroupInstancePropertyValuesData(GroupInstanceData groupInstData) {
726 Either<Map<String, PropertyValueData>, TitanOperationStatus> result = null;
728 Either<List<ImmutablePair<PropertyValueData, GraphEdge>>, TitanOperationStatus> getPropertyValueChildrenRes =
729 titanGenericDao.getChildrenNodes(GraphPropertiesDictionary.UNIQUE_ID.getProperty(), groupInstData.getUniqueId(), GraphEdgeLabels.PROPERTY_VALUE,
730 NodeTypeEnum.PropertyValue, PropertyValueData.class, true);
731 if(getPropertyValueChildrenRes.isRight()){
732 TitanOperationStatus status = getPropertyValueChildrenRes.right().value();
733 log.debug("Failed to fetch property value nodes for group instance {}. Status is {}. ", groupInstData.getName(), status);
734 if(status == TitanOperationStatus.NOT_FOUND){
735 result = Either.left(null);
737 result = Either.right(status);
740 result = Either.left(getPropertyValueChildrenRes.left().value().stream()
741 .collect(Collectors.toMap(pair->(String)(pair.getRight().getProperties().get(GraphPropertiesDictionary.PROPERTY_NAME.getProperty())), ImmutablePair::getLeft)));
743 } catch(Exception e){
744 log.debug("The Exception occured during fetch group instance () property values. The message is {}. ", groupInstData.getName(), e.getMessage(), e);
746 result = Either.right(TitanOperationStatus.GENERAL_ERROR);