Support TOSCA functions in sub properties
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / impl / ComponentNodeFilterBusinessLogic.java
index de6836d..65b5794 100644 (file)
  *  SPDX-License-Identifier: Apache-2.0
  *  ============LICENSE_END=========================================================
  */
-
 package org.openecomp.sdc.be.components.impl;
 
 import static org.openecomp.sdc.common.log.enums.EcompLoggerErrorCode.BUSINESS_PROCESS_ERROR;
 
 import fj.data.Either;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Optional;
-import java.util.stream.Collectors;
 import org.openecomp.sdc.be.components.impl.exceptions.BusinessLogicException;
+import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
+import org.openecomp.sdc.be.components.impl.utils.CINodeFilterUtils;
 import org.openecomp.sdc.be.components.impl.utils.NodeFilterConstraintAction;
 import org.openecomp.sdc.be.components.validation.NodeFilterValidator;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.datamodel.utils.ConstraintConvertor;
 import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.RequirementNodeFilterCapabilityDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.RequirementNodeFilterPropertyDataDefinition;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.NodeFilterConstraintType;
 import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.ComponentInstance;
+import org.openecomp.sdc.be.model.ComponentInstanceProperty;
+import org.openecomp.sdc.be.model.UploadNodeFilterInfo;
 import org.openecomp.sdc.be.model.User;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
@@ -46,6 +55,7 @@ import org.openecomp.sdc.be.model.operations.api.IGroupOperation;
 import org.openecomp.sdc.be.model.operations.api.IGroupTypeOperation;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
+import org.openecomp.sdc.be.ui.model.UIConstraint;
 import org.openecomp.sdc.be.user.Role;
 import org.openecomp.sdc.common.log.wrappers.Logger;
 import org.openecomp.sdc.exception.ResponseFormat;
@@ -55,32 +65,25 @@ import org.springframework.beans.factory.annotation.Autowired;
 public class ComponentNodeFilterBusinessLogic extends BaseBusinessLogic {
 
     private static final Logger LOGGER = Logger.getLogger(ComponentNodeFilterBusinessLogic.class.getName());
-
     private final NodeFilterOperation nodeFilterOperation;
     private final NodeFilterValidator nodeFilterValidator;
 
     @Autowired
-    public ComponentNodeFilterBusinessLogic(final IElementOperation elementDao,
-                                            final IGroupOperation groupOperation,
-                                            final IGroupInstanceOperation groupInstanceOperation,
-                                            final IGroupTypeOperation groupTypeOperation,
+    public ComponentNodeFilterBusinessLogic(final IElementOperation elementDao, final IGroupOperation groupOperation,
+                                            final IGroupInstanceOperation groupInstanceOperation, final IGroupTypeOperation groupTypeOperation,
                                             final InterfaceOperation interfaceOperation,
                                             final InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
-                                            final ArtifactsOperations artifactToscaOperation,
-                                            final NodeFilterOperation nodeFilterOperation,
+                                            final ArtifactsOperations artifactToscaOperation, final NodeFilterOperation nodeFilterOperation,
                                             final NodeFilterValidator nodeFilterValidator) {
-        super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, interfaceOperation,
-            interfaceLifecycleTypeOperation, artifactToscaOperation);
+        super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, interfaceOperation, interfaceLifecycleTypeOperation,
+            artifactToscaOperation);
         this.nodeFilterOperation = nodeFilterOperation;
         this.nodeFilterValidator = nodeFilterValidator;
     }
 
-    public Optional<CINodeFilterDataDefinition> createNodeFilterIfNotExist(final String componentId,
-                                                                           final String componentInstanceId,
-                                                                           final boolean shouldLock,
-                                                                           final ComponentTypeEnum componentTypeEnum)
+    public Optional<CINodeFilterDataDefinition> createNodeFilterIfNotExist(final String componentId, final String componentInstanceId,
+                                                                           final boolean shouldLock, final ComponentTypeEnum componentTypeEnum)
         throws BusinessLogicException {
-
         final Component component = getComponent(componentId);
         final Optional<ComponentInstance> componentInstance = getComponentInstance(componentInstanceId, component);
         Optional<CINodeFilterDataDefinition> filterDataDefinition = getCiNodeFilterDataDefinition(componentInstance);
@@ -91,28 +94,24 @@ public class ComponentNodeFilterBusinessLogic extends BaseBusinessLogic {
         boolean wasLocked = false;
         try {
             if (shouldLock) {
-                lockComponent(component.getUniqueId(), component,"Create Node Filter on component");
+                lockComponent(component.getUniqueId(), component, "Create Node Filter on component");
                 wasLocked = true;
             }
             result = nodeFilterOperation.createNodeFilter(componentId, componentInstanceId);
             if (result.isRight()) {
                 janusGraphDao.rollback();
-                LOGGER.error(BUSINESS_PROCESS_ERROR,
-                    "Failed to Create Node filter on component with id {}", componentId);
-                throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
-                    .convertFromStorageResponse(result.right().value()), component.getSystemName()));
+                LOGGER.error(BUSINESS_PROCESS_ERROR, "Failed to Create Node filter on component with id {}", componentId);
+                throw new BusinessLogicException(componentsUtils
+                    .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(result.right().value()), component.getSystemName()));
             } else {
                 filterDataDefinition = Optional.ofNullable(result.left().value());
             }
             janusGraphDao.commit();
             LOGGER.debug("Node filter successfully created in component {} . ", component.getSystemName());
-
         } catch (final Exception e) {
             janusGraphDao.rollback();
-            LOGGER.error(BUSINESS_PROCESS_ERROR,
-                "Exception occurred during add Component node filter property values: {}", e.getMessage(), e);
+            LOGGER.error(BUSINESS_PROCESS_ERROR, "Exception occurred during add Component node filter property values: {}", e.getMessage(), e);
             throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
-
         } finally {
             if (wasLocked) {
                 unlockComponent(component.getUniqueId(), componentTypeEnum);
@@ -121,41 +120,32 @@ public class ComponentNodeFilterBusinessLogic extends BaseBusinessLogic {
         return filterDataDefinition;
     }
 
-    public Optional<String> deleteNodeFilterIfExists(final String componentId,
-                                                     final String componentInstanceId,
-                                                     final boolean shouldLock,
-                                                     final ComponentTypeEnum componentTypeEnum)
-        throws BusinessLogicException {
-
+    public Optional<String> deleteNodeFilterIfExists(final String componentId, final String componentInstanceId, final boolean shouldLock,
+                                                     final ComponentTypeEnum componentTypeEnum) throws BusinessLogicException {
         final Component component = getComponent(componentId);
-        final Optional<CINodeFilterDataDefinition> nodeFilterDataDefinition =
-            getCiNodeFilterDataDefinition(componentInstanceId, component);
+        final Optional<CINodeFilterDataDefinition> nodeFilterDataDefinition = getCiNodeFilterDataDefinition(componentInstanceId, component);
         if (!nodeFilterDataDefinition.isPresent()) {
             return Optional.ofNullable(componentInstanceId);
         }
-
         final Either<String, StorageOperationStatus> result;
         boolean wasLocked = false;
         try {
             if (shouldLock) {
-                lockComponent(component.getUniqueId(), component,"Delete Node Filter from component");
+                lockComponent(component.getUniqueId(), component, "Delete Node Filter from component");
                 wasLocked = true;
             }
             result = nodeFilterOperation.deleteNodeFilter(component, componentInstanceId);
             if (result.isRight()) {
-                LOGGER.error(BUSINESS_PROCESS_ERROR,
-                    "Failed to delete node filter in component {}. Response is {}. ", component.getName(),
+                LOGGER.error(BUSINESS_PROCESS_ERROR, "Failed to delete node filter in component {}. Response is {}. ", component.getName(),
                     result.right().value());
                 janusGraphDao.rollback();
-                throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
-                    .convertFromStorageResponse(result.right().value()), component.getSystemName()));
+                throw new BusinessLogicException(componentsUtils
+                    .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(result.right().value()), component.getSystemName()));
             }
             janusGraphDao.commit();
             LOGGER.debug("Node filter successfully deleted in component {} . ", component.getSystemName());
-
         } catch (final Exception e) {
-            LOGGER.error(BUSINESS_PROCESS_ERROR,"Exception occurred during delete deleting node filter: {}",
-                e.getMessage(), e);
+            LOGGER.error(BUSINESS_PROCESS_ERROR, "Exception occurred during delete deleting node filter: {}", e.getMessage(), e);
             janusGraphDao.rollback();
             throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
         } finally {
@@ -166,49 +156,52 @@ public class ComponentNodeFilterBusinessLogic extends BaseBusinessLogic {
         return Optional.ofNullable(result.left().value());
     }
 
+    private String getComponentInstancePropertyType(Component component, String componentInstanceId, String propertyName) {
+        List<ComponentInstanceProperty> componentInstanceProperties = component.getComponentInstancesProperties().get(componentInstanceId);
+        if (!componentInstanceProperties.isEmpty()) {
+            for (ComponentInstanceProperty componentInstanceProperty : componentInstanceProperties) {
+                if (componentInstanceProperty.getName().equals(propertyName)) {
+                    return componentInstanceProperty.getType();
+                }
+            }
+        }
+        return null;
+    }
 
-
-    public Optional<CINodeFilterDataDefinition> addNodeFilter(final String componentId,
-                                                              final String componentInstanceId,
-                                                              final NodeFilterConstraintAction action,
-                                                              final String propertyName,
-                                                              final String constraint,
-                                                              final boolean shouldLock,
-                                                              final ComponentTypeEnum componentTypeEnum)
+    public Optional<CINodeFilterDataDefinition> addNodeFilter(final String componentId, final String componentInstanceId,
+                                                              final NodeFilterConstraintAction action, final String propertyName,
+                                                              final String constraint, final boolean shouldLock,
+                                                              final ComponentTypeEnum componentTypeEnum,
+                                                              final NodeFilterConstraintType nodeFilterConstraintType, final String capabilityName)
         throws BusinessLogicException {
-
         final Component component = getComponent(componentId);
-        CINodeFilterDataDefinition nodeFilterDataDefinition = validateAndReturnNodeFilterDefinition(componentInstanceId,
-            action, constraint, component);
+        CINodeFilterDataDefinition nodeFilterDataDefinition = validateAndReturnNodeFilterDefinition(componentInstanceId, action, constraint,
+            component, nodeFilterConstraintType, capabilityName);
         boolean wasLocked = false;
         try {
             if (shouldLock) {
-                lockComponent(component.getUniqueId(), component,"Add Node Filter on Component");
+                lockComponent(component.getUniqueId(), component, "Add Node Filter on Component");
                 wasLocked = true;
             }
-            final RequirementNodeFilterPropertyDataDefinition newProperty =
-                new RequirementNodeFilterPropertyDataDefinition();
-            newProperty.setName(propertyName);
-            newProperty.setConstraints(Collections.singletonList(constraint));
-            final Either<CINodeFilterDataDefinition, StorageOperationStatus> result = nodeFilterOperation
-                .addNewProperty(componentId, componentInstanceId, nodeFilterDataDefinition, newProperty);
-
+            final RequirementNodeFilterPropertyDataDefinition requirementNodeFilterPropertyDataDefinition = new RequirementNodeFilterPropertyDataDefinition();
+            requirementNodeFilterPropertyDataDefinition.setName(propertyName);
+            requirementNodeFilterPropertyDataDefinition.setConstraints(Collections.singletonList(constraint));
+            requirementNodeFilterPropertyDataDefinition.setType(getComponentInstancePropertyType(component, componentInstanceId, propertyName));
+            final Either<CINodeFilterDataDefinition, StorageOperationStatus> result = addNewNodeFilter(componentId, componentInstanceId,
+                nodeFilterConstraintType, nodeFilterDataDefinition, requirementNodeFilterPropertyDataDefinition, capabilityName);
             if (result.isRight()) {
                 janusGraphDao.rollback();
-                throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
-                    .convertFromStorageResponse(result.right().value()), component.getSystemName()));
+                throw new BusinessLogicException(componentsUtils
+                    .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(result.right().value()), component.getSystemName()));
             } else {
                 nodeFilterDataDefinition = result.left().value();
             }
             janusGraphDao.commit();
             LOGGER.debug("Node filter successfully created in component {} . ", component.getSystemName());
-
         } catch (final Exception e) {
             janusGraphDao.rollback();
-            LOGGER.error(BUSINESS_PROCESS_ERROR,
-                "Exception occurred during add component node filter property values: {}", e.getMessage(), e);
+            LOGGER.error(BUSINESS_PROCESS_ERROR, "Exception occurred during add component node filter property values: {}", e.getMessage(), e);
             throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
-
         } finally {
             if (wasLocked) {
                 unlockComponent(component.getUniqueId(), componentTypeEnum);
@@ -217,42 +210,35 @@ public class ComponentNodeFilterBusinessLogic extends BaseBusinessLogic {
         return Optional.ofNullable(nodeFilterDataDefinition);
     }
 
-    public Optional<CINodeFilterDataDefinition> deleteNodeFilter(final String componentId,
-                                                                 final String componentInstanceId,
-                                                                 final NodeFilterConstraintAction action,
-                                                                 final String constraint,
-                                                                 final int position,
-                                                                 final boolean shouldLock,
-                                                                 final ComponentTypeEnum componentTypeEnum)
+    public Optional<CINodeFilterDataDefinition> deleteNodeFilter(final String componentId, final String componentInstanceId,
+                                                                 final NodeFilterConstraintAction action, final String constraint, final int position,
+                                                                 final boolean shouldLock, final ComponentTypeEnum componentTypeEnum,
+                                                                 final NodeFilterConstraintType nodeFilterConstraintType)
         throws BusinessLogicException {
-
         final Component component = getComponent(componentId);
-        CINodeFilterDataDefinition nodeFilterDataDefinition =
-            validateAndReturnNodeFilterDefinition(componentInstanceId, action, constraint, component);
+        CINodeFilterDataDefinition nodeFilterDataDefinition = validateAndReturnNodeFilterDefinition(componentInstanceId, action, constraint,
+            component, nodeFilterConstraintType, "");
         boolean wasLocked = false;
         try {
             if (shouldLock) {
-                lockComponent(component.getUniqueId(), component,"Add Node Filter on Component");
+                lockComponent(component.getUniqueId(), component, "Add Node Filter on Component");
                 wasLocked = true;
             }
             final Either<CINodeFilterDataDefinition, StorageOperationStatus> result = nodeFilterOperation
-                .deleteConstraint(componentId, componentInstanceId, nodeFilterDataDefinition, position);
+                .deleteConstraint(componentId, componentInstanceId, nodeFilterDataDefinition, position, nodeFilterConstraintType);
             if (result.isRight()) {
                 janusGraphDao.rollback();
-                throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
-                    .convertFromStorageResponse(result.right().value()), component.getSystemName()));
+                throw new BusinessLogicException(componentsUtils
+                    .getResponseFormatByResource(componentsUtils.convertFromStorageResponse(result.right().value()), component.getSystemName()));
             } else {
                 nodeFilterDataDefinition = result.left().value();
             }
             janusGraphDao.commit();
             LOGGER.debug("Node filter successfully deleted in component {} . ", component.getSystemName());
-
         } catch (final Exception e) {
             janusGraphDao.rollback();
-            LOGGER.error(BUSINESS_PROCESS_ERROR,
-                "Exception occurred during delete component node filter property values: {}", e.getMessage(), e);
+            LOGGER.error(BUSINESS_PROCESS_ERROR, "Exception occurred during delete component node filter property values: {}", e.getMessage(), e);
             throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
-
         } finally {
             if (wasLocked) {
                 unlockComponent(component.getUniqueId(), componentTypeEnum);
@@ -261,69 +247,26 @@ public class ComponentNodeFilterBusinessLogic extends BaseBusinessLogic {
         return Optional.ofNullable(nodeFilterDataDefinition);
     }
 
-    public Optional<CINodeFilterDataDefinition> updateNodeFilter(final String componentId,
-                                                                 final String componentInstanceId,
-                                                                 final List<String> constraints,
-                                                                 final boolean shouldLock,
-                                                                 final ComponentTypeEnum componentTypeEnum)
-        throws BusinessLogicException {
-
-        final Component component = getComponent(componentId);
-
-        final Either<Boolean, ResponseFormat> response = nodeFilterValidator
-            .validateFilter(component, componentInstanceId, constraints, NodeFilterConstraintAction.UPDATE);
-        if (response.isRight()) {
-            throw new BusinessLogicException(componentsUtils
-                .getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND, response.right().value().getFormattedMessage()));
-        }
-        final Optional<ComponentInstance> componentInstance = getComponentInstance(componentInstanceId,
-            component);
-        if (!componentInstance.isPresent()) {
-            throw new BusinessLogicException(ResponseFormatManager.getInstance()
-                .getResponseFormat(ActionStatus.GENERAL_ERROR));
+    private Either<CINodeFilterDataDefinition, StorageOperationStatus> addNewNodeFilter(final String componentId, final String componentInstanceId,
+                                                                                        final NodeFilterConstraintType nodeFilterConstraintType,
+                                                                                        final CINodeFilterDataDefinition nodeFilterDataDefinition,
+                                                                                        final RequirementNodeFilterPropertyDataDefinition requirementNodeFilterPropertyDataDefinition,
+                                                                                        final String capabilityName) {
+        if (NodeFilterConstraintType.PROPERTIES.equals(nodeFilterConstraintType)) {
+            return nodeFilterOperation
+                .addNewProperty(componentId, componentInstanceId, nodeFilterDataDefinition, requirementNodeFilterPropertyDataDefinition);
         }
-        CINodeFilterDataDefinition nodeFilterDataDefinition = componentInstance.get().getNodeFilter();
-        if (nodeFilterDataDefinition == null) {
-            throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND));
-        }
-        boolean wasLocked = false;
-        try {
-            if (shouldLock) {
-                lockComponent(component.getUniqueId(), component,"Update Node Filter on Component");
-                wasLocked = true;
-            }
-            final List<RequirementNodeFilterPropertyDataDefinition> properties = constraints.stream()
-                .map(this::getRequirementNodeFilterPropertyDataDefinition).collect(Collectors.toList());
-            final Either<CINodeFilterDataDefinition, StorageOperationStatus> result = nodeFilterOperation
-                .updateProperties(componentId, componentInstanceId, nodeFilterDataDefinition, properties);
-
-            if (result.isRight()) {
-                janusGraphDao.rollback();
-                throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils
-                    .convertFromStorageResponse(result.right().value()), component.getSystemName()));
-            } else {
-                nodeFilterDataDefinition = result.left().value();
-            }
-            janusGraphDao.commit();
-            LOGGER.debug("Node filter successfully updated in component {} . ", component.getSystemName());
-
-        } catch (final Exception e) {
-            janusGraphDao.rollback();
-            LOGGER.error(BUSINESS_PROCESS_ERROR,
-                "Exception occurred during update component node filter property values: {}",
-                e.getMessage(), e);
-            throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
-
-        } finally {
-            if (wasLocked) {
-                unlockComponent(component.getUniqueId(), componentTypeEnum);
-            }
-        }
-        return Optional.ofNullable(nodeFilterDataDefinition);
+        final RequirementNodeFilterCapabilityDataDefinition requirementNodeFilterCapabilityDataDefinition = new RequirementNodeFilterCapabilityDataDefinition();
+        requirementNodeFilterCapabilityDataDefinition.setName(capabilityName);
+        final ListDataDefinition<RequirementNodeFilterPropertyDataDefinition> propertyDataDefinitionListDataDefinition = new ListDataDefinition<>();
+        propertyDataDefinitionListDataDefinition.getListToscaDataDefinition()
+            .addAll(Collections.singleton(requirementNodeFilterPropertyDataDefinition));
+        requirementNodeFilterCapabilityDataDefinition.setProperties(propertyDataDefinitionListDataDefinition);
+        return nodeFilterOperation
+            .addNewCapabilities(componentId, componentInstanceId, nodeFilterDataDefinition, requirementNodeFilterCapabilityDataDefinition);
     }
 
-    private void unlockComponent(final String componentUniqueId,
-                                 final ComponentTypeEnum componentType) {
+    private void unlockComponent(final String componentUniqueId, final ComponentTypeEnum componentType) {
         graphLockOperation.unlockComponent(componentUniqueId, componentType.getNodeType());
     }
 
@@ -333,29 +276,23 @@ public class ComponentNodeFilterBusinessLogic extends BaseBusinessLogic {
         return user;
     }
 
-    private Optional<ComponentInstance> getComponentInstance(final String componentInstanceId,
-                                                             final Component component) {
+    private Optional<ComponentInstance> getComponentInstance(final String componentInstanceId, final Component component) {
         return component.getComponentInstanceById(componentInstanceId);
     }
 
-    private Optional<CINodeFilterDataDefinition> getCiNodeFilterDataDefinition(
-        final Optional<ComponentInstance> componentInstance) {
-
+    private Optional<CINodeFilterDataDefinition> getCiNodeFilterDataDefinition(final Optional<ComponentInstance> componentInstance) {
         if (componentInstance.isPresent()) {
             return Optional.ofNullable(componentInstance.get().getNodeFilter());
         }
         return Optional.empty();
     }
 
-    private Optional<CINodeFilterDataDefinition> getCiNodeFilterDataDefinition(final String componentInstanceId,
-                                                                               final Component component)
+    private Optional<CINodeFilterDataDefinition> getCiNodeFilterDataDefinition(final String componentInstanceId, final Component component)
         throws BusinessLogicException {
-
-        final Either<Boolean, ResponseFormat> response = nodeFilterValidator
-            .validateComponentInstanceExist(component, componentInstanceId);
+        final Either<Boolean, ResponseFormat> response = nodeFilterValidator.validateComponentInstanceExist(component, componentInstanceId);
         if (response.isRight()) {
-            throw new BusinessLogicException(componentsUtils
-                .getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND, response.right().value().getFormattedMessage()));
+            throw new BusinessLogicException(
+                componentsUtils.getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND, response.right().value().getFormattedMessage()));
         }
         final Optional<ComponentInstance> componentInstance = getComponentInstance(componentInstanceId, component);
         if (componentInstance.isPresent()) {
@@ -364,38 +301,128 @@ public class ComponentNodeFilterBusinessLogic extends BaseBusinessLogic {
         return Optional.empty();
     }
 
-    private RequirementNodeFilterPropertyDataDefinition getRequirementNodeFilterPropertyDataDefinition(
-        final String constraint) {
-
-        final RequirementNodeFilterPropertyDataDefinition pdd = new RequirementNodeFilterPropertyDataDefinition();
-        pdd.setConstraints(Arrays.asList(constraint));
-        return pdd;
-    }
-
     private CINodeFilterDataDefinition validateAndReturnNodeFilterDefinition(final String componentInstanceId,
-                                                                             final NodeFilterConstraintAction action,
-                                                                             final String constraint,
-                                                                             final Component component)
+                                                                             final NodeFilterConstraintAction action, final String constraint,
+                                                                             final Component component,
+                                                                             final NodeFilterConstraintType nodeFilterConstraintType,
+                                                                             final String capabilityName)
         throws BusinessLogicException {
-
-        validateNodeFilter(component, componentInstanceId, action, constraint);
-        final Optional<CINodeFilterDataDefinition> cINodeFilterDataDefinition = getCiNodeFilterDataDefinition(
-            componentInstanceId, component);
+        validateNodeFilter(component, componentInstanceId, action, constraint, nodeFilterConstraintType, capabilityName);
+        final Optional<CINodeFilterDataDefinition> cINodeFilterDataDefinition = getCiNodeFilterDataDefinition(componentInstanceId, component);
         if (!cINodeFilterDataDefinition.isPresent()) {
             throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND));
         }
         return cINodeFilterDataDefinition.get();
     }
 
-    private void validateNodeFilter(final Component component,
-                                    final String componentInstanceId,
-                                    final NodeFilterConstraintAction action,
-                                    final String constraint) throws BusinessLogicException {
+    private void validateNodeFilter(final Component component, final String componentInstanceId, final NodeFilterConstraintAction action,
+                                    final String constraint, final NodeFilterConstraintType nodeFilterConstraintType, final String capabilityName) throws BusinessLogicException {
         final Either<Boolean, ResponseFormat> response = nodeFilterValidator
-            .validateFilter(component, componentInstanceId, Collections.singletonList(constraint), action);
+            .validateFilter(component, componentInstanceId, Collections.singletonList(constraint), action, nodeFilterConstraintType, capabilityName);
         if (response.isRight()) {
-            throw new BusinessLogicException(componentsUtils
-                .getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND, response.right().value().getFormattedMessage()));
+            throw new BusinessLogicException(
+                componentsUtils.getResponseFormat(ActionStatus.NODE_FILTER_NOT_FOUND, response.right().value().getFormattedMessage()));
+        }
+    }
+
+    public Optional<CINodeFilterDataDefinition> updateNodeFilter(final String componentId, final String componentInstanceId,
+                                                                 final UIConstraint uiConstraint, final ComponentTypeEnum componentTypeEnum,
+                                                                 final NodeFilterConstraintType nodeFilterConstraintType, final int index)
+        throws BusinessLogicException {
+        final Optional<CINodeFilterDataDefinition> deleteActionResponse = deleteNodeFilter(componentId, componentInstanceId,
+            NodeFilterConstraintAction.DELETE, null, index, true, componentTypeEnum, nodeFilterConstraintType);
+        if (!deleteActionResponse.isPresent()) {
+            throw new BusinessLogicException(
+                componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR, "Failed to delete node filter capabilities"));
+        }
+        return addNodeFilter(componentId.toLowerCase(), componentInstanceId, NodeFilterConstraintAction.ADD, uiConstraint.getServicePropertyName(),
+            new ConstraintConvertor().convert(uiConstraint), true, componentTypeEnum, nodeFilterConstraintType,
+            uiConstraint.getCapabilityName());
+    }
+
+    public StorageOperationStatus associateNodeFilterToComponentInstance(final String componentId,
+                                                                         final Map<String, UploadNodeFilterInfo> instNodeFilter) {
+        for (Entry<String, UploadNodeFilterInfo> filter : instNodeFilter.entrySet()) {
+            String componentInstanceId = filter.getKey();
+            CINodeFilterDataDefinition ciNodeFilterDataDefinition = new CINodeFilterUtils()
+                .getNodeFilterDataDefinition(filter.getValue(), componentInstanceId);
+            Either<CINodeFilterDataDefinition, StorageOperationStatus> nodeFilter = nodeFilterOperation.createNodeFilter(componentId,
+                componentInstanceId);
+            if (nodeFilter.isRight()) {
+                LOGGER.error(BUSINESS_PROCESS_ERROR, "Failed to Create Node filter on component instance with id {}",
+                    filter.getKey());
+                return nodeFilter.right().value();
+            }
+
+            //associate node filter properties to component instance
+            List<RequirementNodeFilterPropertyDataDefinition> properties = ciNodeFilterDataDefinition.getProperties()
+                .getListToscaDataDefinition();
+            if (!properties.isEmpty()) {
+                final Component component;
+                try {
+                    component = getComponent(componentId);
+                } catch (BusinessLogicException e) {
+                    throw new ComponentException(e.getResponseFormat());
+                }
+                properties.forEach(property -> {
+                    String propertyType = getComponentInstancePropertyType(component, componentInstanceId, property.getName());
+                    RequirementNodeFilterPropertyDataDefinition requirementNodeFilterPropertyDataDefinition =
+                        getRequirementNodeFilterPropertyDataDefinition(property);
+                    requirementNodeFilterPropertyDataDefinition.setType(propertyType);
+                    Either<CINodeFilterDataDefinition, StorageOperationStatus> nodeFilterProperty = nodeFilterOperation
+                        .addNewProperty(componentId, componentInstanceId, nodeFilter.left().value(), requirementNodeFilterPropertyDataDefinition);
+                    if (nodeFilterProperty.isRight()) {
+                        throw new ComponentException(
+                            componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(nodeFilterProperty.right().value()),
+                                componentInstanceId));
+                    }
+                });
+            }
+
+            //associate node filter capabilities to component instance
+            List<RequirementNodeFilterCapabilityDataDefinition> capabilities = ciNodeFilterDataDefinition.getCapabilities()
+                .getListToscaDataDefinition();
+            if (!capabilities.isEmpty()) {
+                capabilities.forEach(capability -> {
+                    RequirementNodeFilterCapabilityDataDefinition requirementNodeFilterCapabilityDataDefinition =
+                        new RequirementNodeFilterCapabilityDataDefinition();
+                    requirementNodeFilterCapabilityDataDefinition.setName(capability.getName());
+                    requirementNodeFilterCapabilityDataDefinition.setProperties(getProperties(capability.getProperties()));
+                    Either<CINodeFilterDataDefinition, StorageOperationStatus> nodeFilterCapability = nodeFilterOperation
+                        .addNewCapabilities(componentId, componentInstanceId, nodeFilter.left().value(),
+                            requirementNodeFilterCapabilityDataDefinition);
+                    if (nodeFilterCapability.isRight()) {
+                        throw new ComponentException(
+                            componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(nodeFilterCapability.right().value()),
+                                componentInstanceId));
+                    }
+                });
+            }
         }
+        return StorageOperationStatus.OK;
+    }
+
+    private List<String> getNodeFilterConstraints(String name, List<String> value) {
+        List<String> constraints = new ArrayList<>();
+        constraints.add(name + ":\n " + value.get(0));
+        return constraints;
+    }
+
+    private ListDataDefinition<RequirementNodeFilterPropertyDataDefinition> getProperties(ListDataDefinition<RequirementNodeFilterPropertyDataDefinition> properties) {
+        ListDataDefinition<RequirementNodeFilterPropertyDataDefinition> updatedProperties = new ListDataDefinition<>();
+        properties.getListToscaDataDefinition().forEach(property -> {
+            RequirementNodeFilterPropertyDataDefinition requirementNodeFilterPropertyDataDefinition = getRequirementNodeFilterPropertyDataDefinition(
+                property);
+            updatedProperties.add(requirementNodeFilterPropertyDataDefinition);
+        });
+        return updatedProperties;
+    }
+
+    private RequirementNodeFilterPropertyDataDefinition getRequirementNodeFilterPropertyDataDefinition(
+        RequirementNodeFilterPropertyDataDefinition property) {
+        RequirementNodeFilterPropertyDataDefinition requirementNodeFilterPropertyDataDefinition = new RequirementNodeFilterPropertyDataDefinition();
+        requirementNodeFilterPropertyDataDefinition.setName(property.getName());
+        requirementNodeFilterPropertyDataDefinition.setConstraints(getNodeFilterConstraints(property.getName(), property.getConstraints()));
+        return requirementNodeFilterPropertyDataDefinition;
     }
-}
\ No newline at end of file
+}