From 87511869a3e3ca3c147f072b49371874e1336d74 Mon Sep 17 00:00:00 2001 From: Pavel Aharoni Date: Mon, 8 May 2017 13:19:36 +0300 Subject: [PATCH] [SDC-16] JTosca support of input complex types Change-Id: Id146b4da662c0aab5edcf637206e8d2c922c9b81 Signed-off-by: Pavel Aharoni --- jtosca/pom.xml | 2 +- .../sdc/toscaparser/api/TopologyTemplate.java | 44 +++++---------------- .../sdc/toscaparser/api/parameters/Input.java | 31 ++++++++++----- sdc-tosca-parser/pom.xml | 2 +- .../sdc/impl/ToscaParserNodeTemplateTest.java | 11 +++++- .../csars/service-ServiceFdnt-with-allotted.csar | Bin 44991 -> 44976 bytes 6 files changed, 43 insertions(+), 47 deletions(-) diff --git a/jtosca/pom.xml b/jtosca/pom.xml index 847579c..f74988b 100644 --- a/jtosca/pom.xml +++ b/jtosca/pom.xml @@ -9,7 +9,7 @@ jtosca - 0.1.1-SNAPSHOT + 0.1.2-SNAPSHOT diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/TopologyTemplate.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/TopologyTemplate.java index bf1851c..39536ca 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/TopologyTemplate.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/TopologyTemplate.java @@ -5,11 +5,8 @@ import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; -import org.openecomp.sdc.toscaparser.api.SubstitutionMappings; -import org.openecomp.sdc.toscaparser.api.ToscaGraph; import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector; import org.openecomp.sdc.toscaparser.api.elements.InterfacesDef; -import org.openecomp.sdc.toscaparser.api.elements.Metadata; import org.openecomp.sdc.toscaparser.api.elements.NodeType; import org.openecomp.sdc.toscaparser.api.elements.RelationshipType; import org.openecomp.sdc.toscaparser.api.functions.Function; @@ -17,12 +14,9 @@ import org.openecomp.sdc.toscaparser.api.functions.GetAttribute; import org.openecomp.sdc.toscaparser.api.functions.GetInput; import org.openecomp.sdc.toscaparser.api.parameters.Input; import org.openecomp.sdc.toscaparser.api.parameters.Output; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class TopologyTemplate { - private static Logger log = LoggerFactory.getLogger(TopologyTemplate.class.getName()); private static final String DESCRIPTION = "description"; private static final String INPUTS = "inputs"; private static final String NODE_TEMPLATES = "node_templates"; @@ -39,7 +33,7 @@ public class TopologyTemplate { }; private LinkedHashMap tpl; - Metadata metaData; + LinkedHashMap metaData; private ArrayList inputs; private ArrayList outputs; private ArrayList relationshipTemplates; @@ -86,10 +80,11 @@ public class TopologyTemplate { @SuppressWarnings("unchecked") private ArrayList _inputs() { + //DumpUtils.dumpYaml(customDefs,0); ArrayList alInputs = new ArrayList<>(); for(String name: _tplInputs().keySet()) { Object attrs = _tplInputs().get(name); - Input input = new Input(name,(LinkedHashMap)attrs); + Input input = new Input(name,(LinkedHashMap)attrs,customDefs);//ATT-CDT if(parsedParams != null && parsedParams.get(name) != null) { input.validate(parsedParams.get(name)); } @@ -101,7 +96,7 @@ public class TopologyTemplate { } if((parsedParams != null && parsedParams.get(input.getName()) == null || parsedParams == null) && input.isRequired() && input.getDefault() == null) { - log.error("Log warning: TopologyTemplate - _inputs - The required parameter {} is not provided", input.getName()); + System.out.format("Log warning: The required parameter \"%s\" is not provided\n",input.getName()); } alInputs.add(input); } @@ -109,12 +104,12 @@ public class TopologyTemplate { } - private Metadata _metaData() { + private LinkedHashMap _metaData() { if(tpl.get(METADATA) != null) { - return (Metadata)tpl.get(METADATA); + return (LinkedHashMap)tpl.get(METADATA); } else { - return new Metadata(new LinkedHashMap<>()); + return new LinkedHashMap(); } } @@ -178,7 +173,7 @@ public class TopologyTemplate { nodeTemplates, inputs, outputs, - groups, + groups, //ATT addition subMappedNodeTemplate, customDefs); } @@ -511,7 +506,7 @@ public class TopologyTemplate { return tpl; } - public Metadata getMetadata() { + public LinkedHashMap getMetadata() { return metaData; } @@ -546,27 +541,6 @@ public class TopologyTemplate { public LinkedHashMap getParsedParams() { return parsedParams; } - - @Override - public String toString() { - return "TopologyTemplate{" + - "tpl=" + tpl + - ", metaData=" + metaData + - ", inputs=" + inputs + - ", outputs=" + outputs + - ", relationshipTemplates=" + relationshipTemplates + - ", nodeTemplates=" + nodeTemplates + - ", customDefs=" + customDefs + - ", relTypes=" + relTypes + - ", subMappedNodeTemplate=" + subMappedNodeTemplate + - ", groups=" + groups + - ", policies=" + policies + - ", parsedParams=" + parsedParams + - ", description='" + description + '\'' + - ", graph=" + graph + - ", substitutionMappings=" + substitutionMappings + - '}'; - } } /*python diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/parameters/Input.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/parameters/Input.java index bda15dc..2eb64e8 100644 --- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/parameters/Input.java +++ b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/parameters/Input.java @@ -25,11 +25,12 @@ public class Input { private String name; private Schema schema; + private LinkedHashMap customDefs;//ATT-CDT - - public Input(String _name,LinkedHashMap _schemaDict) { + public Input(String _name,LinkedHashMap _schemaDict,LinkedHashMap _customDefs) {//ATT-CDT name = _name; schema = new Schema(_name,_schemaDict); + customDefs = _customDefs;//ATT-CDT } public String getName() { @@ -89,6 +90,13 @@ public class Input { break; } } + //ATT-CDT + if(!bFound) { + if(customDefs.get(inputType) != null) { + bFound = true; + } + } + //ATT-CDT if(!bFound) { ExceptionCollector.appendException(String.format( "ValueError: Invalid type \"%s\"",inputType)); @@ -97,14 +105,19 @@ public class Input { private void _validateValue(Object value) { Object datatype = null; - if (EntityType.TOSCA_DEF != null && EntityType.TOSCA_DEF.size() > 0) { - if(EntityType.TOSCA_DEF.get(getType()) != null) { - datatype = EntityType.TOSCA_DEF.get(getType()); - } - else if(EntityType.TOSCA_DEF.get(EntityType.DATATYPE_NETWORK_PREFIX + getType()) != null) { - datatype = EntityType.TOSCA_DEF.get(EntityType.DATATYPE_NETWORK_PREFIX + getType()); - } + if(EntityType.TOSCA_DEF.get(getType()) != null) { + datatype = EntityType.TOSCA_DEF.get(getType()); + } + else if(EntityType.TOSCA_DEF.get(EntityType.DATATYPE_NETWORK_PREFIX + getType()) != null) { + datatype = EntityType.TOSCA_DEF.get(EntityType.DATATYPE_NETWORK_PREFIX + getType()); + } + //ATT-CDT + else if(customDefs.get(getType()) != null) { + datatype = customDefs.get(getType()); + DataEntity.validateDatatype(getType(),value,(LinkedHashMap)datatype,customDefs,null); + return; } + //ATT-CDT DataEntity.validateDatatype(getType(),value,null,(LinkedHashMap)datatype,null); } } diff --git a/sdc-tosca-parser/pom.xml b/sdc-tosca-parser/pom.xml index f05622f..6b370ce 100644 --- a/sdc-tosca-parser/pom.xml +++ b/sdc-tosca-parser/pom.xml @@ -71,7 +71,7 @@ org.openecomp.sdc.sdc-distribution-client jtosca - 0.1.1-SNAPSHOT + 0.1.2-SNAPSHOT diff --git a/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserNodeTemplateTest.java b/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserNodeTemplateTest.java index 7c30616..8c748f6 100644 --- a/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserNodeTemplateTest.java +++ b/sdc-tosca-parser/src/test/java/org/openecomp/sdc/impl/ToscaParserNodeTemplateTest.java @@ -45,10 +45,19 @@ public class ToscaParserNodeTemplateTest extends BasicTest { public void testNodeTemplateNestedProperty() throws SdcToscaParserException { List serviceVlList = ToscaParserTestSuite.fdntCsarHelper.getServiceVlList(); NodeTemplate nodeTemplate = serviceVlList.get(0); - System.out.println("node template " + nodeTemplate.toString()); + //System.out.println("node template " + nodeTemplate.toString()); assertEquals("24", ToscaParserTestSuite.fdntCsarHelper.getNodeTemplatePropertyLeafValue(nodeTemplate, "network_assignments#ipv4_subnet_default_assignment#cidr_mask")); assertEquals("7a6520b-9982354-ee82992c-105720", ToscaParserTestSuite.fdntCsarHelper.getNodeTemplatePropertyLeafValue(nodeTemplate, "network_flows#vpn_binding")); } + + @Test + public void testNodeTemplateNestedPropertyFromInput() throws SdcToscaParserException { + List serviceVfList = ToscaParserTestSuite.fdntCsarHelper.getServiceVfList(); + NodeTemplate nodeTemplate = serviceVfList.get(0); + //System.out.println("node template " + nodeTemplate.toString()); + assertEquals("true", ToscaParserTestSuite.fdntCsarHelper.getNodeTemplatePropertyLeafValue(nodeTemplate, "nf_naming#ecomp_generated_naming")); + assertEquals("FDNT_instance_VF_2", ToscaParserTestSuite.fdntCsarHelper.getNodeTemplatePropertyLeafValue(nodeTemplate, "nf_naming#naming_policy")); + } @Test public void testNodeTemplateNestedPropertyNotExists() throws SdcToscaParserException { diff --git a/sdc-tosca-parser/src/test/resources/csars/service-ServiceFdnt-with-allotted.csar b/sdc-tosca-parser/src/test/resources/csars/service-ServiceFdnt-with-allotted.csar index 41ee2c7ce3ab6e9c012b220d9463403f2b4eb051..a343e84d15aa1a522e3b4da966e1d336b9f214d6 100644 GIT binary patch delta 7645 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 AumAu6 delta 7679 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 -- 2.16.6