From 6018fb047963d151d77bf03f6f84446866a30899 Mon Sep 17 00:00:00 2001 From: Toshimichi Fukuda Date: Fri, 19 Apr 2019 17:57:30 +0900 Subject: Change for TOSCA v1.3 get_input Change-Id: I39c8917c8c984896769e08a39302a98bca94e282 Issue-ID: SDC-2046 Signed-off-by: Toshimichi Fukuda --- .../onap/sdc/toscaparser/api/ToscaTemplate.java | 54 ++++++++- .../sdc/toscaparser/api/functions/GetInput.java | 82 ++++++++++++-- .../onap/sdc/toscaparser/api/parameters/Input.java | 5 + .../onap/sdc/toscaparser/api/JToscaImportTest.java | 122 +++++++++++++++++++-- .../toscaparser/api/functions/GetInputTest.java | 96 ++++++++++++++++ .../resources/csars/dataTypes-test-service.csar | Bin 0 -> 46307 bytes src/test/resources/csars/listed_input.csar | Bin 0 -> 46229 bytes src/test/resources/csars/listed_input_ng.csar | Bin 0 -> 46232 bytes 8 files changed, 342 insertions(+), 17 deletions(-) create mode 100644 src/test/java/org/onap/sdc/toscaparser/api/functions/GetInputTest.java create mode 100644 src/test/resources/csars/dataTypes-test-service.csar create mode 100644 src/test/resources/csars/listed_input.csar create mode 100644 src/test/resources/csars/listed_input_ng.csar diff --git a/src/main/java/org/onap/sdc/toscaparser/api/ToscaTemplate.java b/src/main/java/org/onap/sdc/toscaparser/api/ToscaTemplate.java index b5ae4c4..6edc291 100644 --- a/src/main/java/org/onap/sdc/toscaparser/api/ToscaTemplate.java +++ b/src/main/java/org/onap/sdc/toscaparser/api/ToscaTemplate.java @@ -1,3 +1,22 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (c) 2017 AT&T Intellectual Property. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + * Modifications copyright (c) 2019 Fujitsu Limited. + * ================================================================================ + */ package org.onap.sdc.toscaparser.api; import java.io.File; @@ -22,6 +41,7 @@ import org.onap.sdc.toscaparser.api.common.JToscaException; import org.onap.sdc.toscaparser.api.common.JToscaValidationIssue; import org.onap.sdc.toscaparser.api.common.ValidationIssueCollector; import org.onap.sdc.toscaparser.api.elements.EntityType; +import org.onap.sdc.toscaparser.api.elements.DataType; import org.onap.sdc.toscaparser.api.elements.Metadata; import org.onap.sdc.toscaparser.api.extensions.ExtTools; import org.onap.sdc.toscaparser.api.parameters.Input; @@ -105,6 +125,7 @@ public class ToscaTemplate extends Object { private LinkedHashMap> metaProperties; private Set processedImports; private LinkedHashMap customDefsFinal = new LinkedHashMap<>(); + private HashSet dataTypes; public ToscaTemplate(String _path, LinkedHashMap _parsedParams, @@ -214,7 +235,8 @@ public class ToscaTemplate extends Object { this.metaData = _tplMetaData(); this.relationshipTypes = _tplRelationshipTypes(); this.description = _tplDescription(); - this.topologyTemplate = _topologyTemplate(); + this.dataTypes = getTopologyDataTypes(); + this.topologyTemplate = _topologyTemplate(); this.repositories = _tplRepositories(); if(topologyTemplate.getTpl() != null) { this.inputs = _inputs(); @@ -325,6 +347,27 @@ public class ToscaTemplate extends Object { return topologyTemplate.getGroups(); } + /** + * Read datatypes field + * @return return list of datatypes. + */ + @SuppressWarnings("unchecked") + private HashSet getTopologyDataTypes(){ + LinkedHashMap value = + (LinkedHashMap)tpl.get(DATA_TYPES); + HashSet datatypes = new HashSet<>(); + if(value != null) { + customDefsFinal.putAll(value); + for(Map.Entry me: value.entrySet()) { + DataType datatype = new DataType(me.getKey(), value); + datatypes.add(datatype); + } + } + + + return datatypes; + } + /** * This method is used to get consolidated custom definitions from all imports * It is logically divided in two parts to handle imports; map and list formats. @@ -855,6 +898,14 @@ public class ToscaTemplate extends Object { return nestedToscaTplsWithTopology; } + /** + * Get datatypes. + * @return return list of datatypes. + */ + public HashSet getDataTypes() { + return dataTypes; + } + @Override public String toString() { return "ToscaTemplate{" + @@ -883,6 +934,7 @@ public class ToscaTemplate extends Object { ", graph=" + graph + ", csarTempDir='" + csarTempDir + '\'' + ", nestingLoopCounter=" + nestingLoopCounter + + ", dataTypes=" + dataTypes + '}'; } diff --git a/src/main/java/org/onap/sdc/toscaparser/api/functions/GetInput.java b/src/main/java/org/onap/sdc/toscaparser/api/functions/GetInput.java index 24d5a18..026113e 100644 --- a/src/main/java/org/onap/sdc/toscaparser/api/functions/GetInput.java +++ b/src/main/java/org/onap/sdc/toscaparser/api/functions/GetInput.java @@ -1,3 +1,22 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (c) 2017 AT&T Intellectual Property. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + * Modifications copyright (c) 2019 Fujitsu Limited. + * ================================================================================ + */ package org.onap.sdc.toscaparser.api.functions; import org.onap.sdc.toscaparser.api.DataEntity; @@ -10,7 +29,13 @@ import java.util.ArrayList; import java.util.LinkedHashMap; public class GetInput extends Function { - + + public static final String INDEX = "INDEX"; + public static final String INPUTS = "inputs"; + public static final String TYPE = "type"; + public static final String PROPERTIES = "properties"; + public static final String ENTRY_SCHEMA = "entry_schema"; + public GetInput(TopologyTemplate toscaTpl, Object context, String name, ArrayList _args) { super(toscaTpl,context,name,_args); @@ -18,17 +43,13 @@ public class GetInput extends Function { @Override void validate() { + // if(args.size() != 1) { // //PA - changed to WARNING from CRITICAL after talking to Renana, 22/05/2017 // ThreadLocalsHolder.getCollector().appendWarning(String.format( // "ValueError: Expected one argument for function \"get_input\" but received \"%s\"", // args.toString())); // } - if(args.size() > 2) { - ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE009", String.format( - "ValueError: Expected max 2 arguments for function \"get_input\" but received \"%s\"", - args.size()))); - } boolean bFound = false; for(Input inp: toscaTpl.getInputs()) { if(inp.getName().equals(args.get(0))) { @@ -40,12 +61,48 @@ public class GetInput extends Function { ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE158", String.format( "UnknownInputError: Unknown input \"%s\"",args.get(0)))); } + else if(args.size() > 2){ + LinkedHashMap inputs = (LinkedHashMap)toscaTpl.getTpl().get(INPUTS); + LinkedHashMap data = (LinkedHashMap)inputs.get(getInputName()); + String type ; + + for(int argumentNumber=1;argumentNumber schema = (LinkedHashMap)data.get(ENTRY_SCHEMA); + dataTypeName=(String)schema.get(TYPE); + }else{ + dataTypeName=type; + } + //check property name + LinkedHashMap dataType = (LinkedHashMap)toscaTpl.getCustomDefs().get(dataTypeName); + if(dataType != null) { + LinkedHashMap props = (LinkedHashMap) dataType.get(PROPERTIES); + data = (LinkedHashMap)props.get(args.get(argumentNumber).toString()); + if(data != null) { + bFound = true; + } + } + } + if(!bFound){ + ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE282", String.format( + "UnknownDataType: Unknown data type \"%s\"",args.get(argumentNumber)))); + } + } + } } public Object result() { if(toscaTpl.getParsedParams() != null && toscaTpl.getParsedParams().get(getInputName()) != null) { - LinkedHashMap ttinp = (LinkedHashMap)toscaTpl.getTpl().get("inputs"); + LinkedHashMap ttinp = (LinkedHashMap)toscaTpl.getTpl().get(INPUTS); LinkedHashMap ttinpinp = (LinkedHashMap)ttinp.get(getInputName()); String type = (String)ttinpinp.get("type"); @@ -94,6 +151,15 @@ public class GetInput extends Function { return (String)args.get(0); } + public LinkedHashMap getEntrySchema() { + LinkedHashMap inputs = (LinkedHashMap)toscaTpl.getTpl().get(INPUTS); + LinkedHashMap inputValue = (LinkedHashMap)inputs.get(getInputName()); + return (LinkedHashMap)inputValue.get(ENTRY_SCHEMA); + } + + public ArrayList getArguments(){ + return args; + } } /*python @@ -136,4 +202,4 @@ def result(self): def input_name(self): return self.args[0] -*/ \ No newline at end of file +*/ diff --git a/src/main/java/org/onap/sdc/toscaparser/api/parameters/Input.java b/src/main/java/org/onap/sdc/toscaparser/api/parameters/Input.java index d59f406..5a6eb73 100644 --- a/src/main/java/org/onap/sdc/toscaparser/api/parameters/Input.java +++ b/src/main/java/org/onap/sdc/toscaparser/api/parameters/Input.java @@ -176,4 +176,9 @@ public class Input { public void resetAnnotaions(){ annotations = null; } + + public LinkedHashMap getEntrySchema() { + return schema.getEntrySchema(); + } + } diff --git a/src/test/java/org/onap/sdc/toscaparser/api/JToscaImportTest.java b/src/test/java/org/onap/sdc/toscaparser/api/JToscaImportTest.java index ff03aed..13e17ce 100644 --- a/src/test/java/org/onap/sdc/toscaparser/api/JToscaImportTest.java +++ b/src/test/java/org/onap/sdc/toscaparser/api/JToscaImportTest.java @@ -1,22 +1,41 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (c) 2017 AT&T Intellectual Property. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + * Modifications copyright (c) 2019 Fujitsu Limited. + * ================================================================================ + */ package org.onap.sdc.toscaparser.api; import org.junit.Test; import org.onap.sdc.toscaparser.api.common.JToscaException; +import org.onap.sdc.toscaparser.api.elements.DataType; +import org.onap.sdc.toscaparser.api.elements.PropertyDef; +import org.onap.sdc.toscaparser.api.elements.constraints.Schema; import org.onap.sdc.toscaparser.api.parameters.Annotation; import org.onap.sdc.toscaparser.api.parameters.Input; import org.onap.sdc.toscaparser.api.utils.ThreadLocalsHolder; import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.core.IsNull.notNullValue; +import static org.junit.Assert.*; public class JToscaImportTest { @@ -199,5 +218,92 @@ public class JToscaImportTest { assertEquals(source_type.get().getValue(), "HEAT"); } + private static final String TEST_DATATYPE_FILENAME ="csars/dataTypes-test-service.csar"; + private static final String TEST_DATATYPE_TEST1 = "TestType1"; + private static final String TEST_DATATYPE_TEST2 = "TestType2"; + private static final String TEST_DATATYPE_PROPERTY_STR = "strdata"; + private static final String TEST_DATATYPE_PROPERTY_INT = "intdata"; + private static final String TEST_DATATYPE_PROPERTY_LIST = "listdata"; + private static final String TEST_DATATYPE_PROPERTY_TYPE = "type"; + private static final String TEST_DATATYPE_PROPERTY_ENTRY_SCHEMA = "entry_schema"; + private static final String TEST_DATATYPE_TOSTRING = "data_types="; + @Test + public void testGetDataType() throws JToscaException { + String fileStr = JToscaImportTest.class.getClassLoader().getResource(TEST_DATATYPE_FILENAME).getFile(); + File file = new File(fileStr); + ToscaTemplate toscaTemplate = new ToscaTemplate(file.getAbsolutePath(), null, true, null); + HashSet dataTypes = toscaTemplate.getDataTypes(); + assertThat(dataTypes,notNullValue()); + assertThat(dataTypes.size(),is(2)); + + for(DataType dataType: dataTypes){ + LinkedHashMap properties; + PropertyDef property; + if(dataType.getType().equals(TEST_DATATYPE_TEST1)){ + properties = dataType.getAllProperties(); + property = properties.get(TEST_DATATYPE_PROPERTY_STR); + assertThat(property,notNullValue()); + assertThat(property.getName(),is(TEST_DATATYPE_PROPERTY_STR)); + assertThat( property.getSchema().get(TEST_DATATYPE_PROPERTY_TYPE),is(Schema.STRING)); + } + if(dataType.getType().equals(TEST_DATATYPE_TEST2)){ + properties = dataType.getAllProperties(); + property = properties.get(TEST_DATATYPE_PROPERTY_INT); + assertThat(property,notNullValue()); + assertThat(property.getName(),is(TEST_DATATYPE_PROPERTY_INT)); + assertThat(property.getSchema().get(TEST_DATATYPE_PROPERTY_TYPE),is(Schema.INTEGER)); + + property = properties.get(TEST_DATATYPE_PROPERTY_LIST); + assertThat(property,notNullValue()); + assertThat(property.getName(),is(TEST_DATATYPE_PROPERTY_LIST)); + assertThat(property.getSchema().get(TEST_DATATYPE_PROPERTY_TYPE),is(Schema.LIST)); + assertThat(property.getSchema().get(TEST_DATATYPE_PROPERTY_ENTRY_SCHEMA),is(TEST_DATATYPE_TEST1)); + + assertThat((LinkedHashMap) toscaTemplate.getTopologyTemplate().getCustomDefs().get(TEST_DATATYPE_TEST1),notNullValue()); + assertThat((LinkedHashMap) toscaTemplate.getTopologyTemplate().getCustomDefs().get(TEST_DATATYPE_TEST2),notNullValue()); + assertThat(toscaTemplate.toString(),containsString(TEST_DATATYPE_TOSTRING)); + } + } + + } + + @Test + public void testGetInputValidate() throws JToscaException { + String fileStr = JToscaImportTest.class.getClassLoader().getResource(TEST_DATATYPE_FILENAME).getFile(); + File file = new File(fileStr); + ToscaTemplate toscaTemplate = new ToscaTemplate(file.getAbsolutePath(), null, true, null); + HashSet dataTypes = toscaTemplate.getDataTypes(); + assertThat(dataTypes,notNullValue()); + assertThat(dataTypes.size(),is(2)); + + for(DataType dataType: dataTypes) { + LinkedHashMap properties; + PropertyDef property; + if(dataType.getType().equals(TEST_DATATYPE_TEST1)) { + properties = dataType.getAllProperties(); + property = properties.get(TEST_DATATYPE_PROPERTY_STR); + assertThat(property,notNullValue()); + assertThat(property.getName(),is(TEST_DATATYPE_PROPERTY_STR)); + assertThat(property.getSchema().get(TEST_DATATYPE_PROPERTY_TYPE),is(Schema.STRING)); + } + if(dataType.getType().equals(TEST_DATATYPE_TEST2)) { + properties = dataType.getAllProperties(); + property = properties.get(TEST_DATATYPE_PROPERTY_INT); + assertThat(property,notNullValue()); + assertThat(property.getName(),is(TEST_DATATYPE_PROPERTY_INT)); + assertThat(property.getSchema().get(TEST_DATATYPE_PROPERTY_TYPE),is(Schema.INTEGER)); + + property = properties.get(TEST_DATATYPE_PROPERTY_LIST); + assertThat(property,notNullValue()); + assertThat(property.getName(),is(TEST_DATATYPE_PROPERTY_LIST)); + assertThat(property.getSchema().get(TEST_DATATYPE_PROPERTY_TYPE),is(Schema.LIST)); + assertThat(property.getSchema().get(TEST_DATATYPE_PROPERTY_ENTRY_SCHEMA),is(TEST_DATATYPE_TEST1)); + + assertThat((LinkedHashMap) toscaTemplate.getTopologyTemplate().getCustomDefs().get(TEST_DATATYPE_TEST1),notNullValue()); + assertThat((LinkedHashMap) toscaTemplate.getTopologyTemplate().getCustomDefs().get(TEST_DATATYPE_TEST2),notNullValue()); + assertThat(toscaTemplate.toString(),containsString(TEST_DATATYPE_TOSTRING)); + } + } + } } diff --git a/src/test/java/org/onap/sdc/toscaparser/api/functions/GetInputTest.java b/src/test/java/org/onap/sdc/toscaparser/api/functions/GetInputTest.java new file mode 100644 index 0000000..577fb17 --- /dev/null +++ b/src/test/java/org/onap/sdc/toscaparser/api/functions/GetInputTest.java @@ -0,0 +1,96 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (c) 2019 Fujitsu 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. + * ============LICENSE_END========================================================= + */ +package org.onap.sdc.toscaparser.api.functions; + +import org.junit.Test; +import org.onap.sdc.toscaparser.api.*; +import org.onap.sdc.toscaparser.api.common.JToscaException; +import org.onap.sdc.toscaparser.api.elements.constraints.Schema; +import org.onap.sdc.toscaparser.api.parameters.Input; +import org.onap.sdc.toscaparser.api.utils.ThreadLocalsHolder; + +import java.io.File; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.*; + +public class GetInputTest { + + private static final String TEST_FILENAME = "csars/listed_input.csar"; + private static final String TEST_FILENAME_NG = "csars/listed_input_ng.csar"; + private static final String TEST_PROPERTY_ROLE = "role"; + private static final String TEST_PROPERTY_LONGITUDE = "longitude"; + private static final String TEST_DEFAULT_VALUE = "dsvpn-hub"; + private static final String TEST_DESCRIPTION_VALUE = "This is used for SDWAN only"; + private static final String TEST_INPUT_TYPE="type"; + private static final String TEST_INPUT_SCHEMA_TYPE="tosca.datatypes.siteresource.site"; + private static final String TEST_TOSTRING = "get_input:[sites, 1, longitude]"; + private static final String TEST_INPUT_SITES= "sites"; + + @Test + public void validate() throws JToscaException { + String fileStr = JToscaImportTest.class.getClassLoader().getResource(TEST_FILENAME).getFile(); + File file = new File(fileStr); + ToscaTemplate toscaTemplate = new ToscaTemplate(file.getAbsolutePath(), null, true, null, false); + NodeTemplate nodeTemplate = toscaTemplate.getNodeTemplates().get(1).getSubMappingToscaTemplate().getNodeTemplates().get(0); + ArrayList inputs = toscaTemplate.getNodeTemplates().get(1).getSubMappingToscaTemplate().getInputs(); + LinkedHashMap properties = nodeTemplate.getProperties(); + assertThat(properties,notNullValue()); + assertThat(properties.size(),is(14)); + + Property property = properties.get(TEST_PROPERTY_ROLE); + assertThat(properties,notNullValue()); + assertThat(property.getName(),is(TEST_PROPERTY_ROLE)); + assertThat(property.getType(),is(Schema.STRING)); + assertThat(property.getDefault(),is(TEST_DEFAULT_VALUE)); + assertThat(property.getDescription(),is(TEST_DESCRIPTION_VALUE)); + GetInput getInput= (GetInput)property.getValue(); + assertThat(getInput.getEntrySchema().get(TEST_INPUT_TYPE).toString(),is(TEST_INPUT_SCHEMA_TYPE)); + + property = properties.get(TEST_PROPERTY_LONGITUDE); + assertThat(properties,notNullValue()); + assertThat(property.getName(), is(TEST_PROPERTY_LONGITUDE)); + assertThat(property.getValue().toString(),is(TEST_TOSTRING)); + getInput= (GetInput)property.getValue(); + ArrayList getInputArguments = getInput.getArguments(); + assertThat(getInputArguments.size(),is(3)); + assertThat(getInputArguments.get(0).toString(), is(TEST_INPUT_SITES)); + assertThat(getInputArguments.get(1).toString(), is("1")); + assertThat(getInputArguments.get(2).toString(), is(TEST_PROPERTY_LONGITUDE)); + + Input in = inputs.get(10); + assertThat(in.getEntrySchema().get(TEST_INPUT_TYPE), is(TEST_INPUT_SCHEMA_TYPE)); + assertThat(in.getName(),is(TEST_INPUT_SITES)); + assertThat(in.getType(),is(Input.LIST)); + } + + @Test + public void validate_ng() throws JToscaException { + //invalid file + String fileStr = JToscaImportTest.class.getClassLoader().getResource(TEST_FILENAME_NG).getFile(); + File file = new File(fileStr); + ToscaTemplate toscaTemplate = new ToscaTemplate(file.getAbsolutePath(), null, true, null,false); + + List issues = ThreadLocalsHolder.getCollector().getValidationIssueReport(); + assertTrue(issues.stream().anyMatch(x -> x.contains("JE282"))); + } + } diff --git a/src/test/resources/csars/dataTypes-test-service.csar b/src/test/resources/csars/dataTypes-test-service.csar new file mode 100644 index 0000000..b4de177 Binary files /dev/null and b/src/test/resources/csars/dataTypes-test-service.csar differ diff --git a/src/test/resources/csars/listed_input.csar b/src/test/resources/csars/listed_input.csar new file mode 100644 index 0000000..445b91a Binary files /dev/null and b/src/test/resources/csars/listed_input.csar differ diff --git a/src/test/resources/csars/listed_input_ng.csar b/src/test/resources/csars/listed_input_ng.csar new file mode 100644 index 0000000..6b3402e Binary files /dev/null and b/src/test/resources/csars/listed_input_ng.csar differ -- cgit 1.2.3-korg