From 874bd9ed420ce8c281450e730d6d1ed3e3dc688e Mon Sep 17 00:00:00 2001 From: ojasdubey Date: Wed, 27 Jun 2018 14:59:48 +0530 Subject: Worklow Operation output tosca Added implementation to export workflow operation outputs to TOSCA template Change-Id: Id4c7104f725f7e9f5c97ae738387d2592bb80f7b Issue-ID: SDC-1450 Signed-off-by: ojasdubey --- .../openecomp/sdc/be/tosca/ToscaExportHandler.java | 2 +- .../sdc/be/tosca/model/ToscaAttribute.java | 69 +++++++++++++++ .../model/ToscaLifecycleOperationDefinition.java | 19 +++-- .../sdc/be/tosca/model/ToscaNodeType.java | 9 ++ .../tosca/utils/InterfacesOperationsToscaUtil.java | 99 +++++++++++++++++++--- .../utils/InterfaceUIDataConverterTest.java | 8 +- .../utils/InterfacesOperationsToscaUtilTest.java | 67 +++++++++++++-- 7 files changed, 236 insertions(+), 37 deletions(-) create mode 100644 catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaAttribute.java 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 8d8eac36b9..4455c3205a 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 @@ -577,10 +577,10 @@ public class ToscaExportHandler { inputDef.forEach(i -> { ToscaProperty property = propertyConvertor.convertProperty(dataTypes, i, false); inputs.put(i.getName(), property); - addInterfaceDefinitionElement(component, toscaNodeType); }); if (!inputs.isEmpty()) { toscaNodeType.setProperties(inputs); + addInterfaceDefinitionElement(component, toscaNodeType); } } diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaAttribute.java b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaAttribute.java new file mode 100644 index 0000000000..c32eed9d7a --- /dev/null +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaAttribute.java @@ -0,0 +1,69 @@ +/* + * Copyright © 2016-2018 European Support Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.openecomp.sdc.be.tosca.model; + +public class ToscaAttribute { + + private String type; + private String description; + private Object _defaultp_; + private String status; + private EntrySchema entry_schema; + + public ToscaAttribute() { + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Object getDefaultp() { + return _defaultp_; + } + + public void setDefaultp(Object defaultp) { + this._defaultp_ = defaultp; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public EntrySchema getEntry_schema() { + return entry_schema; + } + + public void setEntry_schema(EntrySchema entry_schema) { + this.entry_schema = entry_schema; + } +} diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaLifecycleOperationDefinition.java b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaLifecycleOperationDefinition.java index f801ac0264..3317778bfa 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaLifecycleOperationDefinition.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaLifecycleOperationDefinition.java @@ -19,16 +19,12 @@ package org.openecomp.sdc.be.tosca.model; import java.util.Map; import java.util.Objects; -/** - * @author KATYR - * @since March 26, 2018 - */ - public class ToscaLifecycleOperationDefinition { private String description; private String implementation; private Map inputs; + private Map outputs; public String getImplementation() { @@ -47,6 +43,13 @@ public class ToscaLifecycleOperationDefinition { this.inputs = inputs; } + public Map getOutputs() { + return outputs; + } + + public void setOutputs(Map outputs) { + this.outputs = outputs; + } @Override public boolean equals(Object o) { @@ -57,13 +60,13 @@ public class ToscaLifecycleOperationDefinition { return false; } ToscaLifecycleOperationDefinition that = (ToscaLifecycleOperationDefinition) o; - return Objects.equals(implementation, that.implementation) && Objects.equals(inputs, that.inputs); + return Objects.equals(implementation, that.implementation) && Objects.equals(inputs, that.inputs) + && Objects.equals(outputs, that.outputs); } @Override public int hashCode() { - - return Objects.hash(implementation, inputs); + return Objects.hash(implementation, inputs, outputs); } public String getDescription() { diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaNodeType.java b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaNodeType.java index 0d0cfb27b7..b6763ad6a1 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaNodeType.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaNodeType.java @@ -33,6 +33,7 @@ public class ToscaNodeType { private String description; private Map properties; + private Map attributes; private Map interfaces; //ToscaInterfaceDefinition private Map capabilities; @@ -46,6 +47,14 @@ public class ToscaNodeType { this.properties = properties; } + public Map getAttributes() { + return attributes; + } + + public void setAttributes(Map attributes) { + this.attributes = attributes; + } + public Map getCapabilities() { return capabilities; } diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/utils/InterfacesOperationsToscaUtil.java b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/utils/InterfacesOperationsToscaUtil.java index 8c9c63af03..81b5c99460 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/utils/InterfacesOperationsToscaUtil.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/utils/InterfacesOperationsToscaUtil.java @@ -16,30 +16,31 @@ package org.openecomp.sdc.be.tosca.utils; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; + import org.apache.commons.collections.MapUtils; import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition; import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition; +import org.openecomp.sdc.be.datatypes.elements.OperationOutputDefinition; import org.openecomp.sdc.be.model.Component; import org.openecomp.sdc.be.model.InterfaceDefinition; import org.openecomp.sdc.be.model.Product; import org.openecomp.sdc.be.model.Resource; import org.openecomp.sdc.be.model.Service; +import org.openecomp.sdc.be.tosca.model.ToscaAttribute; import org.openecomp.sdc.be.tosca.model.ToscaInterfaceDefinition; import org.openecomp.sdc.be.tosca.model.ToscaInterfaceNodeType; import org.openecomp.sdc.be.tosca.model.ToscaLifecycleOperationDefinition; import org.openecomp.sdc.be.tosca.model.ToscaNodeType; import org.openecomp.sdc.be.tosca.model.ToscaProperty; -/** - * @author KATYR - * @since March 20, 2018 - */ public class InterfacesOperationsToscaUtil { @@ -50,8 +51,10 @@ public class InterfacesOperationsToscaUtil { private static final String DEFAULT_HAS_UNDERSCORE = "_default"; private static final String DOT = "."; private static final String DEFAULT_INPUT_TYPE = "string"; + private static final String DEFAULT_OUTPUT_TYPE = "string"; private static final String SELF = "SELF"; private static final String GET_PROPERTY = "get_property"; + private static final String GET_OPERATION_OUTPUT = "get_operation_output"; private static final String DEFAULTP = "defaultp"; private InterfacesOperationsToscaUtil() { @@ -120,7 +123,7 @@ public class InterfacesOperationsToscaUtil { toscaInterfaceDefinition.setType(toscaResourceName); final Map operations = interfaceDefinition.getOperations(); Map toscaOperations = new HashMap<>(); - + String interfaceName = getLastPartOfName(toscaResourceName); String operationArtifactPath; for (Map.Entry operationEntry : operations.entrySet()) { ToscaLifecycleOperationDefinition toscaOperation = new ToscaLifecycleOperationDefinition(); @@ -132,8 +135,8 @@ public class InterfacesOperationsToscaUtil { toscaOperation.setImplementation(operationArtifactPath); } toscaOperation.setDescription(operationEntry.getValue().getDescription()); - fillToscaOperationInputs(operationEntry.getValue(), toscaOperation); - + fillToscaOperationInputs(operationEntry.getValue(), toscaOperation, nodeType); + fillToscaOperationOutputs(operationEntry.getValue(), toscaOperation, interfaceName, nodeType); toscaOperations.put(operationEntry.getValue().getName(), toscaOperation); } @@ -179,7 +182,8 @@ public class InterfacesOperationsToscaUtil { } private static void fillToscaOperationInputs(OperationDataDefinition operation, - ToscaLifecycleOperationDefinition toscaOperation) { + ToscaLifecycleOperationDefinition toscaOperation, + ToscaNodeType nodeType) { if (Objects.isNull(operation.getInputs()) || operation.getInputs().isEmpty()) { toscaOperation.setInputs(null); return; @@ -189,15 +193,55 @@ public class InterfacesOperationsToscaUtil { for (OperationInputDefinition input : operation.getInputs().getListToscaDataDefinition()) { ToscaProperty toscaInput = new ToscaProperty(); toscaInput.setDescription(input.getDescription()); - toscaInput.setType(DEFAULT_INPUT_TYPE); - - toscaInput.setDefaultp(createDefaultValue(getLastPartOfName(input.getInputId()))); + String mappedPropertyName = getLastPartOfName(input.getInputId()); + toscaInput.setType(getOperationInputType(mappedPropertyName, nodeType)); + toscaInput.setDefaultp(createDefaultValue(mappedPropertyName)); toscaInputs.put(input.getName(), toscaInput); } toscaOperation.setInputs(toscaInputs); } + private static void fillToscaOperationOutputs(OperationDataDefinition operation, + ToscaLifecycleOperationDefinition toscaOperation, + String interfaceName, + ToscaNodeType nodeType) { + if (Objects.isNull(operation.getOutputs()) || operation.getOutputs().isEmpty()) { + toscaOperation.setOutputs(null); + return; + } + Map toscaOutputs = new HashMap<>(); + for (OperationOutputDefinition output : operation.getOutputs().getListToscaDataDefinition()) { + if (Objects.nonNull(output.getInputId())) { + ToscaAttribute toscaOutput = new ToscaAttribute(); + toscaOutput.setDescription(output.getDescription()); + String outputName = output.getName(); + String mappedAttributeName = getLastPartOfName(output.getInputId()); + toscaOutput.setType(getOperationOutputType(mappedAttributeName, nodeType)); + toscaOutputs.put(outputName, toscaOutput); + createDefaultValueForMappedAttribute(nodeType, mappedAttributeName, outputName, interfaceName, + operation.getName()); + } + } + toscaOperation.setOutputs(toscaOutputs); + } + + private static String getOperationInputType(String inputName, ToscaNodeType nodeType) { + if (nodeType.getProperties() != null + && nodeType.getProperties().containsKey(inputName)) { + return nodeType.getProperties().get(inputName).getType(); + } + return DEFAULT_INPUT_TYPE; + } + + private static String getOperationOutputType(String inputName, ToscaNodeType nodeType) { + if (nodeType.getProperties() != null + && nodeType.getProperties().containsKey(inputName)) { + return nodeType.getProperties().get(inputName).getType(); + } + return DEFAULT_OUTPUT_TYPE; + } + private static Map> createDefaultValue(String propertyName) { Map> getPropertyMap = new HashMap<>(); List values = new ArrayList<>(); @@ -208,10 +252,41 @@ public class InterfacesOperationsToscaUtil { return getPropertyMap; } + private static Map> createAttributeDefaultValue(String outputName, + String interfaceName, + String operationName) { + Map> attributeDefaultValue = new HashMap<>(); + List values = new ArrayList<>(); + values.add(SELF); + values.add(interfaceName); + values.add(operationName); + values.add(outputName); + attributeDefaultValue.put(GET_OPERATION_OUTPUT, values); + return attributeDefaultValue; + } + + private static void createDefaultValueForMappedAttribute(ToscaNodeType nodeType, String mappedAttributeName, + String outputName, String interfaceName, String operationName) { + if (Objects.isNull(nodeType.getAttributes())) { + nodeType.setAttributes(new HashMap<>()); + } + if (!nodeType.getAttributes().containsKey(mappedAttributeName)) { + ToscaAttribute toscaAttribute = new ToscaAttribute(); + toscaAttribute.setType(getOperationOutputType(mappedAttributeName, nodeType)); + nodeType.getAttributes().put(mappedAttributeName, toscaAttribute); + } + nodeType.getAttributes().get(mappedAttributeName) + .setDefaultp(createAttributeDefaultValue(outputName, interfaceName, operationName)); + } private static Map getObjectAsMap(Object obj) { + ObjectMapper objectMapper = new ObjectMapper(); + if (obj instanceof ToscaInterfaceDefinition) { + //Prevent empty field serialization in interface definition + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + } Map objectAsMap = - obj instanceof Map ? (Map) obj : new ObjectMapper().convertValue(obj, Map.class); + obj instanceof Map ? (Map) obj : objectMapper.convertValue(obj, Map.class); if (objectAsMap.containsKey(DEFAULT)) { Object defaultValue = objectAsMap.get(DEFAULT); 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 b158ddf5da..7e8dde9842 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 @@ -1,15 +1,10 @@ package org.openecomp.sdc.be.datamodel.utils; -import static org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields.IO_INPUT_PARAMETERS; - -import java.util.LinkedList; - import org.junit.Test; 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 { @@ -28,9 +23,8 @@ public class InterfaceUIDataConverterTest { Operation operationData = new Operation(); InterfaceOperationDataDefinition result; ListDataDefinition inputs = new ListDataDefinition<>(); - ListDataDefinition outputs = new ListDataDefinition<>(); operationData.setInputs(inputs); - operationData.setOutputs(outputs); + operationData.setOutputs(new ListDataDefinition<>()); operationData.setImplementation(new ArtifactDataDefinition()); // default test result = InterfaceUIDataConverter.convertOperationDataToInterfaceData(operationData); diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/tosca/utils/InterfacesOperationsToscaUtilTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/tosca/utils/InterfacesOperationsToscaUtilTest.java index 67b27f678f..0c5db04bbd 100644 --- a/catalog-be/src/test/java/org/openecomp/sdc/be/tosca/utils/InterfacesOperationsToscaUtilTest.java +++ b/catalog-be/src/test/java/org/openecomp/sdc/be/tosca/utils/InterfacesOperationsToscaUtilTest.java @@ -27,6 +27,7 @@ import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition; import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition; import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition; import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition; +import org.openecomp.sdc.be.datatypes.elements.OperationOutputDefinition; import org.openecomp.sdc.be.model.Component; import org.openecomp.sdc.be.model.InterfaceDefinition; import org.openecomp.sdc.be.model.Resource; @@ -35,11 +36,6 @@ import org.openecomp.sdc.be.tosca.ToscaRepresentation; import org.openecomp.sdc.be.tosca.model.ToscaNodeType; import org.openecomp.sdc.be.tosca.model.ToscaTemplate; -/** - * @author KATYR - * @since April 12, 2018 - */ - public class InterfacesOperationsToscaUtilTest { @BeforeClass @@ -54,7 +50,7 @@ public class InterfacesOperationsToscaUtilTest { component.setNormalizedName("normalizedComponentName"); InterfaceDefinition addedInterface = new InterfaceDefinition(); addedInterface.setToscaResourceName("interface.types.test_resource_name"); - addOperationsToInterface(addedInterface, 5, 3, true); + addOperationsToInterface(addedInterface, 5, 3, 0, true, false); final String interfaceType = "normalizedComponentName-interface"; ((Resource) component).setInterfaces(new HashMap<>()); ((Resource) component).getInterfaces().put(interfaceType, addedInterface); @@ -77,7 +73,7 @@ public class InterfacesOperationsToscaUtilTest { InterfaceDefinition addedInterface = new InterfaceDefinition(); addedInterface.setToscaResourceName("com.some.resource.or.other.resourceName"); - addOperationsToInterface(addedInterface, 3, 2, true); + addOperationsToInterface(addedInterface, 3, 2, 0, true, false); final String interfaceType = "normalizedComponentName-interface"; ((Resource) component).setInterfaces(new HashMap<>()); ((Resource) component).getInterfaces().put(interfaceType, addedInterface); @@ -107,7 +103,7 @@ public class InterfacesOperationsToscaUtilTest { InterfaceDefinition addedInterface = new InterfaceDefinition(); addedInterface.setToscaResourceName("com.some.resource.or.other.resourceNameNoInputs"); - addOperationsToInterface(addedInterface, 3, 3, false); + addOperationsToInterface(addedInterface, 3, 3, 0, false, false); final String interfaceType = "normalizedComponentName-interface"; ((Resource) component).setInterfaces(new HashMap<>()); ((Resource) component).getInterfaces().put(interfaceType, addedInterface); @@ -129,9 +125,38 @@ public class InterfacesOperationsToscaUtilTest { Assert.assertTrue(toscaRepresentation.getMainYaml().contains("com.some.resource.or.other.resourceName")); } + @Test + public void addInterfaceDefinitionElementWithOutputs() { + Component component = new Resource(); + component.setNormalizedName("normalizedComponentName"); + InterfaceDefinition addedInterface = new InterfaceDefinition(); + addedInterface.setToscaResourceName("com.some.resource.or.other.resourceName"); + + addOperationsToInterface(addedInterface, 2, 0, 2, false, true); + final String interfaceType = "normalizedComponentName-interface"; + ((Resource) component).setInterfaces(new HashMap<>()); + ((Resource) component).getInterfaces().put(interfaceType, addedInterface); + ToscaNodeType nodeType = new ToscaNodeType(); + InterfacesOperationsToscaUtil.addInterfaceDefinitionElement(component, nodeType); + + ToscaExportHandler handler = new ToscaExportHandler(); + ToscaTemplate template = new ToscaTemplate("test"); + Map nodeTypes = new HashMap<>(); + nodeTypes.put("test", nodeType); + template.setNode_types(nodeTypes); + final ToscaRepresentation toscaRepresentation = handler.createToscaRepresentation(template); + + Assert.assertFalse(toscaRepresentation.getMainYaml().contains("operations")); + Assert.assertTrue(toscaRepresentation.getMainYaml().contains("resourceName:")); + Assert.assertTrue(toscaRepresentation.getMainYaml().contains("outputs:")); + Assert.assertFalse(toscaRepresentation.getMainYaml().contains("defaultp")); + Assert.assertTrue(toscaRepresentation.getMainYaml().contains("has description")); + Assert.assertTrue(toscaRepresentation.getMainYaml().contains("naming_function_")); + Assert.assertTrue(toscaRepresentation.getMainYaml().contains("com.some.resource.or.other.resourceName")); + } private void addOperationsToInterface(InterfaceDefinition addedInterface, int numOfOps, int numOfInputsPerOp, - boolean hasInputs) { + int numOfOutputsPerOp, boolean hasInputs, boolean hasOutputs) { addedInterface.setOperations(new HashMap<>()); for (int i = 0; i < numOfOps; i++) { @@ -144,6 +169,9 @@ public class InterfacesOperationsToscaUtilTest { if (hasInputs) { operation.setInputs(createInputs(numOfInputsPerOp)); } + if (hasOutputs) { + operation.setOutputs(createOutputs(numOfOutputsPerOp)); + } addedInterface.getOperations().put(operation.getName(), operation); } } @@ -158,6 +186,18 @@ public class InterfacesOperationsToscaUtilTest { return operationInputDefinitionList; } + private ListDataDefinition createOutputs(int numOfOutputs) { + ListDataDefinition operationOutputDefinitionList = new ListDataDefinition<>(); + for (int i = 0; i < numOfOutputs; i++) { + operationOutputDefinitionList.add(createMockOperationOutputDefinition("output_" + i, + java.util.UUID.randomUUID().toString() + "." + "naming_function_" + i, getTestOutputType(i))); + } + return operationOutputDefinitionList; + } + + private String getTestOutputType(int i) { + return i%2 == 0 ? "integer" : "boolean"; + } private OperationInputDefinition createMockOperationInputDefinition(String name, String id) { OperationInputDefinition operationInputDefinition = new OperationInputDefinition(); @@ -165,4 +205,13 @@ public class InterfacesOperationsToscaUtilTest { operationInputDefinition.setInputId(id); return operationInputDefinition; } + + private OperationOutputDefinition createMockOperationOutputDefinition(String name, String id, String type) { + OperationOutputDefinition operationOutputDefinition = new OperationOutputDefinition(); + operationOutputDefinition.setName(name); + operationOutputDefinition.setInputId(id); + operationOutputDefinition.setType(type); + return operationOutputDefinition; + } + } -- cgit 1.2.3-korg