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 com.google.common.collect.ImmutableList;
 
  24 import com.google.common.collect.ImmutableSet;
 
  25 import fj.data.Either;
 
  26 import java.util.ArrayList;
 
  27 import java.util.List;
 
  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.CINodeFilterDataDefinition;
 
  35 import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
 
  36 import org.openecomp.sdc.be.datatypes.elements.RequirementNodeFilterPropertyDataDefinition;
 
  37 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
 
  38 import org.openecomp.sdc.be.model.Component;
 
  39 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 
  40 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
 
  41 import org.openecomp.sdc.common.jsongraph.util.CommonUtility;
 
  42 import org.openecomp.sdc.common.log.wrappers.Logger;
 
  44 @org.springframework.stereotype.Component("node-filter-operations")
 
  45 public class NodeFilterOperation extends BaseOperation {
 
  47     private static Logger logger = Logger.getLogger(NodeFilterOperation.class);
 
  49     public Either<Set<String>, StorageOperationStatus> deleteNodeFilters(final Component component,
 
  50                                                                          final Set<String> componentInstanceIds) {
 
  51         final Either<GraphVertex, JanusGraphOperationStatus> getComponentVertex;
 
  52         final Either<GraphVertex, JanusGraphOperationStatus> getNodeFilterVertex;
 
  53         StorageOperationStatus status;
 
  55         getComponentVertex = janusGraphDao.getVertexById(component.getUniqueId(), JsonParseFlagEnum.NoParse);
 
  56         if (getComponentVertex.isRight()) {
 
  58                     DaoStatusConverter.convertJanusGraphStatusToStorageStatus(getComponentVertex.right().value()));
 
  60         getNodeFilterVertex = janusGraphDao.getChildVertex(getComponentVertex.left().value(),
 
  61             EdgeLabelEnum.NODE_FILTER_TEMPLATE, JsonParseFlagEnum.NoParse);
 
  62         if (getNodeFilterVertex.isLeft()) {
 
  63             status = deleteToscaDataElements(component.getUniqueId(), EdgeLabelEnum.NODE_FILTER_TEMPLATE,
 
  64                     new ArrayList<>(componentInstanceIds));
 
  65             if (status != StorageOperationStatus.OK) {
 
  66                 return Either.right(status);
 
  70         return Either.left(componentInstanceIds);
 
  74     public Either<String, StorageOperationStatus> deleteNodeFilter(final Component component,
 
  75                                                                    final String componentInstanceId) {
 
  76         final Either<Set<String>, StorageOperationStatus> listStorageOperationStatusEither =
 
  77                 deleteNodeFilters(component, ImmutableSet.of(componentInstanceId));
 
  78         if (listStorageOperationStatusEither.isRight()) {
 
  79             return Either.right(listStorageOperationStatusEither.right().value());
 
  81         return Either.left(componentInstanceId);
 
  85     public Either<CINodeFilterDataDefinition, StorageOperationStatus> createNodeFilter(final String componentId,
 
  86                                                                                        final String componentInstanceId) {
 
  87         CINodeFilterDataDefinition nodeFilterDataDefinition = new CINodeFilterDataDefinition();
 
  88         return addOrUpdateNodeFilter(false, componentId, componentInstanceId, nodeFilterDataDefinition);
 
  91     public Either<CINodeFilterDataDefinition, StorageOperationStatus> deleteConstraint(final String serviceId,
 
  92                                                                                        final String componentInstanceId,
 
  93                                                                                        final CINodeFilterDataDefinition nodeFilterDataDefinition,
 
  94                                                                                        final int propertyIndex) {
 
  95         ListDataDefinition<RequirementNodeFilterPropertyDataDefinition> properties =
 
  96                 nodeFilterDataDefinition.getProperties();
 
  97         properties.getListToscaDataDefinition().remove(propertyIndex);
 
  98         nodeFilterDataDefinition.setProperties(properties);
 
  99         return addOrUpdateNodeFilter(true, serviceId, componentInstanceId, nodeFilterDataDefinition);
 
 102     public Either<CINodeFilterDataDefinition, StorageOperationStatus> addNewProperty(
 
 103         final String componentId, final String componentInstanceId,
 
 104         final CINodeFilterDataDefinition nodeFilterDataDefinition,
 
 105         final RequirementNodeFilterPropertyDataDefinition requirementNodeFilterPropertyDataDefinition) {
 
 107         ListDataDefinition<RequirementNodeFilterPropertyDataDefinition> properties =
 
 108             nodeFilterDataDefinition.getProperties();
 
 109         if (properties == null) {
 
 110             properties = new ListDataDefinition<>();
 
 111             nodeFilterDataDefinition.setProperties(properties);
 
 113         properties.getListToscaDataDefinition().add(requirementNodeFilterPropertyDataDefinition);
 
 114         nodeFilterDataDefinition.setProperties(properties);
 
 115         return addOrUpdateNodeFilter(true, componentId, componentInstanceId, nodeFilterDataDefinition);
 
 118     public Either<CINodeFilterDataDefinition, StorageOperationStatus> updateProperties(
 
 119         final String serviceId, final String componentInstanceId,
 
 120         final CINodeFilterDataDefinition nodeFilterDataDefinition,
 
 121         final List<RequirementNodeFilterPropertyDataDefinition> requirementNodeFilterPropertyDataDefinition) {
 
 123         ListDataDefinition<RequirementNodeFilterPropertyDataDefinition> properties =
 
 124                 nodeFilterDataDefinition.getProperties();
 
 125         properties.getListToscaDataDefinition().clear();
 
 126         properties.getListToscaDataDefinition().addAll(requirementNodeFilterPropertyDataDefinition);
 
 127         nodeFilterDataDefinition.setProperties(properties);
 
 128         return addOrUpdateNodeFilter(true, serviceId, componentInstanceId, nodeFilterDataDefinition);
 
 131     public Either<CINodeFilterDataDefinition, StorageOperationStatus> updateNodeFilter(final String serviceId,
 
 132                                                                                        final String componentInstanceId,
 
 133                                                                                        final CINodeFilterDataDefinition ciNodeFilterDataDefinition) {
 
 134         return addOrUpdateNodeFilter(true, serviceId, componentInstanceId, ciNodeFilterDataDefinition);
 
 137     private Either<CINodeFilterDataDefinition, StorageOperationStatus> addOrUpdateNodeFilter(
 
 138         final boolean isUpdateAction, final String componentId, final String componentInstanceId,
 
 139         final CINodeFilterDataDefinition ciNodeFilterDataDefinition) {
 
 141         StorageOperationStatus statusRes;
 
 142         Either<GraphVertex, JanusGraphOperationStatus> getToscaElementRes;
 
 144         getToscaElementRes = janusGraphDao.getVertexById(componentId, JsonParseFlagEnum.NoParse);
 
 145         if (getToscaElementRes.isRight()) {
 
 146             JanusGraphOperationStatus status = getToscaElementRes.right().value();
 
 147             CommonUtility.addRecordToLog(logger, CommonUtility.LogLevelEnum.DEBUG,
 
 148                     "Failed to get tosca element {} upon adding the properties. Status is {}. ", componentId, status);
 
 149             statusRes = DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status);
 
 150             return Either.right(statusRes);
 
 152         GraphVertex serviceVertex = getToscaElementRes.left().value();
 
 153         ciNodeFilterDataDefinition.setID(componentInstanceId);
 
 154         statusRes = performUpdateToscaAction(isUpdateAction, serviceVertex, ImmutableList.of(ciNodeFilterDataDefinition));
 
 155         if (!statusRes.equals(StorageOperationStatus.OK)) {
 
 156             janusGraphDao.rollback();
 
 158                     " Failed to perform tosca update for node filter in service {} , component instance {}. status is {}",
 
 159                     componentId, componentInstanceId, statusRes);
 
 160             return Either.right(statusRes);
 
 162         janusGraphDao.commit();
 
 163         return Either.left(ciNodeFilterDataDefinition);
 
 166     private StorageOperationStatus performUpdateToscaAction(final boolean isUpdate,
 
 167                                                             final GraphVertex graphVertex,
 
 168                                                             final List<CINodeFilterDataDefinition> toscaDataList) {
 
 170             return updateToscaDataOfToscaElement(graphVertex, EdgeLabelEnum.NODE_FILTER_TEMPLATE,
 
 171                 VertexTypeEnum.NODE_FILTER_TEMPLATE, toscaDataList, JsonPresentationFields.UNIQUE_ID);
 
 173             return addToscaDataToToscaElement(graphVertex, EdgeLabelEnum.NODE_FILTER_TEMPLATE,
 
 174                 VertexTypeEnum.NODE_FILTER_TEMPLATE, toscaDataList, JsonPresentationFields.UNIQUE_ID);