From 4720f5aea7d548701a832b965a2b0e38dbc3bc4a Mon Sep 17 00:00:00 2001 From: mojahidi Date: Fri, 22 Jun 2018 16:37:52 +0530 Subject: Add output parameter support in Operation screen Added code to support Output parameter, fixed UTs, Added flow test Change-Id: I4ff869d120cefd7645a407278caeea6ee695c73b Issue-ID: SDC-1440 Signed-off-by: mojahidi --- .../validation/InterfaceOperationValidation.java | 49 +++++++++++++++++++++- .../datamodel/utils/InterfaceUIDataConverter.java | 22 +++++++++- .../be/components/InterfaceOperationTestUtils.java | 16 ++++++- .../InterfaceOperationValidationTest.java | 40 +++++++++++++----- .../utils/InterfaceUIDataConverterTest.java | 3 ++ 5 files changed, 117 insertions(+), 13 deletions(-) (limited to 'catalog-be/src') diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/InterfaceOperationValidation.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/InterfaceOperationValidation.java index aa58c14227..e57c7b9496 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/InterfaceOperationValidation.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/validation/InterfaceOperationValidation.java @@ -89,6 +89,13 @@ public class InterfaceOperationValidation { if(inputParametersResponse.isRight()) { return Either.right(inputParametersResponse.right().value()); } + + Either outputParametersResponse = validateOutputParameters(interfaceOperation, + responseFormatManager); + if(outputParametersResponse.isRight()) { + return Either.right(outputParametersResponse.right().value()); + } + return Either.left(Boolean.TRUE); } @@ -223,6 +230,28 @@ public class InterfaceOperationValidation { return Either.left(Boolean.TRUE); } + + private Either validateOutputParameters(Operation interfaceOperation, + ResponseFormatManager responseFormatManager) { + if (isOutputParameterNameEmpty(interfaceOperation)) { + LOGGER.error("Interface operation output parameter name can't be empty"); + ResponseFormat inputResponse = responseFormatManager.getResponseFormat(ActionStatus + .INTERFACE_OPERATION_OUTPUT_NAME_MANDATORY); + return Either.right(inputResponse); + } + + Either> validateOutputParametersUniqueResponse = isOutputParametersUnique(interfaceOperation); + if(validateOutputParametersUniqueResponse.isRight()) { + LOGGER.error("Interface operation output parameter names {} already in use", + validateOutputParametersUniqueResponse.right().value().toString()); + ResponseFormat inputResponse = responseFormatManager.getResponseFormat(ActionStatus + .INTERFACE_OPERATION_OUTPUT_NAME_ALREADY_IN_USE, validateOutputParametersUniqueResponse.right().value().toString()); + return Either.right(inputResponse); + } + return Either.left(Boolean.TRUE); + } + + private Either> isInputParametersUnique(Operation operationDataDefinition) { Set inputParamNamesSet = new HashSet<>(); Set duplicateParamNamesToReturn = new HashSet<>(); @@ -238,11 +267,29 @@ public class InterfaceOperationValidation { return Either.left(Boolean.TRUE); } + private Either> isOutputParametersUnique(Operation operationDataDefinition) { + Set outputParamNamesSet = new HashSet<>(); + Set duplicateParamNamesToReturn = new HashSet<>(); + operationDataDefinition.getOutputs().getListToscaDataDefinition() + .forEach(outputParam -> { + if(!outputParamNamesSet.add(outputParam.getName().trim())) { + duplicateParamNamesToReturn.add(outputParam.getName().trim()); + } + }); + if(!duplicateParamNamesToReturn.isEmpty()) { + return Either.right(duplicateParamNamesToReturn); + } + return Either.left(Boolean.TRUE); + } + private Boolean isInputParameterNameEmpty(Operation operationDataDefinition) { return operationDataDefinition.getInputs().getListToscaDataDefinition().stream() .anyMatch(inputParam -> inputParam.getName() == null || inputParam.getName().trim().equals(StringUtils.EMPTY)); } - + private Boolean isOutputParameterNameEmpty(Operation operationDataDefinition) { + return operationDataDefinition.getInputs().getListToscaDataDefinition().stream() + .anyMatch(inputParam -> inputParam.getName() == null || inputParam.getName().trim().equals(StringUtils.EMPTY)); + } private boolean validateOperationTypeUniqueForUpdate(Operation interfaceOperation, Map operationTypes) { diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/datamodel/utils/InterfaceUIDataConverter.java b/catalog-be/src/main/java/org/openecomp/sdc/be/datamodel/utils/InterfaceUIDataConverter.java index 78b2354615..2db551643c 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/datamodel/utils/InterfaceUIDataConverter.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/datamodel/utils/InterfaceUIDataConverter.java @@ -23,6 +23,7 @@ import org.openecomp.sdc.be.datatypes.elements.InterfaceOperationDataDefinition; import org.openecomp.sdc.be.datatypes.elements.InterfaceOperationParamDataDefinition; import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition; import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition; +import org.openecomp.sdc.be.datatypes.elements.OperationOutputDefinition; import org.openecomp.sdc.be.model.Operation; public class InterfaceUIDataConverter { @@ -40,11 +41,21 @@ public class InterfaceUIDataConverter { interfaceOperationParamDataDefinition.getParamId())).collect(Collectors.toList()); inputList.forEach(inputs::add); } + ListDataDefinition outputParams = interfaceOperation.getOutputParams(); + ListDataDefinition outputs = new ListDataDefinition<>(); + if(outputParams != null) { + List outputList = outputParams.getListToscaDataDefinition().stream() + .map(interfaceOperationParamDataDefinition -> new OperationOutputDefinition(interfaceOperationParamDataDefinition.getParamName(), + interfaceOperationParamDataDefinition.getParamId())).collect(Collectors.toList()); + outputList.forEach(outputs::add); + } + Operation operationData = new Operation(); operationData.setDescription(interfaceOperation.getDescription()); operationData.setName(interfaceOperation.getOperationType()); operationData.setUniqueId(interfaceOperation.getUniqueId()); operationData.setInputs(inputs); + operationData.setOutputs(outputs); return operationData; } @@ -53,16 +64,25 @@ public class InterfaceUIDataConverter { ListDataDefinition inputs = operationData.getInputs(); List inputParamList = inputs.getListToscaDataDefinition().stream() - .map(a -> new InterfaceOperationParamDataDefinition(a.getName(), a.getInputId())).collect( + .map(operationInputDefinition -> new InterfaceOperationParamDataDefinition(operationInputDefinition.getName(), + operationInputDefinition.getInputId())).collect( Collectors.toList()); ListDataDefinition inputParams = new ListDataDefinition<>(); inputParamList.forEach(inputParams::add); + ListDataDefinition outputs = operationData.getOutputs(); + List outputParamList = outputs.getListToscaDataDefinition() + .stream().map(operationOutputDefinition -> new InterfaceOperationParamDataDefinition(operationOutputDefinition.getName(), + operationOutputDefinition.getInputId())).collect(Collectors.toList()); + ListDataDefinition outputParams = new ListDataDefinition<>(); + outputParamList.forEach(outputParams::add); + InterfaceOperationDataDefinition interfaceOperationDataDefinition = new InterfaceOperationDataDefinition(); interfaceOperationDataDefinition.setUniqueId(operationData.getUniqueId()); interfaceOperationDataDefinition.setOperationType(operationData.getName()); interfaceOperationDataDefinition.setDescription(operationData.getDescription()); interfaceOperationDataDefinition.setInputParams(inputParams); + interfaceOperationDataDefinition.setOutputParams(outputParams); interfaceOperationDataDefinition.setArtifactUUID(operationData.getImplementation().getArtifactUUID()); return interfaceOperationDataDefinition; diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/InterfaceOperationTestUtils.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/InterfaceOperationTestUtils.java index f38848c1be..cf3d5d5bdc 100644 --- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/InterfaceOperationTestUtils.java +++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/InterfaceOperationTestUtils.java @@ -21,6 +21,7 @@ import java.util.Map; import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition; import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition; +import org.openecomp.sdc.be.datatypes.elements.OperationOutputDefinition; import org.openecomp.sdc.be.model.ArtifactDefinition; import org.openecomp.sdc.be.model.InterfaceDefinition; import org.openecomp.sdc.be.model.Operation; @@ -46,13 +47,15 @@ public interface InterfaceOperationTestUtils { default Operation createInterfaceOperation(String uniqueID, String description, ArtifactDefinition artifactDefinition, - ListDataDefinition inputs, String name) { + ListDataDefinition inputs, + ListDataDefinition outputs, String name) { Operation operation = new Operation(); operation.setUniqueId(uniqueID); operation.setDescription(description); operation.setImplementation(artifactDefinition); operation.setInputs(inputs); + operation.setOutputs(outputs); operation.setName(name); return operation; @@ -65,6 +68,10 @@ public interface InterfaceOperationTestUtils { operationInputDefinitionList.add(createMockOperationInputDefinition("label1")); operation.setInputs(operationInputDefinitionList); + ListDataDefinition operationOutputDefList = new ListDataDefinition<>(); + operationOutputDefList.add(createMockOperationOutputDefinition("op1")); + operation.setOutputs(operationOutputDefList); + operation.setDefinition(false); operation.setName("CREATE"); operation.setUniqueId("uniqueId1"); @@ -85,6 +92,13 @@ public interface InterfaceOperationTestUtils { return operationInputDefinition; } + default OperationOutputDefinition createMockOperationOutputDefinition(String name) { + OperationOutputDefinition operationOutputDefinition = new OperationOutputDefinition(); + operationOutputDefinition.setName(name); + operationOutputDefinition.setUniqueId("uniqueId1"); + return operationOutputDefinition; + } + default Map createMockInterfaceDefinition(String resourceName) { Map operationMap = createMockOperationMap(); Map interfaceDefinitionMap = new HashMap<>(); diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/validation/InterfaceOperationValidationTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/validation/InterfaceOperationValidationTest.java index a8686c179a..02c212d7e6 100644 --- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/validation/InterfaceOperationValidationTest.java +++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/validation/InterfaceOperationValidationTest.java @@ -35,6 +35,7 @@ import org.openecomp.sdc.be.components.InterfaceOperationTestUtils; import org.openecomp.sdc.be.components.impl.ResponseFormatManager; import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition; import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition; +import org.openecomp.sdc.be.datatypes.elements.OperationOutputDefinition; import org.openecomp.sdc.be.model.ArtifactDefinition; import org.openecomp.sdc.be.model.Component; import org.openecomp.sdc.be.model.ComponentParametersView; @@ -61,6 +62,7 @@ public class InterfaceOperationValidationTest implements InterfaceOperationTestU InterfaceOperationValidationUtilTest interfaceOperationValidationUtilTest = new InterfaceOperationValidationUtilTest(); private static final String RESOURCE_ID = "resource1"; ListDataDefinition operationInputDefinitionList = new ListDataDefinition<>(); + ListDataDefinition operationOutputDefinitionList = new ListDataDefinition<>(); @Before public void init() { MockitoAnnotations.initMocks(this); @@ -75,8 +77,10 @@ public class InterfaceOperationValidationTest implements InterfaceOperationTestU @Test public void testValidInterfaceOperation() { operationInputDefinitionList.add(createMockOperationInputDefinition("label1")); + operationOutputDefinitionList.add(createMockOperationOutputDefinition("label1")); Collection operations = createInterfaceOperationData("op2", - "interface operation2",new ArtifactDefinition(), operationInputDefinitionList,"upgrade"); + "interface operation2",new ArtifactDefinition(), operationInputDefinitionList, + operationOutputDefinitionList,"upgrade"); Either booleanResponseFormatEither = interfaceOperationValidationUtilTest .validateInterfaceOperations(operations, RESOURCE_ID, false); Assert.assertTrue(booleanResponseFormatEither.isLeft()); @@ -85,11 +89,12 @@ public class InterfaceOperationValidationTest implements InterfaceOperationTestU @Test public void testInterfaceOperationDescriptionLength() { operationInputDefinitionList.add(createMockOperationInputDefinition("label1")); + operationOutputDefinitionList.add(createMockOperationOutputDefinition("label1")); Collection operations = createInterfaceOperationData("op2", "interface operation2 - The Spring Initializer provides a project generator to make you " + "productive with the certain technology stack from the beginning. You can create a skeleton project" + "with web, data access (relational and NoSQL datastores), cloud, or messaging support", - new ArtifactDefinition(), operationInputDefinitionList,"update"); + new ArtifactDefinition(), operationInputDefinitionList, operationOutputDefinitionList,"update"); Either booleanResponseFormatEither = interfaceOperationValidationUtilTest .validateInterfaceOperations(operations, RESOURCE_ID, false); Assert.assertTrue(booleanResponseFormatEither.isRight()); @@ -100,8 +105,10 @@ public class InterfaceOperationValidationTest implements InterfaceOperationTestU @Test public void testInterfaceOperationForEmptyType() { operationInputDefinitionList.add(createMockOperationInputDefinition("label1")); + operationOutputDefinitionList.add(createMockOperationOutputDefinition("label1")); Collection operations = createInterfaceOperationData("op2", - "interface operation2",new ArtifactDefinition(), operationInputDefinitionList,""); + "interface operation2",new ArtifactDefinition(), operationInputDefinitionList, + operationOutputDefinitionList, ""); Either booleanResponseFormatEither = interfaceOperationValidationUtilTest .validateInterfaceOperations(operations, RESOURCE_ID, false); Assert.assertTrue(booleanResponseFormatEither.isRight()); @@ -110,8 +117,10 @@ public class InterfaceOperationValidationTest implements InterfaceOperationTestU @Test public void testInterfaceOperationForEmptyInputParam() { operationInputDefinitionList.add(createMockOperationInputDefinition("label1")); + operationOutputDefinitionList.add(createMockOperationOutputDefinition("label1")); Collection operations = createInterfaceOperationData("op2", - "interface operation2",new ArtifactDefinition(), operationInputDefinitionList,"input2"); + "interface operation2",new ArtifactDefinition(), operationInputDefinitionList, + operationOutputDefinitionList,"input2"); Either booleanResponseFormatEither = interfaceOperationValidationUtilTest .validateInterfaceOperations(operations, RESOURCE_ID, false); Assert.assertTrue(booleanResponseFormatEither.isRight()); @@ -120,8 +129,10 @@ public class InterfaceOperationValidationTest implements InterfaceOperationTestU @Test public void testInterfaceOperationForNonUniqueType() { operationInputDefinitionList.add(createMockOperationInputDefinition("label1")); + operationOutputDefinitionList.add(createMockOperationOutputDefinition("label1")); Collection operations = createInterfaceOperationData("op2", - "interface operation2",new ArtifactDefinition(), operationInputDefinitionList,"CREATE"); + "interface operation2",new ArtifactDefinition(), operationInputDefinitionList, + operationOutputDefinitionList,"CREATE"); Either booleanResponseFormatEither = interfaceOperationValidationUtilTest .validateInterfaceOperations(operations, RESOURCE_ID, false); Assert.assertTrue(booleanResponseFormatEither.isRight()); @@ -130,8 +141,10 @@ public class InterfaceOperationValidationTest implements InterfaceOperationTestU @Test public void testInterfaceOperationTypeLength() { operationInputDefinitionList.add(createMockOperationInputDefinition("label1")); + operationOutputDefinitionList.add(createMockOperationOutputDefinition("label1")); Collection operations = createInterfaceOperationData("op2", "interface operation2",new ArtifactDefinition(), operationInputDefinitionList, + operationOutputDefinitionList, "interface operation2 - The Spring Initializer provides a project generator to make you " + "productive with the certain technology stack from the beginning. You can create a skeleton project" + "with web, data access (relational and NoSQL datastores), cloud, or messaging support"); @@ -147,8 +160,10 @@ public class InterfaceOperationValidationTest implements InterfaceOperationTestU operationInputDefinitionList.add(createMockOperationInputDefinition("label1")); operationInputDefinitionList.add(createMockOperationInputDefinition("label2")); operationInputDefinitionList.add(createMockOperationInputDefinition("label2")); + operationOutputDefinitionList.add(createMockOperationOutputDefinition("label1")); Collection operations = createInterfaceOperationData("op2", - "interface operation2",new ArtifactDefinition(), operationInputDefinitionList,"create"); + "interface operation2",new ArtifactDefinition(), operationInputDefinitionList, + operationOutputDefinitionList,"create"); Either booleanResponseFormatEither = interfaceOperationValidationUtilTest .validateInterfaceOperations(operations, RESOURCE_ID, false); @@ -159,8 +174,10 @@ public class InterfaceOperationValidationTest implements InterfaceOperationTestU public void testInterfaceOperationUniqueInputParamNameValid() { operationInputDefinitionList.add(createMockOperationInputDefinition("label1")); operationInputDefinitionList.add(createMockOperationInputDefinition("label2")); + operationOutputDefinitionList.add(createMockOperationOutputDefinition("label1")); Collection operations = createInterfaceOperationData("op2", - "interface operation2",new ArtifactDefinition(), operationInputDefinitionList,"update"); + "interface operation2",new ArtifactDefinition(), operationInputDefinitionList, + operationOutputDefinitionList,"update"); Either booleanResponseFormatEither = interfaceOperationValidationUtilTest @@ -172,8 +189,10 @@ public class InterfaceOperationValidationTest implements InterfaceOperationTestU public void testInterfaceOperationeInputParamNameEmpty() { operationInputDefinitionList.add(createMockOperationInputDefinition(" ")); operationInputDefinitionList.add(createMockOperationInputDefinition("label1")); + operationOutputDefinitionList.add(createMockOperationOutputDefinition("label1")); Collection operations = createInterfaceOperationData("op2", - "interface operation2",new ArtifactDefinition(), operationInputDefinitionList,"update"); + "interface operation2",new ArtifactDefinition(), operationInputDefinitionList, + operationOutputDefinitionList,"update"); Either booleanResponseFormatEither = interfaceOperationValidationUtilTest @@ -182,8 +201,9 @@ public class InterfaceOperationValidationTest implements InterfaceOperationTestU } private Set createInterfaceOperationData( String uniqueID, String description, ArtifactDefinition artifactDefinition, - ListDataDefinition inputs, String name) { - return Sets.newHashSet(createInterfaceOperation(uniqueID, description, artifactDefinition, inputs, name)); + ListDataDefinition inputs, + ListDataDefinition outputs, String name) { + return Sets.newHashSet(createInterfaceOperation(uniqueID, description, artifactDefinition, inputs, outputs, name)); } private Either getToscaFullElement() { diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/datamodel/utils/InterfaceUIDataConverterTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/datamodel/utils/InterfaceUIDataConverterTest.java index 5ed11a553e..b158ddf5da 100644 --- a/catalog-be/src/test/java/org/openecomp/sdc/be/datamodel/utils/InterfaceUIDataConverterTest.java +++ b/catalog-be/src/test/java/org/openecomp/sdc/be/datamodel/utils/InterfaceUIDataConverterTest.java @@ -9,6 +9,7 @@ import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition; import org.openecomp.sdc.be.datatypes.elements.InterfaceOperationDataDefinition; import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition; import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition; +import org.openecomp.sdc.be.datatypes.elements.OperationOutputDefinition; import org.openecomp.sdc.be.model.Operation; public class InterfaceUIDataConverterTest { @@ -27,7 +28,9 @@ public class InterfaceUIDataConverterTest { Operation operationData = new Operation(); InterfaceOperationDataDefinition result; ListDataDefinition inputs = new ListDataDefinition<>(); + ListDataDefinition outputs = new ListDataDefinition<>(); operationData.setInputs(inputs); + operationData.setOutputs(outputs); operationData.setImplementation(new ArtifactDataDefinition()); // default test result = InterfaceUIDataConverter.convertOperationDataToInterfaceData(operationData); -- cgit 1.2.3-korg