From a5a46f26d043b70cd9a44fed05b0e8ba184318fb Mon Sep 17 00:00:00 2001 From: KrupaNagabhushan Date: Thu, 17 Sep 2020 15:11:30 +0100 Subject: Fix for substitution filter properties Issue-ID: SDC-3325 Change-Id: If26bf895a0a2f914fb9c2b36e53466df9b7999fe Signed-off-by: KrupaNagabhushan --- .../ComponentSubstitutionFilterBusinessLogic.java | 141 +++-------- .../components/validation/NodeFilterValidator.java | 173 ++++++++++---- .../datamodel/utils/UiComponentDataConverter.java | 9 +- .../ComponentSubstitutionFilterServlet.java | 72 ++++-- .../openecomp/sdc/be/tosca/ToscaExportHandler.java | 38 +-- .../tosca/utils/SubstitutionFilterConverter.java | 62 ++++- ...mponentSubstitutionFilterBusinessLogicTest.java | 261 ++++++--------------- .../ComponentSubstitutionFilterServletTest.java | 102 +++----- 8 files changed, 391 insertions(+), 467 deletions(-) (limited to 'catalog-be/src') diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentSubstitutionFilterBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentSubstitutionFilterBusinessLogic.java index 55c70ed271..74de13c952 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentSubstitutionFilterBusinessLogic.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentSubstitutionFilterBusinessLogic.java @@ -36,7 +36,6 @@ import org.openecomp.sdc.be.datatypes.elements.RequirementSubstitutionFilterProp import org.openecomp.sdc.be.datatypes.elements.SubstitutionFilterDataDefinition; import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum; import org.openecomp.sdc.be.model.Component; -import org.openecomp.sdc.be.model.ComponentInstance; 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; @@ -69,7 +68,8 @@ public class ComponentSubstitutionFilterBusinessLogic extends BaseBusinessLogic final InterfaceLifecycleOperation interfaceLifecycleTypeOperation, final ArtifactsOperations artifactToscaOperation, final SubstitutionFilterOperation substitutionFilterOperation, - final NodeFilterValidator nodeFilterValidator) { + NodeFilterValidator nodeFilterValidator) + { super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, interfaceOperation, interfaceLifecycleTypeOperation, artifactToscaOperation); this.substitutionFilterOperation = substitutionFilterOperation; @@ -77,21 +77,14 @@ public class ComponentSubstitutionFilterBusinessLogic extends BaseBusinessLogic } public Optional createSubstitutionFilterIfNotExist(final String componentId, - final String componentInstanceId, final boolean shouldLock, final ComponentTypeEnum componentTypeEnum) - throws BusinessLogicException { + throws BusinessLogicException { final Component component = getComponent(componentId); - final Optional componentInstanceOptional = - getComponentInstance(componentInstanceId, component); - - Optional substitutionFilterDataDefinition; - if (componentInstanceOptional.isPresent()) { - substitutionFilterDataDefinition = getSubstitutionFilterDataDefinition(componentInstanceOptional.get()); - if (substitutionFilterDataDefinition.isPresent()) { - return substitutionFilterDataDefinition; - } + Optional substitutionFilterDataDefinition = Optional.ofNullable(component.getSubstitutionFilter()); + if (substitutionFilterDataDefinition.isPresent()) { + return substitutionFilterDataDefinition; } boolean wasLocked = false; try { @@ -100,24 +93,22 @@ public class ComponentSubstitutionFilterBusinessLogic extends BaseBusinessLogic wasLocked = true; } final Either result = substitutionFilterOperation - .createSubstitutionFilter(componentId, componentInstanceId); + .createSubstitutionFilter(componentId); if (result.isRight()) { janusGraphDao.rollback(); LOGGER.error(BUSINESS_PROCESS_ERROR, - "Failed to Create Substitution filter on component with id {}", componentId); + "Failed to Create Substitution filter on component with id {}", componentId); throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils - .convertFromStorageResponse(result.right().value()), component.getSystemName())); + .convertFromStorageResponse(result.right().value()), component.getSystemName())); } substitutionFilterDataDefinition = Optional.ofNullable(result.left().value()); - if (componentInstanceOptional.isPresent() && substitutionFilterDataDefinition.isPresent()) { - componentInstanceOptional.get().setSubstitutionFilter(substitutionFilterDataDefinition.get()); - } + component.setSubstitutionFilter(substitutionFilterDataDefinition.get()); janusGraphDao.commit(); LOGGER.debug("Substitution filter successfully created in component {} . ", component.getSystemName()); } catch (final Exception e) { janusGraphDao.rollback(); LOGGER.error(BUSINESS_PROCESS_ERROR, - "Exception occurred during add Component Substitution filter property values: {}", e.getMessage(), e); + "Exception occurred during add Component Substitution filter property values: {}", e.getMessage(), e); throw new BusinessLogicException(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)); } finally { @@ -130,8 +121,6 @@ public class ComponentSubstitutionFilterBusinessLogic extends BaseBusinessLogic } public Optional addSubstitutionFilter(final String componentId, - final String componentInstanceId, - final NodeFilterConstraintAction action, final String propertyName, final String constraint, final boolean shouldLock, @@ -139,9 +128,14 @@ public class ComponentSubstitutionFilterBusinessLogic extends BaseBusinessLogic throws BusinessLogicException { final Component component = getComponent(componentId); - SubstitutionFilterDataDefinition substitutionFilterDataDefinition = validateAndReturnSubstitutionFilterDefinition( - componentInstanceId, - action, constraint, component); + + final Either response = nodeFilterValidator + .validateComponentFilter(component, Collections.singletonList(constraint), NodeFilterConstraintAction.ADD); + if (response.isRight()) { + throw new BusinessLogicException(componentsUtils + .getResponseFormat(ActionStatus.SUBSTITUTION_FILTER_NOT_FOUND, response.right().value().getFormattedMessage())); + } + boolean wasLocked = false; try { if (shouldLock) { @@ -152,19 +146,19 @@ public class ComponentSubstitutionFilterBusinessLogic extends BaseBusinessLogic new RequirementSubstitutionFilterPropertyDataDefinition(); newProperty.setName(propertyName); newProperty.setConstraints(Collections.singletonList(constraint)); - final Either result = substitutionFilterOperation - .addNewProperty(componentId, componentInstanceId, substitutionFilterDataDefinition, newProperty); + final Either resultEither = + substitutionFilterOperation + .addPropertyFilter(componentId, component.getSubstitutionFilter(), newProperty); - if (result.isRight()) { + if (resultEither.isRight()) { janusGraphDao.rollback(); throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils - .convertFromStorageResponse(result.right().value()), component.getSystemName())); - } else { - substitutionFilterDataDefinition = result.left().value(); + .convertFromStorageResponse(resultEither.right().value()), component.getSystemName())); } + janusGraphDao.commit(); LOGGER.debug("Substitution filter successfully created in component {} . ", component.getSystemName()); - + return Optional.ofNullable(resultEither.left().value()); } catch (final Exception e) { janusGraphDao.rollback(); LOGGER.error(BUSINESS_PROCESS_ERROR, @@ -176,11 +170,10 @@ public class ComponentSubstitutionFilterBusinessLogic extends BaseBusinessLogic unlockComponent(component.getUniqueId(), componentTypeEnum); } } - return Optional.ofNullable(substitutionFilterDataDefinition); + } public Optional updateSubstitutionFilter(final String componentId, - final String componentInstanceId, final List constraints, final boolean shouldLock, final ComponentTypeEnum componentTypeEnum) @@ -189,19 +182,13 @@ public class ComponentSubstitutionFilterBusinessLogic extends BaseBusinessLogic final Component component = getComponent(componentId); final Either response = nodeFilterValidator - .validateFilter(component, componentInstanceId, constraints, NodeFilterConstraintAction.UPDATE); + .validateComponentFilter(component, constraints, NodeFilterConstraintAction.UPDATE); if (response.isRight()) { throw new BusinessLogicException(componentsUtils - .getResponseFormat(SUBSTITUTION_FILTER_NOT_FOUND, response.right().value().getFormattedMessage())); - } - final Optional componentInstance = getComponentInstance(componentInstanceId, - component); - if (!componentInstance.isPresent()) { - throw new BusinessLogicException(ResponseFormatManager.getInstance() - .getResponseFormat(ActionStatus.GENERAL_ERROR)); + .getResponseFormat(ActionStatus.SUBSTITUTION_FILTER_NOT_FOUND, response.right().value().getFormattedMessage())); } - SubstitutionFilterDataDefinition substitutionFilterDataDefinition = componentInstance.get() - .getSubstitutionFilter(); + + SubstitutionFilterDataDefinition substitutionFilterDataDefinition = component.getSubstitutionFilter(); if (substitutionFilterDataDefinition == null) { throw new BusinessLogicException(componentsUtils.getResponseFormat(SUBSTITUTION_FILTER_NOT_FOUND)); } @@ -212,9 +199,9 @@ public class ComponentSubstitutionFilterBusinessLogic extends BaseBusinessLogic wasLocked = true; } final List properties = constraints.stream() - .map(this::getRequirementSubstitutionFilterPropertyDataDefinition).collect(Collectors.toList()); + .map(this::getRequirementSubstitutionFilterPropertyDataDefinition).collect(Collectors.toList()); final Either result = substitutionFilterOperation - .updateSubstitutionFilter(componentId, componentInstanceId, substitutionFilterDataDefinition, properties); + .updateProperties(componentId, substitutionFilterDataDefinition, properties); if (result.isRight()) { janusGraphDao.rollback(); @@ -241,17 +228,13 @@ public class ComponentSubstitutionFilterBusinessLogic extends BaseBusinessLogic } public Optional deleteSubstitutionFilter(final String componentId, - final String componentInstanceId, - final NodeFilterConstraintAction action, - final String constraint, final int position, final boolean shouldLock, final ComponentTypeEnum componentTypeEnum) throws BusinessLogicException { final Component component = getComponent(componentId); - SubstitutionFilterDataDefinition substitutionFilterDataDefinition = - validateAndReturnSubstitutionFilterDefinition(componentInstanceId, action, constraint, component); + SubstitutionFilterDataDefinition substitutionFilterDataDefinition = component.getSubstitutionFilter(); boolean wasLocked = false; try { if (shouldLock) { @@ -259,7 +242,7 @@ public class ComponentSubstitutionFilterBusinessLogic extends BaseBusinessLogic wasLocked = true; } final Either result = substitutionFilterOperation - .deleteConstraint(componentId, componentInstanceId, substitutionFilterDataDefinition, position); + .deleteConstraint(componentId, substitutionFilterDataDefinition, position); if (result.isRight()) { janusGraphDao.rollback(); throw new BusinessLogicException(componentsUtils.getResponseFormatByResource(componentsUtils @@ -285,17 +268,6 @@ public class ComponentSubstitutionFilterBusinessLogic extends BaseBusinessLogic return Optional.ofNullable(substitutionFilterDataDefinition); } - private Optional getSubstitutionFilterDataDefinition( - final ComponentInstance componentInstance) { - - final SubstitutionFilterDataDefinition substitutionFilterDataDefinition = - componentInstance.getSubstitutionFilter(); - if (componentInstance.getSubstitutionFilter() != null) { - return Optional.ofNullable(substitutionFilterDataDefinition); - } - return Optional.empty(); - } - private void unlockComponent(final String componentUniqueId, final ComponentTypeEnum componentType) { graphLockOperation.unlockComponent(componentUniqueId, componentType.getNodeType()); @@ -307,47 +279,6 @@ public class ComponentSubstitutionFilterBusinessLogic extends BaseBusinessLogic return user; } - private Optional getComponentInstance(final String componentInstanceId, - final Component component) { - return component.getComponentInstanceById(componentInstanceId); - } - - private Optional getComponentInstanceSubstitutionFilterDataDefinition( - final String componentInstanceId, final Component component) - throws BusinessLogicException { - - if (nodeFilterValidator.validateComponentInstanceExist(component, componentInstanceId).isRight()) { - throw new BusinessLogicException(componentsUtils - .getResponseFormat(SUBSTITUTION_FILTER_NOT_FOUND)); - } - return getComponentInstance(componentInstanceId, component).map(ComponentInstance::getSubstitutionFilter); - } - - private SubstitutionFilterDataDefinition validateAndReturnSubstitutionFilterDefinition( - final String componentInstanceId, final NodeFilterConstraintAction action, final String constraint, - final Component component) throws BusinessLogicException { - - validateSubstitutionFilter(component, componentInstanceId, action, constraint); - final Optional substitutionFilterDataDefinition = - getComponentInstanceSubstitutionFilterDataDefinition(componentInstanceId, component); - if (!substitutionFilterDataDefinition.isPresent()) { - throw new BusinessLogicException(componentsUtils.getResponseFormat(SUBSTITUTION_FILTER_NOT_FOUND)); - } - return substitutionFilterDataDefinition.get(); - } - - private void validateSubstitutionFilter(final Component component, - final String componentInstanceId, - final NodeFilterConstraintAction action, - final String constraint) throws BusinessLogicException { - final Either response = nodeFilterValidator - .validateFilter(component, componentInstanceId, Collections.singletonList(constraint), action); - if (response.isRight()) { - throw new BusinessLogicException(componentsUtils - .getResponseFormat(SUBSTITUTION_FILTER_NOT_FOUND, response.right().value().getFormattedMessage())); - } - } - private RequirementSubstitutionFilterPropertyDataDefinition getRequirementSubstitutionFilterPropertyDataDefinition( final String constraint) { @@ -356,4 +287,4 @@ public class ComponentSubstitutionFilterBusinessLogic extends BaseBusinessLogic requirementSubstitutionFilterPropertyDataDefinition.setConstraints(Arrays.asList(constraint)); return requirementSubstitutionFilterPropertyDataDefinition; } -} \ No newline at end of file +} diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/NodeFilterValidator.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/NodeFilterValidator.java index 9716dfae23..c6848030cd 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/NodeFilterValidator.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/NodeFilterValidator.java @@ -53,11 +53,11 @@ public class NodeFilterValidator { private static final String SOURCE = "Source"; public static final Set comparableTypes = ImmutableSet.of(ToscaPropertyType.STRING.getType(), - ToscaPropertyType.INTEGER.getType(), ToscaPropertyType.FLOAT.getType()); + ToscaPropertyType.INTEGER.getType(), ToscaPropertyType.FLOAT.getType()); public static final Set schemableTypes = - ImmutableSet.of(ToscaPropertyType.MAP.getType(), ToscaPropertyType.LIST.getType()); + ImmutableSet.of(ToscaPropertyType.MAP.getType(), ToscaPropertyType.LIST.getType()); public static final Set comparableConstraintsOperators = - ImmutableSet.of(ConstraintConvertor.GREATER_THAN_OPERATOR, ConstraintConvertor.LESS_THAN_OPERATOR); + ImmutableSet.of(ConstraintConvertor.GREATER_THAN_OPERATOR, ConstraintConvertor.LESS_THAN_OPERATOR); protected final ToscaOperationFacade toscaOperationFacade; protected final ComponentsUtils componentsUtils; @@ -78,8 +78,8 @@ public class NodeFilterValidator { return getErrorResponse(ActionStatus.FILTER_NOT_FOUND); } if (CollectionUtils.isEmpty(component.getComponentInstances()) || - component.getComponentInstances().stream() - .noneMatch(ci -> ci.getUniqueId().equals(componentInstanceId))) { + component.getComponentInstances().stream() + .noneMatch(ci -> ci.getUniqueId().equals(componentInstanceId))) { LOGGER.error("Component Instance list is empty"); return getErrorResponse(ActionStatus.FILTER_NOT_FOUND); } @@ -101,13 +101,13 @@ public class NodeFilterValidator { final UIConstraint constraint = new ConstraintConvertor().convert(uiConstraint); if (ConstraintConvertor.PROPERTY_CONSTRAINT.equals(constraint.getSourceType())) { final Either booleanResponseFormatEither = - validatePropertyConstraint(parentComponent, componentInstanceId, constraint); + validatePropertyConstraint(parentComponent, componentInstanceId, constraint); if (booleanResponseFormatEither.isRight()) { return booleanResponseFormatEither; } } else if (ConstraintConvertor.STATIC_CONSTRAINT.equals(constraint.getSourceType())) { final Either booleanResponseFormatEither = - validateStaticValueAndOperator(parentComponent, componentInstanceId, constraint); + validateStaticValueAndOperator(parentComponent, componentInstanceId, constraint); if (booleanResponseFormatEither.isRight()) { return booleanResponseFormatEither; } @@ -130,36 +130,36 @@ public class NodeFilterValidator { final List propertyDefinitions = parentComponent.getProperties(); List sourcePropertyDefinition = - parentComponent.getName().equals(uiConstraint.getSourceName()) && - propertyDefinitions != null ? propertyDefinitions : Collections.emptyList(); + parentComponent.getName().equals(uiConstraint.getSourceName()) && + propertyDefinitions != null ? propertyDefinitions : Collections.emptyList(); if (sourcePropertyDefinition.isEmpty() && !parentComponent.getName().equals(uiConstraint.getSourceName())) { optionalComponentInstance = parentComponent.getComponentInstances().stream() - .filter(componentInstance -> uiConstraint.getSourceName() - .equals(componentInstance - .getName())) - .findFirst(); + .filter(componentInstance -> uiConstraint.getSourceName() + .equals(componentInstance + .getName())) + .findFirst(); if (optionalComponentInstance.isPresent()) { final List componentInstanceProperties = - parentComponent.getComponentInstancesProperties() - .get(optionalComponentInstance.get().getUniqueId()); + parentComponent.getComponentInstancesProperties() + .get(optionalComponentInstance.get().getUniqueId()); sourcePropertyDefinition = - componentInstanceProperties == null ? new ArrayList<>() : componentInstanceProperties; + componentInstanceProperties == null ? new ArrayList<>() : componentInstanceProperties; } } if (!CollectionUtils.isEmpty(sourcePropertyDefinition)) { final Optional sourceSelectedProperty = sourcePropertyDefinition.stream() - .filter(property -> uiConstraint - .getValue() - .equals(property.getName())) - .findFirst(); + .filter(property -> uiConstraint + .getValue() + .equals(property.getName())) + .findFirst(); final Optional targetComponentInstanceProperty = - parentComponent.getComponentInstancesProperties().get(componentInstanceId).stream() - .filter(property -> uiConstraint.getServicePropertyName().equals(property.getName())) - .findFirst(); + parentComponent.getComponentInstancesProperties().get(componentInstanceId).stream() + .filter(property -> uiConstraint.getServicePropertyName().equals(property.getName())) + .findFirst(); source = !targetComponentInstanceProperty.isPresent() ? "Target" : SOURCE; if (sourceSelectedProperty.isPresent() && targetComponentInstanceProperty.isPresent()) { @@ -168,10 +168,10 @@ public class NodeFilterValidator { } final String missingProperty = - source.equals(SOURCE) ? uiConstraint.getValue().toString() : uiConstraint.getServicePropertyName(); + source.equals(SOURCE) ? uiConstraint.getValue().toString() : uiConstraint.getServicePropertyName(); return Either.right( - componentsUtils.getResponseFormat(ActionStatus.MAPPED_PROPERTY_NOT_FOUND, source, missingProperty)); + componentsUtils.getResponseFormat(ActionStatus.MAPPED_PROPERTY_NOT_FOUND, source, missingProperty)); } private Either validatePropertyData(UIConstraint uiConstraint, @@ -188,48 +188,48 @@ public class NodeFilterValidator { final SchemaDefinition targetSchemaDefinition = targetPropDefinition.getSchema(); if (!sourceSchemaDefinition.equals(targetSchemaDefinition)) { return Either - .right(componentsUtils.getResponseFormat(ActionStatus.SOURCE_TARGET_SCHEMA_MISMATCH, - uiConstraint.getServicePropertyName(), uiConstraint.getValue().toString())); + .right(componentsUtils.getResponseFormat(ActionStatus.SOURCE_TARGET_SCHEMA_MISMATCH, + uiConstraint.getServicePropertyName(), uiConstraint.getValue().toString())); } } return Either.left(Boolean.TRUE); } else { return Either.right(componentsUtils.getResponseFormat(ActionStatus.SOURCE_TARGET_PROPERTY_TYPE_MISMATCH, - uiConstraint.getServicePropertyName(), uiConstraint.getValue().toString())); + uiConstraint.getServicePropertyName(), uiConstraint.getValue().toString())); } } else { LOGGER.debug( - "Null value passed to `validatePropertyData` - sourceSelectedProperty: '{}' - targetComponentInstanceProperty: '{}'", - sourceSelectedProperty, targetComponentInstanceProperty); + "Null value passed to `validatePropertyData` - sourceSelectedProperty: '{}' - targetComponentInstanceProperty: '{}'", + sourceSelectedProperty, targetComponentInstanceProperty); return Either.right(componentsUtils - .getResponseFormat(ActionStatus.GENERAL_ERROR, uiConstraint.getServicePropertyName(), - uiConstraint.getValue().toString())); + .getResponseFormat(ActionStatus.GENERAL_ERROR, uiConstraint.getServicePropertyName(), + uiConstraint.getValue().toString())); } } private Either validateStaticValueAndOperator( - final Component parentComponent, - final String componentInstanceId, final UIConstraint uiConstraint) { + final Component parentComponent, + final String componentInstanceId, final UIConstraint uiConstraint) { if (!(Objects.nonNull(uiConstraint) && uiConstraint.getValue() instanceof String)) { return Either.left(false); } final Optional componentInstanceProperty = - parentComponent.getComponentInstancesProperties().get(componentInstanceId).stream() - .filter(property -> uiConstraint.getServicePropertyName().equals(property.getName())) - .findFirst(); + parentComponent.getComponentInstancesProperties().get(componentInstanceId).stream() + .filter(property -> uiConstraint.getServicePropertyName().equals(property.getName())) + .findFirst(); if (!componentInstanceProperty.isPresent()) { return Either.right(componentsUtils.getResponseFormat(ActionStatus.SELECTED_PROPERTY_NOT_PRESENT, - uiConstraint.getServicePropertyName())); + uiConstraint.getServicePropertyName())); } if (comparableConstraintsOperators.contains(uiConstraint.getConstraintOperator()) && !comparableTypes.contains( - componentInstanceProperty.get().getType())) { + componentInstanceProperty.get().getType())) { return Either.right(componentsUtils.getResponseFormat(ActionStatus.UNSUPPORTED_OPERATOR_PROVIDED, - uiConstraint.getServicePropertyName(), uiConstraint.getConstraintOperator())); + uiConstraint.getServicePropertyName(), uiConstraint.getConstraintOperator())); } return isValidValueCheck(componentInstanceProperty.get().getType(), String.valueOf(uiConstraint.getValue()), - uiConstraint.getServicePropertyName()); + uiConstraint.getServicePropertyName()); } private Either isValidValueCheck(String type, String value, String propertyName) { @@ -237,16 +237,101 @@ public class NodeFilterValidator { ToscaPropertyType toscaPropertyType = ToscaPropertyType.isValidType(type); if (Objects.isNull(toscaPropertyType)) { return Either.right( - componentsUtils.getResponseFormat(ActionStatus.UNSUPPORTED_PROPERTY_TYPE, type, propertyName)); + componentsUtils.getResponseFormat(ActionStatus.UNSUPPORTED_PROPERTY_TYPE, type, propertyName)); } if (toscaPropertyType.getValidator().isValid(value, null)) { return Either.left(Boolean.TRUE); } return Either.right( - componentsUtils.getResponseFormat(ActionStatus.UNSUPPORTED_VALUE_PROVIDED, type, propertyName, value)); + componentsUtils.getResponseFormat(ActionStatus.UNSUPPORTED_VALUE_PROVIDED, type, propertyName, value)); } + public Either validateComponentFilter(final Component component, + final List uiConstraints, + final NodeFilterConstraintAction action) { + try { + if (NodeFilterConstraintAction.ADD == action || NodeFilterConstraintAction.UPDATE == action) { + for (final String uiConstraint : uiConstraints) { + final UIConstraint constraint = new ConstraintConvertor().convert(uiConstraint); + if (ConstraintConvertor.PROPERTY_CONSTRAINT.equals(constraint.getSourceType())) { + final Either booleanResponseFormatEither = + validateComponentPropertyConstraint(component, constraint); + if (booleanResponseFormatEither.isRight()) { + return booleanResponseFormatEither; + } + } else if (ConstraintConvertor.STATIC_CONSTRAINT.equals(constraint.getSourceType())) { + final Either booleanResponseFormatEither = + validateComponentStaticValueAndOperator(component, constraint); + if (booleanResponseFormatEither.isRight()) { + return booleanResponseFormatEither; + } + } + } + } + } catch (final Exception e) { + LOGGER.debug("Provided constraint" + uiConstraints, e); + return Either.right(componentsUtils.getResponseFormat(ActionStatus.CONSTRAINT_FORMAT_INCORRECT)); + } -} + return Either.left(true); + } + private Either validateComponentPropertyConstraint(final Component component, + final UIConstraint uiConstraint) { + String source = SOURCE; + + final List propertyDefinitions = component.getProperties(); + List sourcePropertyDefinition = + component.getName().equals(uiConstraint.getSourceName()) && + propertyDefinitions != null ? propertyDefinitions : Collections.emptyList(); + + if (!CollectionUtils.isEmpty(sourcePropertyDefinition)) { + final Optional sourceSelectedProperty = sourcePropertyDefinition.stream() + .filter(property -> uiConstraint + .getValue() + .equals(property.getName())) + .findFirst(); + + final Optional targetComponentProperty = + component.getProperties().stream() + .filter(property -> uiConstraint.getServicePropertyName().equals(property.getName())) + .findFirst(); + source = !targetComponentProperty.isPresent() ? "Target" : SOURCE; + if (sourceSelectedProperty.isPresent() && targetComponentProperty.isPresent()) { + return validatePropertyData(uiConstraint, sourceSelectedProperty, targetComponentProperty); + } + } + + final String missingProperty = + source.equals(SOURCE) ? uiConstraint.getValue().toString() : uiConstraint.getServicePropertyName(); + + return Either.right( + componentsUtils.getResponseFormat(ActionStatus.MAPPED_PROPERTY_NOT_FOUND, source, missingProperty)); + } + + private Either validateComponentStaticValueAndOperator( + final Component component, final UIConstraint uiConstraint) { + if (!(Objects.nonNull(uiConstraint) && uiConstraint.getValue() instanceof String)) { + return Either.left(false); + } + final Optional componentProperty = + component.getProperties().stream() + .filter(property -> uiConstraint.getServicePropertyName().equals(property.getName())) + .findFirst(); + + if (componentProperty.isEmpty()) { + return Either.right(componentsUtils.getResponseFormat(ActionStatus.SELECTED_PROPERTY_NOT_PRESENT, + uiConstraint.getServicePropertyName())); + } + if (comparableConstraintsOperators.contains(uiConstraint.getConstraintOperator()) && !comparableTypes.contains( + componentProperty.get().getType())) { + return Either.right(componentsUtils.getResponseFormat(ActionStatus.UNSUPPORTED_OPERATOR_PROVIDED, + uiConstraint.getServicePropertyName(), uiConstraint.getConstraintOperator())); + } + + return isValidValueCheck(componentProperty.get().getType(), String.valueOf(uiConstraint.getValue()), + uiConstraint.getServicePropertyName()); + } + +} diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/datamodel/utils/UiComponentDataConverter.java b/catalog-be/src/main/java/org/openecomp/sdc/be/datamodel/utils/UiComponentDataConverter.java index b3db99dc47..65c3b0e78e 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/datamodel/utils/UiComponentDataConverter.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/datamodel/utils/UiComponentDataConverter.java @@ -50,6 +50,7 @@ import org.openecomp.sdc.be.model.Resource; import org.openecomp.sdc.be.model.Service; import org.openecomp.sdc.be.tosca.utils.NodeFilterConverter; import org.openecomp.sdc.be.tosca.utils.SubstitutionFilterConverter; +import org.openecomp.sdc.be.ui.model.UINodeFilter; import org.openecomp.sdc.be.ui.model.UiComponentDataTransfer; import org.openecomp.sdc.be.ui.model.UiComponentMetadata; import org.openecomp.sdc.be.ui.model.UiResourceDataTransfer; @@ -441,12 +442,14 @@ public class UiComponentDataConverter { } break; case SUBSTITUTION_FILTER: - if (service.getSubstitutionFilterComponents() == null) { + if (service.getSubstitutionFilter() == null) { dataTransfer.setSubstitutionFilterForTopologyTemplate(null); } else { final SubstitutionFilterConverter substitutionFilterConverter = new SubstitutionFilterConverter(); - dataTransfer.setSubstitutionFilterForTopologyTemplate(substitutionFilterConverter - .convertDataMapToUI(service.getSubstitutionFilterComponents())); + final Map filterUiMap = new HashMap<>(); + filterUiMap.put(service.getUniqueId(), + substitutionFilterConverter.convertToUi(service.getSubstitutionFilter())); + dataTransfer.setSubstitutionFilterForTopologyTemplate(filterUiMap); } break; default: diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentSubstitutionFilterServlet.java b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentSubstitutionFilterServlet.java index b451b33fb9..4a44c202f3 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentSubstitutionFilterServlet.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ComponentSubstitutionFilterServlet.java @@ -47,12 +47,12 @@ import org.openecomp.sdc.be.components.impl.ComponentSubstitutionFilterBusinessL import org.openecomp.sdc.be.components.impl.ResourceImportManager; import org.openecomp.sdc.be.components.impl.aaf.AafPermission; import org.openecomp.sdc.be.components.impl.aaf.PermissionAllowed; -import org.openecomp.sdc.be.components.impl.utils.NodeFilterConstraintAction; import org.openecomp.sdc.be.config.BeEcompErrorManager; import org.openecomp.sdc.be.dao.api.ActionStatus; import org.openecomp.sdc.be.datamodel.utils.ConstraintConvertor; import org.openecomp.sdc.be.datatypes.elements.SubstitutionFilterDataDefinition; import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum; +import org.openecomp.sdc.be.datatypes.enums.NodeFilterConstraintType; import org.openecomp.sdc.be.impl.ComponentsUtils; import org.openecomp.sdc.be.impl.ServletUtils; import org.openecomp.sdc.be.model.User; @@ -64,7 +64,7 @@ import org.openecomp.sdc.common.api.Constants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@Path("/v1/catalog/{componentType}/{componentId}/resourceInstances/{componentInstanceId}/substitutionFilter") +@Path("/v1/catalog/{componentType}/{componentId}/substitutionFilter/{constraintType}") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) @Singleton @@ -74,6 +74,7 @@ public class ComponentSubstitutionFilterServlet extends AbstractValidationsServl private static final String START_HANDLE_REQUEST_OF = "Start handle {} request of {}"; private static final String MODIFIER_ID_IS = "Modifier id is {}"; private static final String FAILED_TO_PARSE_COMPONENT = "Failed to parse component"; + private static final String INVALID_CONSTRAINTYPE_ENUM = "Invalid value for NodeFilterConstraintType enum %s"; private static final String FAILED_TO_ADD_SUBSTITUTION_FILTER = "Failed to add substitution filter"; private static final String ADD_SUBSTITUTION_FILTER = "Add Substitution Filter"; @@ -103,7 +104,6 @@ public class ComponentSubstitutionFilterServlet extends AbstractValidationsServl @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - @Path("/") @Operation(description = "Add Component Substitution Filter Constraint", method = "POST", summary = "Add Component Substitution Filter Constraint", responses = { @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))), @@ -114,10 +114,14 @@ public class ComponentSubstitutionFilterServlet extends AbstractValidationsServl public Response addSubstitutionFilter( @Parameter(description = "UIConstraint data", required = true) String constraintData, @Parameter(description = "Component Id") @PathParam("componentId") String componentId, - @Parameter(description = "Component Instance Id") @PathParam("componentInstanceId") String componentInstanceId, - @Parameter(description = "valid value: services", + @Parameter(description = "valid value: resources / services", schema = @Schema(allowableValues = { + ComponentTypeEnum.SERVICE_PARAM_NAME, ComponentTypeEnum.SERVICE_PARAM_NAME})) @PathParam("componentType") final String componentType, + @Parameter(description = "Constraint type. Valid values: properties / capabilities", + schema = @Schema(allowableValues = {NodeFilterConstraintType.PROPERTIES_PARAM_NAME, + NodeFilterConstraintType.CAPABILITIES_PARAM_NAME})) + @PathParam("constraintType") final String constraintType, @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) { @@ -129,28 +133,26 @@ public class ComponentSubstitutionFilterServlet extends AbstractValidationsServl try { final Optional convertResponse = componentsUtils .parseToConstraint(constraintData, userModifier, componentTypeEnum); - if (!convertResponse.isPresent()) { + if (convertResponse.isEmpty()) { LOGGER.error(FAILED_TO_PARSE_COMPONENT); return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR)); } - final Optional substitutionFilter = - componentSubstitutionFilterBusinessLogic.createSubstitutionFilterIfNotExist(componentId, - componentInstanceId, true, componentTypeEnum); - if (!substitutionFilter.isPresent()) { - LOGGER.error("Failed to create substitution filter."); - BeEcompErrorManager.getInstance().logBeRestApiGeneralError(ADD_SUBSTITUTION_FILTER); - return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR)); - } - final UIConstraint uiConstraint = convertResponse.get(); final String constraint = new ConstraintConvertor().convert(uiConstraint); + final Optional nodeFilterConstraintType = + NodeFilterConstraintType.parse(constraintType); + if (nodeFilterConstraintType.isEmpty()) { + return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT_PARAM, + INVALID_CONSTRAINTYPE_ENUM, constraintType)); + } + final Optional actionResponse = componentSubstitutionFilterBusinessLogic - .addSubstitutionFilter(componentId.toLowerCase(), componentInstanceId, NodeFilterConstraintAction.ADD, + .addSubstitutionFilter(componentId.toLowerCase(), uiConstraint.getServicePropertyName(), constraint, true, componentTypeEnum); - if (!actionResponse.isPresent()) { + if (actionResponse.isEmpty()) { LOGGER.error(FAILED_TO_ADD_SUBSTITUTION_FILTER); return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR)); } @@ -168,7 +170,6 @@ public class ComponentSubstitutionFilterServlet extends AbstractValidationsServl @PUT @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - @Path("/") @Operation(description = "Update Component Substitution Filter Constraint", method = "PUT", summary = "Update Component Substitution Filter Constraint", responses = { @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))), @@ -179,10 +180,14 @@ public class ComponentSubstitutionFilterServlet extends AbstractValidationsServl public Response updateSubstitutionFilter( @Parameter(description = "UIConstraint data", required = true) String constraintData, @Parameter(description = "Component Id") @PathParam("componentId") String componentId, - @Parameter(description = "Component Instance Id") @PathParam("componentInstanceId") String componentInstanceId, - @Parameter(description = "valid value: services", + @Parameter(description = "valid value: resources / services", schema = @Schema(allowableValues = { + ComponentTypeEnum.SERVICE_PARAM_NAME, ComponentTypeEnum.SERVICE_PARAM_NAME})) @PathParam("componentType") final String componentType, + @Parameter(description = "Constraint type. Valid values: properties / capabilities", + schema = @Schema(allowableValues = {NodeFilterConstraintType.PROPERTIES_PARAM_NAME, + NodeFilterConstraintType.CAPABILITIES_PARAM_NAME})) + @PathParam("constraintType") final String constraintType, @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) { LOGGER.debug(START_HANDLE_REQUEST_OF, request.getMethod(), request.getRequestURI()); @@ -201,8 +206,14 @@ public class ComponentSubstitutionFilterServlet extends AbstractValidationsServl } final List constraints = new ConstraintConvertor().convertToList(uiConstraints); + final Optional nodeFilterConstraintType = + NodeFilterConstraintType.parse(constraintType); + if (!nodeFilterConstraintType.isPresent()) { + return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT_PARAM, + INVALID_CONSTRAINTYPE_ENUM, constraintType)); + } final Optional actionResponse = componentSubstitutionFilterBusinessLogic - .updateSubstitutionFilter(componentId.toLowerCase(), componentInstanceId, constraints, + .updateSubstitutionFilter(componentId.toLowerCase(), constraints, true, componentTypeEnum); if (!actionResponse.isPresent()) { @@ -233,22 +244,31 @@ public class ComponentSubstitutionFilterServlet extends AbstractValidationsServl @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE) public Response deleteSubstitutionFilterConstraint( @Parameter(description = "Component Id") @PathParam("componentId") String componentId, - @Parameter(description = "Component Instance Id") @PathParam("componentInstanceId") String componentInstanceId, @Parameter(description = "Constraint Index") @PathParam("constraintIndex") int index, - @Parameter(description = "valid value: services", + @Parameter(description = "valid value: resources / services", schema = @Schema(allowableValues = { + ComponentTypeEnum.SERVICE_PARAM_NAME, ComponentTypeEnum.SERVICE_PARAM_NAME})) @PathParam("componentType") final String componentType, + @Parameter(description = "Constraint type. Valid values: properties / capabilities", + schema = @Schema(allowableValues = {NodeFilterConstraintType.PROPERTIES_PARAM_NAME, + NodeFilterConstraintType.CAPABILITIES_PARAM_NAME})) + @PathParam("constraintType") final String constraintType, @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) { LOGGER.debug(START_HANDLE_REQUEST_OF, request.getMethod(), request.getRequestURI()); LOGGER.debug(MODIFIER_ID_IS, userId); componentSubstitutionFilterBusinessLogic.validateUser(userId); + final Optional nodeFilterConstraintType = + NodeFilterConstraintType.parse(constraintType); + if (!nodeFilterConstraintType.isPresent()) { + return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT_PARAM, + INVALID_CONSTRAINTYPE_ENUM, constraintType)); + } + try { final Optional actionResponse = componentSubstitutionFilterBusinessLogic - .deleteSubstitutionFilter(componentId.toLowerCase(), componentInstanceId, - NodeFilterConstraintAction.DELETE, - null, index, true, ComponentTypeEnum.findByParamName(componentType)); + .deleteSubstitutionFilter(componentId.toLowerCase(), index, true, ComponentTypeEnum.findByParamName(componentType)); if (!actionResponse.isPresent()) { LOGGER.debug(FAILED_TO_DELETE_SUBSTITUTION_FILTER); diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaExportHandler.java b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaExportHandler.java index 533ed7a6f0..0907dd1f9b 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaExportHandler.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaExportHandler.java @@ -57,6 +57,7 @@ import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition; import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition; import org.openecomp.sdc.be.datatypes.elements.RequirementNodeFilterCapabilityDataDefinition; import org.openecomp.sdc.be.datatypes.elements.RequirementNodeFilterPropertyDataDefinition; +import org.openecomp.sdc.be.datatypes.elements.RequirementSubstitutionFilterCapabilityDataDefinition; import org.openecomp.sdc.be.datatypes.elements.RequirementSubstitutionFilterPropertyDataDefinition; import org.openecomp.sdc.be.datatypes.elements.SubstitutionFilterDataDefinition; import org.openecomp.sdc.be.datatypes.elements.ToscaArtifactDataDefinition; @@ -314,7 +315,6 @@ public class ToscaExportHandler { component.getComponentInstancesProperties(); Map> componentInstanceInterfaces = component.getComponentInstancesInterfaces(); - SubstitutionMapping substitutionMapping = new SubstitutionMapping(); if (CollectionUtils.isNotEmpty(componentInstances)) { final Either, ToscaError> nodeTemplates = convertNodeTemplates(component, componentInstances, @@ -325,10 +325,11 @@ public class ToscaExportHandler { } log.debug("node templates converted"); topologyTemplate.setNode_templates(nodeTemplates.left().value()); - - convertSubstitutionMappingFilter(componentInstances, substitutionMapping); } + SubstitutionMapping substitutionMapping = new SubstitutionMapping(); + convertSubstitutionMappingFilter(component, substitutionMapping); + addGroupsToTopologyTemplate(component, topologyTemplate); try { @@ -377,19 +378,13 @@ public class ToscaExportHandler { return Either.left(toscaNode); } - private void convertSubstitutionMappingFilter(final List componentInstances, + private void convertSubstitutionMappingFilter(final Component component, final SubstitutionMapping substitutionMapping) { - componentInstances.stream() - .filter(componentInstance -> hasSubstitutionFilterDataDefinition(componentInstance.getSubstitutionFilter())) - .forEach(componentInstance -> substitutionMapping - .setSubstitution_filter(convertToSubstitutionFilterComponent(componentInstance.getSubstitutionFilter()))); - } - - private boolean hasSubstitutionFilterDataDefinition( - final SubstitutionFilterDataDefinition substitutionFilterDataDefinition) { - - return substitutionFilterDataDefinition != null && substitutionFilterDataDefinition.getProperties() != null - && CollectionUtils.isNotEmpty(substitutionFilterDataDefinition.getProperties().getListToscaDataDefinition()); + if(component.getSubstitutionFilter() != null + && (component.getSubstitutionFilter().getProperties()).getListToscaDataDefinition() != null) { + substitutionMapping + .setSubstitution_filter(convertToSubstitutionFilterComponent(component.getSubstitutionFilter())); + } } private void addGroupsToTopologyTemplate(Component component, ToscaTopolgyTemplate topologyTemplate) { @@ -1521,18 +1516,23 @@ public class ToscaExportHandler { private NodeFilter convertToSubstitutionFilterComponent( final SubstitutionFilterDataDefinition substitutionFilterDataDefinition) { + if (substitutionFilterDataDefinition == null) { + return null; + } NodeFilter nodeFilter = new NodeFilter(); - final List>> propertiesCopy = new ArrayList<>(); - copySubstitutionFilterProperties(substitutionFilterDataDefinition.getProperties(), propertiesCopy); + ListDataDefinition origProperties = + substitutionFilterDataDefinition.getProperties(); + List>> propertiesCopy = new ArrayList<>(); + + copySubstitutionFilterProperties(origProperties, propertiesCopy); if (CollectionUtils.isNotEmpty(propertiesCopy)) { nodeFilter.setProperties(propertiesCopy); } nodeFilter.setTosca_id(cloneToscaId(substitutionFilterDataDefinition.getTosca_id())); - nodeFilter = (NodeFilter) cloneObjectFromYml(nodeFilter, NodeFilter.class); - return nodeFilter; + return (NodeFilter) cloneObjectFromYml(nodeFilter, NodeFilter.class); } private Object cloneToscaId(Object toscaId) { diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/utils/SubstitutionFilterConverter.java b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/utils/SubstitutionFilterConverter.java index 326ebf3709..d43ba4334c 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/utils/SubstitutionFilterConverter.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/utils/SubstitutionFilterConverter.java @@ -19,32 +19,68 @@ package org.openecomp.sdc.be.tosca.utils; +import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; +import org.apache.commons.collections.CollectionUtils; import org.openecomp.sdc.be.datamodel.utils.ConstraintConvertor; +import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition; +import org.openecomp.sdc.be.datatypes.elements.RequirementSubstitutionFilterCapabilityDataDefinition; +import org.openecomp.sdc.be.datatypes.elements.RequirementSubstitutionFilterPropertyDataDefinition; import org.openecomp.sdc.be.datatypes.elements.SubstitutionFilterDataDefinition; import org.openecomp.sdc.be.ui.model.UIConstraint; import org.openecomp.sdc.be.ui.model.UINodeFilter; public class SubstitutionFilterConverter { - public Map convertDataMapToUI(Map inMap) { - return inMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, o -> convertToUi(o.getValue()))); - } - public UINodeFilter convertToUi(final SubstitutionFilterDataDefinition inSubstitutionFilter) { final UINodeFilter uiNodeFilter = new UINodeFilter(); final ConstraintConvertor constraintConvertor = new ConstraintConvertor(); - if (inSubstitutionFilter.getProperties() == null || inSubstitutionFilter.getProperties().isEmpty()) { - return uiNodeFilter; + final List uiPropertyFilters = extractPropertyFilter(inSubstitutionFilter, constraintConvertor); + if (!uiPropertyFilters.isEmpty()) { + uiNodeFilter.setProperties(uiPropertyFilters); + } + + final List uiCapabilityFilters = + extractCapabilitiesFilter(inSubstitutionFilter, constraintConvertor); + if (!uiCapabilityFilters.isEmpty()) { + uiNodeFilter.setCapabilities(uiCapabilityFilters); } - final List constraints = inSubstitutionFilter.getProperties().getListToscaDataDefinition() - .stream() - .map(property -> property.getConstraints().iterator().next()) - .map(constraintConvertor::convert) - .collect(Collectors.toList()); - uiNodeFilter.setProperties(constraints); + return uiNodeFilter; } + + private List extractPropertyFilter(final SubstitutionFilterDataDefinition substitutionFilter, + final ConstraintConvertor constraintConvertor) { + final ListDataDefinition substitutionFilterProperties = + substitutionFilter.getProperties(); + if (substitutionFilterProperties != null && !substitutionFilterProperties.isEmpty() + && CollectionUtils.isNotEmpty(substitutionFilterProperties.getListToscaDataDefinition())) { + return substitutionFilterProperties.getListToscaDataDefinition() + .stream() + .map(property -> property.getConstraints().iterator().next()) + .map(constraintConvertor::convert) + .collect(Collectors.toList()); + } + + return Collections.emptyList(); + } + + private List extractCapabilitiesFilter(final SubstitutionFilterDataDefinition substitutionFilter, + final ConstraintConvertor constraintConvertor) { + final ListDataDefinition substitutionFilterCapabilities = + substitutionFilter.getCapabilities(); + if (substitutionFilterCapabilities != null && !substitutionFilterCapabilities.isEmpty() + && CollectionUtils.isNotEmpty(substitutionFilterCapabilities.getListToscaDataDefinition())) { + return substitutionFilterCapabilities + .getListToscaDataDefinition() + .stream() + .map(capabilities -> capabilities.getProperties().getListToscaDataDefinition().iterator().next()) + .map(property -> property.getConstraints().iterator().next()) + .map(constraintConvertor::convert) + .collect(Collectors.toList()); + } + + return Collections.emptyList(); + } } diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ComponentSubstitutionFilterBusinessLogicTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ComponentSubstitutionFilterBusinessLogicTest.java index eaeb5ea11a..666d1e7f39 100644 --- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ComponentSubstitutionFilterBusinessLogicTest.java +++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ComponentSubstitutionFilterBusinessLogicTest.java @@ -19,7 +19,6 @@ package org.openecomp.sdc.be.components.impl; -import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.fail; @@ -32,14 +31,12 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import fj.data.Either; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.HashMap; import java.util.LinkedList; import java.util.List; -import java.util.Map; import java.util.Optional; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -51,8 +48,6 @@ import org.openecomp.sdc.be.components.impl.exceptions.BusinessLogicException; import org.openecomp.sdc.be.components.impl.utils.NodeFilterConstraintAction; import org.openecomp.sdc.be.components.validation.NodeFilterValidator; import org.openecomp.sdc.be.components.validation.UserValidations; -import org.openecomp.sdc.be.config.ConfigurationManager; -import org.openecomp.sdc.be.dao.api.ActionStatus; import org.openecomp.sdc.be.dao.janusgraph.JanusGraphGenericDao; import org.openecomp.sdc.be.dao.jsongraph.JanusGraphDao; import org.openecomp.sdc.be.datamodel.utils.ConstraintConvertor; @@ -62,16 +57,13 @@ import org.openecomp.sdc.be.datatypes.elements.SubstitutionFilterDataDefinition; import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum; import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum; import org.openecomp.sdc.be.impl.ComponentsUtils; -import org.openecomp.sdc.be.model.ComponentInstance; -import org.openecomp.sdc.be.model.ComponentInstanceProperty; -import org.openecomp.sdc.be.model.PropertyDefinition; import org.openecomp.sdc.be.model.Service; +import org.openecomp.sdc.be.model.PropertyDefinition; import org.openecomp.sdc.be.model.jsonjanusgraph.operations.SubstitutionFilterOperation; import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade; import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus; import org.openecomp.sdc.be.model.operations.impl.GraphLockOperation; import org.openecomp.sdc.be.ui.model.UIConstraint; -import org.openecomp.sdc.exception.ResponseFormat; @ExtendWith(MockitoExtension.class) public class ComponentSubstitutionFilterBusinessLogicTest extends BaseBusinessLogicMock { @@ -82,13 +74,10 @@ public class ComponentSubstitutionFilterBusinessLogicTest extends BaseBusinessLo private static final String sourceName = sourceType; private static final String propertyValue = "constraintValue"; private static final String componentId = "dac65869-dfb4-40d2-aa20-084324659ec1"; - private static final String componentInstanceId = "dac65869-dfb4-40d2-aa20-084324659ec1.service0"; @InjectMocks private ComponentSubstitutionFilterBusinessLogic componentSubstitutionFilterBusinessLogic; @Mock - private NodeFilterValidator nodeFilterValidator; - @Mock private SubstitutionFilterOperation substitutionFilterOperation; @Mock private ToscaOperationFacade toscaOperationFacade; @@ -103,10 +92,9 @@ public class ComponentSubstitutionFilterBusinessLogicTest extends BaseBusinessLo @Mock private UserValidations userValidations; @Mock - private ResponseFormat responseFormat; + private NodeFilterValidator nodeFilterValidator; private Service service; - private ComponentInstance componentInstance; private SubstitutionFilterDataDefinition substitutionFilterDataDefinition; private RequirementSubstitutionFilterPropertyDataDefinition requirementSubstitutionFilterPropertyDataDefinition; private String constraint; @@ -130,12 +118,12 @@ public class ComponentSubstitutionFilterBusinessLogicTest extends BaseBusinessLo @Test public void doNotCreateSubstitutionFilterAsExistsTest() throws BusinessLogicException { - componentInstance.setSubstitutionFilter(substitutionFilterDataDefinition); + service.setSubstitutionFilter(substitutionFilterDataDefinition); when(toscaOperationFacade.getToscaElement(componentId)).thenReturn(Either.left(service)); final Optional result = componentSubstitutionFilterBusinessLogic - .createSubstitutionFilterIfNotExist(componentId, componentInstanceId, true, ComponentTypeEnum.SERVICE); + .createSubstitutionFilterIfNotExist(componentId, true, ComponentTypeEnum.SERVICE); assertThat(result).isPresent(); assertThat(result.get().getProperties()).isEqualTo(substitutionFilterDataDefinition.getProperties()); verify(toscaOperationFacade, times(1)).getToscaElement(componentId); @@ -145,19 +133,19 @@ public class ComponentSubstitutionFilterBusinessLogicTest extends BaseBusinessLo public void createSubstitutionFilterIfNotExistTest() throws BusinessLogicException { when(toscaOperationFacade.getToscaElement(componentId)).thenReturn(Either.left(service)); when(graphLockOperation.lockComponent(componentId, NodeTypeEnum.Service)) - .thenReturn(StorageOperationStatus.OK); - when(substitutionFilterOperation.createSubstitutionFilter(componentId, componentInstanceId)) - .thenReturn(Either.left(substitutionFilterDataDefinition)); + .thenReturn(StorageOperationStatus.OK); + when(substitutionFilterOperation.createSubstitutionFilter(componentId)) + .thenReturn(Either.left(substitutionFilterDataDefinition)); when(graphLockOperation.unlockComponent(componentId, NodeTypeEnum.Service)) - .thenReturn(StorageOperationStatus.OK); + .thenReturn(StorageOperationStatus.OK); final Optional result = componentSubstitutionFilterBusinessLogic - .createSubstitutionFilterIfNotExist(componentId, componentInstanceId, true, ComponentTypeEnum.SERVICE); + .createSubstitutionFilterIfNotExist(componentId, true, ComponentTypeEnum.SERVICE); assertThat(result).isPresent(); assertThat(result.get().getProperties()).isEqualTo(substitutionFilterDataDefinition.getProperties()); verify(toscaOperationFacade, times(1)).getToscaElement(componentId); verify(graphLockOperation, times(1)).lockComponent(componentId, NodeTypeEnum.Service); - verify(substitutionFilterOperation, times(1)).createSubstitutionFilter(componentId, componentInstanceId); + verify(substitutionFilterOperation, times(1)).createSubstitutionFilter(componentId); verify(graphLockOperation, times(1)).unlockComponent(componentId, NodeTypeEnum.Service); } @@ -165,283 +153,191 @@ public class ComponentSubstitutionFilterBusinessLogicTest extends BaseBusinessLo public void createSubstitutionFilterIfNotExistFailTest() { when(toscaOperationFacade.getToscaElement(componentId)).thenReturn(Either.left(service)); when(graphLockOperation.lockComponent(componentId, NodeTypeEnum.Service)) - .thenReturn(StorageOperationStatus.OK); - when(substitutionFilterOperation.createSubstitutionFilter(componentId, componentInstanceId)) - .thenReturn(Either.right(StorageOperationStatus.GENERAL_ERROR)); + .thenReturn(StorageOperationStatus.OK); + when(substitutionFilterOperation.createSubstitutionFilter(componentId)) + .thenReturn(Either.right(StorageOperationStatus.GENERAL_ERROR)); when(graphLockOperation.unlockComponent(componentId, NodeTypeEnum.Service)) - .thenReturn(StorageOperationStatus.OK); + .thenReturn(StorageOperationStatus.OK); assertThrows(BusinessLogicException.class, () -> componentSubstitutionFilterBusinessLogic - .createSubstitutionFilterIfNotExist(componentId, componentInstanceId, true, ComponentTypeEnum.SERVICE)); + .createSubstitutionFilterIfNotExist(componentId, true, ComponentTypeEnum.SERVICE)); verify(toscaOperationFacade, times(1)).getToscaElement(componentId); verify(graphLockOperation, times(1)).lockComponent(componentId, NodeTypeEnum.Service); - verify(substitutionFilterOperation, times(1)).createSubstitutionFilter(componentId, componentInstanceId); + verify(substitutionFilterOperation, times(1)).createSubstitutionFilter(componentId); verify(graphLockOperation, times(1)).unlockComponent(componentId, NodeTypeEnum.Service); } @Test public void addSubstitutionFilterTest() throws BusinessLogicException { - componentInstance.setSubstitutionFilter(substitutionFilterDataDefinition); + service.setSubstitutionFilter(substitutionFilterDataDefinition); when(toscaOperationFacade.getToscaElement(componentId)).thenReturn(Either.left(service)); - when(nodeFilterValidator.validateFilter(service, componentInstanceId, Collections.singletonList(constraint), - NodeFilterConstraintAction.ADD)).thenReturn(Either.left(true)); - when(nodeFilterValidator.validateComponentInstanceExist(service, componentInstanceId)) - .thenReturn(Either.left(true)); when(graphLockOperation.lockComponent(componentId, NodeTypeEnum.Service)) .thenReturn(StorageOperationStatus.OK); - + when(nodeFilterValidator.validateComponentFilter(service, Collections.singletonList(constraint), + NodeFilterConstraintAction.ADD)).thenReturn(Either.left(true)); when(substitutionFilterOperation - .addNewProperty(anyString(), anyString(), any(SubstitutionFilterDataDefinition.class), + .addPropertyFilter(anyString(), any(SubstitutionFilterDataDefinition.class), any(RequirementSubstitutionFilterPropertyDataDefinition.class))) .thenReturn(Either.left(substitutionFilterDataDefinition)); - when(graphLockOperation.unlockComponent(componentId, NodeTypeEnum.Service)) .thenReturn(StorageOperationStatus.OK); final Optional result = componentSubstitutionFilterBusinessLogic - .addSubstitutionFilter(componentId, componentInstanceId, NodeFilterConstraintAction.ADD, - servicePropertyName, constraint, true, ComponentTypeEnum.SERVICE); + .addSubstitutionFilter(componentId, servicePropertyName, constraint, true, + ComponentTypeEnum.SERVICE); assertThat(result).isPresent(); assertThat(result.get().getProperties().getListToscaDataDefinition()).hasSize(1); verify(toscaOperationFacade, times(1)).getToscaElement(componentId); verify(graphLockOperation, times(1)).lockComponent(componentId, NodeTypeEnum.Service); - verify(nodeFilterValidator, times(1)).validateFilter(service, componentInstanceId, - Collections.singletonList(constraint), NodeFilterConstraintAction.ADD); - verify(substitutionFilterOperation, times(0)) - .addNewProperty(componentId, componentInstanceId, substitutionFilterDataDefinition, - requirementSubstitutionFilterPropertyDataDefinition); + verify(nodeFilterValidator, times(1)).validateComponentFilter(service, + Collections.singletonList(constraint), NodeFilterConstraintAction.ADD); + verify(substitutionFilterOperation, times(1)) + .addPropertyFilter(anyString(), any(SubstitutionFilterDataDefinition.class), + any(RequirementSubstitutionFilterPropertyDataDefinition.class)); verify(graphLockOperation, times(1)).unlockComponent(componentId, NodeTypeEnum.Service); } @Test public void addSubstitutionFilterFailTest() { - componentInstance.setSubstitutionFilter(substitutionFilterDataDefinition); + service.setSubstitutionFilter(substitutionFilterDataDefinition); when(toscaOperationFacade.getToscaElement(componentId)).thenReturn(Either.left(service)); - when(nodeFilterValidator.validateFilter(service, componentInstanceId, Collections.singletonList(constraint), - NodeFilterConstraintAction.ADD)).thenReturn(Either.left(true)); - when(nodeFilterValidator.validateComponentInstanceExist(service, componentInstanceId)) - .thenReturn(Either.left(true)); when(graphLockOperation.lockComponent(componentId, NodeTypeEnum.Service)) .thenReturn(StorageOperationStatus.OK); - + when(nodeFilterValidator.validateComponentFilter(service, Collections.singletonList(constraint), + NodeFilterConstraintAction.ADD)).thenReturn(Either.left(true)); when(substitutionFilterOperation - .addNewProperty(anyString(), anyString(), any(SubstitutionFilterDataDefinition.class), - any(RequirementSubstitutionFilterPropertyDataDefinition.class))) + .addPropertyFilter(componentId, substitutionFilterDataDefinition, + requirementSubstitutionFilterPropertyDataDefinition)) .thenReturn(Either.right(StorageOperationStatus.GENERAL_ERROR)); when(graphLockOperation.unlockComponent(componentId, NodeTypeEnum.Service)) .thenReturn(StorageOperationStatus.OK); assertThrows(BusinessLogicException.class, () -> componentSubstitutionFilterBusinessLogic - .addSubstitutionFilter(componentId, componentInstanceId, NodeFilterConstraintAction.ADD, - servicePropertyName, constraint, true, ComponentTypeEnum.SERVICE)); + .addSubstitutionFilter(componentId, servicePropertyName, constraint, true, + ComponentTypeEnum.SERVICE)); verify(toscaOperationFacade, times(1)).getToscaElement(componentId); verify(graphLockOperation, times(1)).lockComponent(componentId, NodeTypeEnum.Service); - verify(nodeFilterValidator, times(1)).validateFilter(service, componentInstanceId, - Collections.singletonList(constraint), NodeFilterConstraintAction.ADD); + verify(nodeFilterValidator, times(1)).validateComponentFilter(service, + Collections.singletonList(constraint), NodeFilterConstraintAction.ADD); verify(substitutionFilterOperation, times(0)) - .addNewProperty(componentId, componentInstanceId, substitutionFilterDataDefinition, + .addPropertyFilter(componentId, substitutionFilterDataDefinition, requirementSubstitutionFilterPropertyDataDefinition); verify(graphLockOperation, times(1)).unlockComponent(componentId, NodeTypeEnum.Service); } @Test public void updateSubstitutionFilterTest() throws BusinessLogicException { - componentInstance.setSubstitutionFilter(substitutionFilterDataDefinition); + service.setSubstitutionFilter(substitutionFilterDataDefinition); + final List constraints = requirementSubstitutionFilterPropertyDataDefinition.getConstraints(); when(toscaOperationFacade.getToscaElement(componentId)).thenReturn(Either.left(service)); - when(nodeFilterValidator.validateFilter(service, componentInstanceId, - Collections.singletonList(constraint), NodeFilterConstraintAction.UPDATE)).thenReturn(Either.left(true)); when(graphLockOperation.lockComponent(componentId, NodeTypeEnum.Service)) .thenReturn(StorageOperationStatus.OK); - - when(substitutionFilterOperation.updateSubstitutionFilter(anyString(), anyString(), - any(SubstitutionFilterDataDefinition.class), anyList())) - .thenReturn(Either.left(substitutionFilterDataDefinition)); - + when(nodeFilterValidator.validateComponentFilter(service, Collections.singletonList(constraint), + NodeFilterConstraintAction.UPDATE)).thenReturn(Either.left(true)); + when(substitutionFilterOperation.updateProperties(anyString(), any(SubstitutionFilterDataDefinition.class), anyList())) + .thenReturn(Either.left(substitutionFilterDataDefinition)); when(graphLockOperation.unlockComponent(componentId, NodeTypeEnum.Service)) .thenReturn(StorageOperationStatus.OK); final Optional result = componentSubstitutionFilterBusinessLogic - .updateSubstitutionFilter(componentId, componentInstanceId, Collections.singletonList(constraint), + .updateSubstitutionFilter(componentId, Collections.singletonList(constraint), true, ComponentTypeEnum.SERVICE); assertThat(result).isPresent(); - + assertThat(result.get().getProperties().getListToscaDataDefinition()).hasSize(1); + verify(substitutionFilterOperation, times(1)) + .updateProperties(anyString(), any(SubstitutionFilterDataDefinition.class), anyList()); + verify(nodeFilterValidator, times(1)).validateComponentFilter(service, + Collections.singletonList(constraint), NodeFilterConstraintAction.UPDATE); verify(toscaOperationFacade, times(1)).getToscaElement(componentId); - verify(nodeFilterValidator, times(1)).validateFilter(service, componentInstanceId, - Collections.singletonList(constraint), NodeFilterConstraintAction.UPDATE); + verify(graphLockOperation, times(1)).lockComponent(componentId, NodeTypeEnum.Service); + verify(graphLockOperation, times(1)).unlockComponent(componentId, NodeTypeEnum.Service); } @Test public void updateSubstitutionFilterFailTest() { - componentInstance.setSubstitutionFilter(substitutionFilterDataDefinition); + service.setSubstitutionFilter(substitutionFilterDataDefinition); when(toscaOperationFacade.getToscaElement(componentId)).thenReturn(Either.left(service)); - when(nodeFilterValidator.validateFilter(service, componentInstanceId, - Collections.singletonList(constraint), NodeFilterConstraintAction.UPDATE)).thenReturn(Either.left(true)); when(graphLockOperation.lockComponent(componentId, NodeTypeEnum.Service)) .thenReturn(StorageOperationStatus.OK); - - when(substitutionFilterOperation.updateSubstitutionFilter(anyString(), anyString(), - any(SubstitutionFilterDataDefinition.class), anyList())) - .thenReturn(Either.right(StorageOperationStatus.GENERAL_ERROR)); - + when(nodeFilterValidator.validateComponentFilter(service, Collections.singletonList(constraint), + NodeFilterConstraintAction.UPDATE)).thenReturn(Either.left(true)); when(graphLockOperation.unlockComponent(componentId, NodeTypeEnum.Service)) .thenReturn(StorageOperationStatus.OK); final List constraints = requirementSubstitutionFilterPropertyDataDefinition.getConstraints(); assertThrows(BusinessLogicException.class, () -> componentSubstitutionFilterBusinessLogic - .updateSubstitutionFilter(componentId, componentInstanceId, constraints, true, ComponentTypeEnum.SERVICE)); + .updateSubstitutionFilter(componentId, constraints, true, ComponentTypeEnum.SERVICE)); verify(toscaOperationFacade, times(1)).getToscaElement(componentId); - verify(nodeFilterValidator, times(1)).validateFilter(service, componentInstanceId, - Collections.singletonList(constraint), NodeFilterConstraintAction.UPDATE); - } - - @Test - public void updateSubstitutionFilterFailWithFilterNotFoundTest() { - when(toscaOperationFacade.getToscaElement(componentId)).thenReturn(Either.left(service)); - when(nodeFilterValidator.validateFilter(service, componentInstanceId, - Collections.singletonList(constraint), NodeFilterConstraintAction.UPDATE)).thenReturn(Either.left(true)); - - assertThrows(BusinessLogicException.class, () -> componentSubstitutionFilterBusinessLogic - .updateSubstitutionFilter(componentId, componentInstanceId, - requirementSubstitutionFilterPropertyDataDefinition.getConstraints(), true, - ComponentTypeEnum.SERVICE)); - - verify(toscaOperationFacade, times(1)).getToscaElement(componentId); - verify(nodeFilterValidator, times(1)).validateFilter(service, componentInstanceId, - Collections.singletonList(constraint), NodeFilterConstraintAction.UPDATE); - } - - @Test - public void updateSubstitutionFilterFailValidationTest() { - when(toscaOperationFacade.getToscaElement(componentId)).thenReturn(Either.left(service)); - - final UIConstraint uiConstraint = - new UIConstraint("invalidProperty", constraintOperator, sourceType, sourceName, propertyValue); - constraint = new ConstraintConvertor().convert(uiConstraint); - requirementSubstitutionFilterPropertyDataDefinition.setConstraints(Collections.singletonList(constraint)); - - when(responseFormat.getFormattedMessage()).thenReturn(ActionStatus.SELECTED_PROPERTY_NOT_PRESENT.name()); - - when(nodeFilterValidator.validateFilter(service, componentInstanceId, - Collections.singletonList(constraint), NodeFilterConstraintAction.UPDATE)) - .thenReturn(Either.right(responseFormat)); - - assertThrows(BusinessLogicException.class, () -> componentSubstitutionFilterBusinessLogic - .updateSubstitutionFilter(componentId, componentInstanceId, - requirementSubstitutionFilterPropertyDataDefinition.getConstraints(), true, - ComponentTypeEnum.SERVICE)); - - verify(toscaOperationFacade, times(1)).getToscaElement(componentId); - verify(nodeFilterValidator, times(1)).validateFilter(service, componentInstanceId, - Collections.singletonList(constraint), NodeFilterConstraintAction.UPDATE); + verify(graphLockOperation, times(1)).lockComponent(componentId, NodeTypeEnum.Service); + verify(nodeFilterValidator, times(1)).validateComponentFilter(service, + Collections.singletonList(constraint), NodeFilterConstraintAction.UPDATE); + verify(graphLockOperation, times(1)).unlockComponent(componentId, NodeTypeEnum.Service); } @Test public void deleteSubstitutionFilterTest() throws BusinessLogicException { substitutionFilterDataDefinition.setProperties(new ListDataDefinition<>()); - componentInstance.setSubstitutionFilter(substitutionFilterDataDefinition); + service.setSubstitutionFilter(substitutionFilterDataDefinition); when(toscaOperationFacade.getToscaElement(componentId)).thenReturn(Either.left(service)); - when(nodeFilterValidator.validateFilter(service, componentInstanceId, - Collections.singletonList(constraint), NodeFilterConstraintAction.DELETE)).thenReturn(Either.left(true)); - - when(nodeFilterValidator.validateComponentInstanceExist(service, componentInstanceId)) - .thenReturn(Either.left(true)); when(graphLockOperation.lockComponent(componentId, NodeTypeEnum.Service)) .thenReturn(StorageOperationStatus.OK); - when(substitutionFilterOperation.deleteConstraint(anyString(), anyString(), - any(SubstitutionFilterDataDefinition.class), anyInt())) + when(substitutionFilterOperation.deleteConstraint(anyString(), any(SubstitutionFilterDataDefinition.class), anyInt())) .thenReturn(Either.left(substitutionFilterDataDefinition)); when(graphLockOperation.unlockComponent(componentId, NodeTypeEnum.Service)) .thenReturn(StorageOperationStatus.OK); final Optional result = componentSubstitutionFilterBusinessLogic - .deleteSubstitutionFilter(componentId, componentInstanceId, NodeFilterConstraintAction.DELETE, constraint, - 0, true, ComponentTypeEnum.SERVICE); + .deleteSubstitutionFilter(componentId, anyInt(), true, ComponentTypeEnum.SERVICE); - assertThat(result).isPresent(); - assertThat(result.get().getProperties().getListToscaDataDefinition()).hasSize(0); verify(toscaOperationFacade, times(1)).getToscaElement(componentId); - verify(nodeFilterValidator, times(1)).validateFilter(service, componentInstanceId, - Collections.singletonList(constraint), NodeFilterConstraintAction.DELETE); - verify(nodeFilterValidator, times(1)).validateComponentInstanceExist(service, componentInstanceId); verify(graphLockOperation, times(1)).lockComponent(componentId, NodeTypeEnum.Service); - verify(substitutionFilterOperation, times(1)).deleteConstraint(componentId, componentInstanceId, - substitutionFilterDataDefinition, 0); + verify(substitutionFilterOperation, times(1)).deleteConstraint(componentId, + substitutionFilterDataDefinition, 0); verify(graphLockOperation, times(1)).unlockComponent(componentId, NodeTypeEnum.Service); } @Test public void deleteSubstitutionFilterFailTest() { - componentInstance.setSubstitutionFilter(substitutionFilterDataDefinition); + service.setSubstitutionFilter(substitutionFilterDataDefinition); when(toscaOperationFacade.getToscaElement(componentId)).thenReturn(Either.left(service)); - when(nodeFilterValidator.validateFilter(service, componentInstanceId, - Collections.singletonList(constraint), NodeFilterConstraintAction.DELETE)).thenReturn(Either.left(true)); - - when(nodeFilterValidator.validateComponentInstanceExist(service, componentInstanceId)) - .thenReturn(Either.left(true)); when(graphLockOperation.lockComponent(componentId, NodeTypeEnum.Service)) .thenReturn(StorageOperationStatus.OK); - when(substitutionFilterOperation.deleteConstraint(anyString(), anyString(), + when(substitutionFilterOperation.deleteConstraint(anyString(), any(SubstitutionFilterDataDefinition.class), anyInt())) .thenReturn(Either.right(StorageOperationStatus.GENERAL_ERROR)); when(graphLockOperation.unlockComponent(componentId, NodeTypeEnum.Service)) .thenReturn(StorageOperationStatus.OK); + final List constraints = requirementSubstitutionFilterPropertyDataDefinition.getConstraints(); assertThrows(BusinessLogicException.class, () -> componentSubstitutionFilterBusinessLogic - .deleteSubstitutionFilter(componentId, componentInstanceId, NodeFilterConstraintAction.DELETE, constraint, - 0, true, ComponentTypeEnum.SERVICE)); + .deleteSubstitutionFilter(componentId, anyInt(),true, ComponentTypeEnum.SERVICE)); verify(toscaOperationFacade, times(1)).getToscaElement(componentId); - verify(nodeFilterValidator, times(1)).validateFilter(service, componentInstanceId, - Collections.singletonList(constraint), NodeFilterConstraintAction.DELETE); - verify(nodeFilterValidator, times(1)).validateComponentInstanceExist(service, componentInstanceId); - verify(substitutionFilterOperation, times(1)).deleteConstraint(componentId, componentInstanceId, - substitutionFilterDataDefinition, 0); + verify(graphLockOperation, times(1)).lockComponent(componentId, NodeTypeEnum.Service); + verify(substitutionFilterOperation, times(1)).deleteConstraint(componentId, + substitutionFilterDataDefinition, 0); verify(graphLockOperation, times(1)).unlockComponent(componentId, NodeTypeEnum.Service); } - @Test - public void deleteSubstitutionFilterFailValidationTest() { - when(toscaOperationFacade.getToscaElement(componentId)).thenReturn(Either.left(service)); - when(nodeFilterValidator.validateFilter(service, componentInstanceId, - Collections.singletonList(constraint), NodeFilterConstraintAction.DELETE)).thenReturn(Either.left(true)); - - when(nodeFilterValidator.validateComponentInstanceExist(service, componentInstanceId)) - .thenReturn(Either.left(true)); - - assertThrows(BusinessLogicException.class, () -> componentSubstitutionFilterBusinessLogic - .deleteSubstitutionFilter(componentId, componentInstanceId, NodeFilterConstraintAction.DELETE, constraint, - 0, true, ComponentTypeEnum.SERVICE)); - - verify(toscaOperationFacade, times(1)).getToscaElement(componentId); - verify(nodeFilterValidator, times(1)).validateFilter(service, componentInstanceId, - Collections.singletonList(constraint), NodeFilterConstraintAction.DELETE); - } - public void initResource() { try { service = new Service(); service.setName("MyTestService"); service.setUniqueId(componentId); - componentInstance = new ComponentInstance(); - componentInstance.setUniqueId(componentInstanceId); - componentInstance.setName("myComponentInstance"); - componentInstance.setDirectives(ConfigurationManager.getConfigurationManager().getConfiguration() - .getDirectives()); - final UIConstraint uiConstraint = new UIConstraint(servicePropertyName, constraintOperator, sourceType, sourceName, propertyValue); constraint = new ConstraintConvertor().convert(uiConstraint); @@ -459,22 +355,9 @@ public class ComponentSubstitutionFilterBusinessLogicTest extends BaseBusinessLo substitutionFilterDataDefinition.setProperties(listDataDefinition); substitutionFilterDataDefinition.setID("SUBSTITUTION_FILTER_UID"); - service.setComponentInstances(singletonList(componentInstance)); - final PropertyDefinition property = new PropertyDefinition(); property.setName(uiConstraint.getServicePropertyName()); - final List origProperties = new ArrayList<>(); - final ComponentInstanceProperty origProperty = new ComponentInstanceProperty(); - origProperty.setName(uiConstraint.getServicePropertyName()); - origProperty.setValue(propertyValue); - origProperty.setType(uiConstraint.getSourceType()); - origProperties.add(origProperty); - - final Map> componentInstanceProps = new HashMap<>(); - componentInstanceProps.put(componentInstanceId, origProperties); - - service.setComponentInstancesProperties(componentInstanceProps); service.setProperties(new LinkedList<>(Arrays.asList(property))); } catch (final Exception e) { fail(e.getMessage()); diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/servlets/ComponentSubstitutionFilterServletTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/servlets/ComponentSubstitutionFilterServletTest.java index b6b1dc5cd9..39259a899f 100644 --- a/catalog-be/src/test/java/org/openecomp/sdc/be/servlets/ComponentSubstitutionFilterServletTest.java +++ b/catalog-be/src/test/java/org/openecomp/sdc/be/servlets/ComponentSubstitutionFilterServletTest.java @@ -22,9 +22,11 @@ package org.openecomp.sdc.be.servlets; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.nullable; +import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; @@ -44,6 +46,7 @@ import javax.servlet.http.HttpSession; import javax.ws.rs.client.Entity; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; + import org.eclipse.jetty.http.HttpStatus; import org.glassfish.hk2.utilities.binding.AbstractBinder; import org.glassfish.jersey.server.ResourceConfig; @@ -58,7 +61,6 @@ import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic; import org.openecomp.sdc.be.components.impl.ComponentSubstitutionFilterBusinessLogic; import org.openecomp.sdc.be.components.impl.ResourceImportManager; import org.openecomp.sdc.be.components.impl.exceptions.BusinessLogicException; -import org.openecomp.sdc.be.components.impl.utils.NodeFilterConstraintAction; import org.openecomp.sdc.be.components.validation.UserValidations; import org.openecomp.sdc.be.config.SpringConfig; import org.openecomp.sdc.be.dao.api.ActionStatus; @@ -89,7 +91,7 @@ public class ComponentSubstitutionFilterServletTest extends JerseyTest { private static final String sourceName = sourceType; private static final String propertyValue = "constraintValue"; private static final String componentId = "dac65869-dfb4-40d2-aa20-084324659ec1"; - private static final String componentInstance = "dac65869-dfb4-40d2-aa20-084324659ec1.service0"; + private static final String constraintType = "properties"; private static final String componentType = "services"; private static HttpServletRequest request; @@ -141,9 +143,9 @@ public class ComponentSubstitutionFilterServletTest extends JerseyTest { } @Test - public void addSubstitutionFilterTest() throws BusinessLogicException { - final String pathFormat = "/v1/catalog/%s/%s/resourceInstances/%s/substitutionFilter"; - final String path = String.format(pathFormat, componentType, componentId, componentInstance); + public void addSubstitutionFilterTest() throws Exception { + final String pathFormat = "/v1/catalog/%s/%s/substitutionFilter/%s"; + final String path = String.format(pathFormat, componentType, componentId, constraintType); when(userValidations.validateUserExists(user)).thenReturn(user); when(componentSubstitutionFilterBusinessLogic.validateUser(USER_ID)).thenReturn(user); @@ -164,15 +166,8 @@ public class ComponentSubstitutionFilterServletTest extends JerseyTest { assertNotNull(substitutionFilterDataDefinition); assertThat(substitutionFilterDataDefinition.getProperties().getListToscaDataDefinition()).hasSize(1); assertThat("controller_actor: {equal: constraintValue}\n").isEqualToIgnoringCase(constraint); - - when(componentSubstitutionFilterBusinessLogic.createSubstitutionFilterIfNotExist(componentId, - componentInstance, true, ComponentTypeEnum.SERVICE)) - .thenReturn(Optional.ofNullable(substitutionFilterDataDefinition)); - - when(componentSubstitutionFilterBusinessLogic - .addSubstitutionFilter(componentId, componentInstance, NodeFilterConstraintAction.ADD, - uiConstraint.getServicePropertyName(), constraint, true, ComponentTypeEnum.SERVICE)) - .thenReturn(Optional.ofNullable(substitutionFilterDataDefinition)); + when(componentSubstitutionFilterBusinessLogic.addSubstitutionFilter(componentId, uiConstraint.getServicePropertyName(), constraint, + true, ComponentTypeEnum.SERVICE)).thenReturn(Optional.of(substitutionFilterDataDefinition)); final Response response = target() .path(path) @@ -183,17 +178,14 @@ public class ComponentSubstitutionFilterServletTest extends JerseyTest { assertThat(response.getStatus()).isEqualTo(HttpStatus.OK_200); verify(componentSubstitutionFilterBusinessLogic, times(1)) - .createSubstitutionFilterIfNotExist(componentId, componentInstance, true, ComponentTypeEnum.SERVICE); - - verify(componentSubstitutionFilterBusinessLogic, times(1)) - .addSubstitutionFilter(anyString(), anyString(), any(NodeFilterConstraintAction.class), anyString(), - anyString(), anyBoolean(), any(ComponentTypeEnum.class)); + .addSubstitutionFilter(componentId, uiConstraint.getServicePropertyName(), constraint, + true, ComponentTypeEnum.SERVICE); } @Test public void addSubstitutionFilterFailConstraintParseTest() { - final String pathFormat = "/v1/catalog/%s/%s/resourceInstances/%s/substitutionFilter"; - final String path = String.format(pathFormat, componentType, componentId, componentInstance); + final String pathFormat = "/v1/catalog/%s/%s/substitutionFilter/%s"; + final String path = String.format(pathFormat, componentType, componentId, constraintType); when(userValidations.validateUserExists(user)).thenReturn(user); when(componentSubstitutionFilterBusinessLogic.validateUser(USER_ID)).thenReturn(user); @@ -212,9 +204,9 @@ public class ComponentSubstitutionFilterServletTest extends JerseyTest { } @Test - public void addSubstitutionFilterFailTest() throws BusinessLogicException { - final String pathFormat = "/v1/catalog/%s/%s/resourceInstances/%s/substitutionFilter"; - final String path = String.format(pathFormat, componentType, componentId, componentInstance); + public void addSubstitutionFilterFailTest() { + final String pathFormat = "/v1/catalog/%s/%s/substitutionFilter/%s"; + final String path = String.format(pathFormat, componentType, componentId, constraintType); when(userValidations.validateUserExists(user)).thenReturn(user); when(componentSubstitutionFilterBusinessLogic.validateUser(USER_ID)).thenReturn(user); @@ -223,10 +215,6 @@ public class ComponentSubstitutionFilterServletTest extends JerseyTest { when(componentsUtils.parseToConstraint(anyString(), any(User.class), any(ComponentTypeEnum.class))) .thenReturn(Optional.of(uiConstraint)); - when(componentSubstitutionFilterBusinessLogic.createSubstitutionFilterIfNotExist(componentId, - componentInstance, true, ComponentTypeEnum.SERVICE)) - .thenReturn(Optional.empty()); - final Response response = target() .path(path) .request(MediaType.APPLICATION_JSON) @@ -234,15 +222,12 @@ public class ComponentSubstitutionFilterServletTest extends JerseyTest { .post(Entity.entity(inputJson, MediaType.APPLICATION_JSON)); assertThat(response.getStatus()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR_500); - - verify(componentSubstitutionFilterBusinessLogic, times(1)) - .createSubstitutionFilterIfNotExist(componentId, componentInstance, true, ComponentTypeEnum.SERVICE); } @Test public void updateSubstitutionFilterTest() throws BusinessLogicException { - final String pathFormat = "/v1/catalog/%s/%s/resourceInstances/%s/substitutionFilter"; - final String path = String.format(pathFormat, componentType, componentId, componentInstance); + final String pathFormat = "/v1/catalog/%s/%s/substitutionFilter/%s"; + final String path = String.format(pathFormat, componentType, componentId, constraintType); when(userValidations.validateUserExists(user)).thenReturn(user); when(componentSubstitutionFilterBusinessLogic.validateUser(USER_ID)).thenReturn(user); @@ -253,7 +238,7 @@ public class ComponentSubstitutionFilterServletTest extends JerseyTest { any(User.class))).thenReturn(Collections.singletonList(uiConstraint)); when(componentSubstitutionFilterBusinessLogic.updateSubstitutionFilter(componentId.toLowerCase(), - componentInstance, Collections.singletonList(constraint), true, ComponentTypeEnum.SERVICE)) + Collections.singletonList(constraint), true, ComponentTypeEnum.SERVICE)) .thenReturn(Optional.ofNullable(substitutionFilterDataDefinition)); final Response response = target() @@ -265,14 +250,13 @@ public class ComponentSubstitutionFilterServletTest extends JerseyTest { assertThat(response.getStatus()).isEqualTo(HttpStatus.OK_200); verify(componentSubstitutionFilterBusinessLogic, times(1)) - .updateSubstitutionFilter(componentId.toLowerCase(), componentInstance, - Collections.singletonList(constraint), true, ComponentTypeEnum.SERVICE); + .updateSubstitutionFilter(anyString(), anyList(), anyBoolean(), any(ComponentTypeEnum.class)); } @Test public void updateSubstitutionFilterFailConstraintParseTest() { - final String pathFormat = "/v1/catalog/%s/%s/resourceInstances/%s/substitutionFilter"; - final String path = String.format(pathFormat, componentType, componentId, componentInstance); + final String pathFormat = "/v1/catalog/%s/%s/substitutionFilter/%s"; + final String path = String.format(pathFormat, componentType, componentId, constraintType); when(userValidations.validateUserExists(user)).thenReturn(user); when(componentSubstitutionFilterBusinessLogic.validateUser(USER_ID)).thenReturn(user); @@ -291,9 +275,9 @@ public class ComponentSubstitutionFilterServletTest extends JerseyTest { } @Test - public void updateSubstitutionFilterFailTest() throws BusinessLogicException { - final String pathFormat = "/v1/catalog/%s/%s/resourceInstances/%s/substitutionFilter"; - final String path = String.format(pathFormat, componentType, componentId, componentInstance); + public void updateSubstitutionFilterFailTest() { + final String pathFormat = "/v1/catalog/%s/%s/substitutionFilter/%s"; + final String path = String.format(pathFormat, componentType, componentId, constraintType); when(userValidations.validateUserExists(user)).thenReturn(user); when(componentSubstitutionFilterBusinessLogic.validateUser(USER_ID)).thenReturn(user); @@ -302,10 +286,6 @@ public class ComponentSubstitutionFilterServletTest extends JerseyTest { when(componentsUtils.validateAndParseConstraint(ArgumentMatchers.any(ComponentTypeEnum.class), anyString(), any(User.class))).thenReturn(Collections.singletonList(uiConstraint)); - when(componentSubstitutionFilterBusinessLogic.updateSubstitutionFilter(componentId.toLowerCase(), - componentInstance, Collections.singletonList(constraint), true, ComponentTypeEnum.SERVICE)) - .thenReturn(Optional.empty()); - final Response response = target() .path(path) .request(MediaType.APPLICATION_JSON) @@ -313,24 +293,20 @@ public class ComponentSubstitutionFilterServletTest extends JerseyTest { .put(Entity.entity(inputJson, MediaType.APPLICATION_JSON)); assertThat(response.getStatus()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR_500); - - verify(componentSubstitutionFilterBusinessLogic, times(1)) - .updateSubstitutionFilter(componentId.toLowerCase(), componentInstance, - Collections.singletonList(constraint), true, ComponentTypeEnum.SERVICE); } @Test public void deleteSubstitutionFilterConstraintTest() throws BusinessLogicException { - final String pathFormat = "/v1/catalog/%s/%s/resourceInstances/%s/substitutionFilter/0"; - final String path = String.format(pathFormat, componentType, componentId, componentInstance); + final String pathFormat = "/v1/catalog/%s/%s/substitutionFilter/%s/0"; + final String path = String.format(pathFormat, componentType, componentId, constraintType); when(userValidations.validateUserExists(user)).thenReturn(user); when(componentSubstitutionFilterBusinessLogic.validateUser(USER_ID)).thenReturn(user); when(responseFormat.getStatus()).thenReturn(HttpStatus.OK_200); when(componentsUtils.getResponseFormat(ActionStatus.OK)).thenReturn(responseFormat); - when(componentSubstitutionFilterBusinessLogic.deleteSubstitutionFilter(componentId, componentInstance, - NodeFilterConstraintAction.DELETE, null, 0, true, ComponentTypeEnum.SERVICE)) + when(componentSubstitutionFilterBusinessLogic.deleteSubstitutionFilter(componentId, 0, + true, ComponentTypeEnum.SERVICE)) .thenReturn(Optional.ofNullable(substitutionFilterDataDefinition)); final Response response = target() @@ -342,23 +318,18 @@ public class ComponentSubstitutionFilterServletTest extends JerseyTest { assertThat(response.getStatus()).isEqualTo(HttpStatus.OK_200); verify(componentSubstitutionFilterBusinessLogic, times(1)) - .deleteSubstitutionFilter(componentId, componentInstance, - NodeFilterConstraintAction.DELETE, null, 0, true, ComponentTypeEnum.SERVICE); + .deleteSubstitutionFilter(anyString(), anyInt(), anyBoolean(), any(ComponentTypeEnum.class)); } @Test - public void deleteSubstitutionFilterConstraintFailTest() throws BusinessLogicException { - final String pathFormat = "/v1/catalog/%s/%s/resourceInstances/%s/substitutionFilter/0"; - final String path = String.format(pathFormat, componentType, componentId, componentInstance); + public void deleteSubstitutionFilterConstraintFailTest() { + final String pathFormat = "/v1/catalog/%s/%s/substitutionFilter/%s/0"; + final String path = String.format(pathFormat, componentType, componentId, constraintType); when(userValidations.validateUserExists(user)).thenReturn(user); when(componentSubstitutionFilterBusinessLogic.validateUser(USER_ID)).thenReturn(user); when(componentsUtils.getResponseFormat(ActionStatus.OK)).thenReturn(responseFormat); - when(componentSubstitutionFilterBusinessLogic.deleteSubstitutionFilter(componentId, componentInstance, - NodeFilterConstraintAction.DELETE, null, 0, true, ComponentTypeEnum.SERVICE)) - .thenReturn(Optional.empty()); - final Response response = target() .path(path) .request(MediaType.APPLICATION_JSON) @@ -366,11 +337,6 @@ public class ComponentSubstitutionFilterServletTest extends JerseyTest { .delete(Response.class); assertThat(response.getStatus()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR_500); - - verify(componentSubstitutionFilterBusinessLogic, times(1)) - .deleteSubstitutionFilter(componentId, componentInstance, - NodeFilterConstraintAction.DELETE, null, 0, true, ComponentTypeEnum.SERVICE); - } private static void createMocks() { -- cgit 1.2.3-korg