From 9220c7ac558a42f65c2df48337dfc8f03d6b129c Mon Sep 17 00:00:00 2001 From: "Manzon, Inna (im453s)" Date: Thu, 29 Nov 2018 17:26:34 +0200 Subject: [PATCH] Retrieve leaf property value by path Change-Id: I556f6bfaa3d7c96f9d1f26ae0fcba199d23800c7 Issue-ID: SDC-1982 Signed-off-by: Manzon, Inna (im453s) --- pom.xml | 2 +- .../onap/sdc/toscaparser/api/EntityTemplate.java | 19 +- .../java/org/onap/sdc/toscaparser/api/Group.java | 12 +- .../org/onap/sdc/toscaparser/api/NodeTemplate.java | 16 +- .../java/org/onap/sdc/toscaparser/api/Policy.java | 14 +- .../org/onap/sdc/toscaparser/api/Property.java | 212 ++++++++++++++++++++- .../sdc/toscaparser/api/RelationshipTemplate.java | 12 +- .../onap/sdc/toscaparser/api/TopologyTemplate.java | 41 ++-- .../api/elements/constraints/Schema.java | 10 + .../onap/sdc/toscaparser/api/JToscaImportTest.java | 33 ++++ .../api/elements/CalculatePropertyByPathTest.java | 147 ++++++++++++++ .../service-NetworkCloudVnfServiceMock-csar.csar | Bin 0 -> 60223 bytes version.properties | 2 +- 13 files changed, 474 insertions(+), 46 deletions(-) create mode 100644 src/test/java/org/onap/sdc/toscaparser/api/elements/CalculatePropertyByPathTest.java create mode 100644 src/test/resources/csars/service-NetworkCloudVnfServiceMock-csar.csar diff --git a/pom.xml b/pom.xml index 8e6c0f8..c75ce9b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.onap.sdc.jtosca jtosca - 1.4.9-SNAPSHOT + 1.4.10-SNAPSHOT sdc-jtosca diff --git a/src/main/java/org/onap/sdc/toscaparser/api/EntityTemplate.java b/src/main/java/org/onap/sdc/toscaparser/api/EntityTemplate.java index 637329e..2178be3 100644 --- a/src/main/java/org/onap/sdc/toscaparser/api/EntityTemplate.java +++ b/src/main/java/org/onap/sdc/toscaparser/api/EntityTemplate.java @@ -5,6 +5,7 @@ import org.onap.sdc.toscaparser.api.elements.*; import org.onap.sdc.toscaparser.api.utils.ThreadLocalsHolder; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.Map; @@ -51,16 +52,27 @@ public abstract class EntityTemplate { private ArrayList _requirements; private ArrayList _capabilities; + @Nullable + private NodeTemplate _parentNodeTemplate; + // dummy constructor for subclasses that don't want super public EntityTemplate() { return; } + public EntityTemplate(String _name, + LinkedHashMap _template, + String _entityName, + LinkedHashMap _customDef) { + this(_name, _template, _entityName, _customDef, null); + } + @SuppressWarnings("unchecked") public EntityTemplate(String _name, LinkedHashMap _template, String _entityName, - LinkedHashMap _customDef) { + LinkedHashMap _customDef, + NodeTemplate parentNodeTemplate) { name = _name; entityTpl = _template; customDef = _customDef; @@ -111,8 +123,13 @@ public abstract class EntityTemplate { _interfaces = null; _requirements = null; _capabilities = null; + _parentNodeTemplate = parentNodeTemplate; } + public NodeTemplate getParentNodeTemplate() { + return _parentNodeTemplate; + } + public String getType() { if(typeDefinition != null) { String clType = typeDefinition.getClass().getSimpleName(); diff --git a/src/main/java/org/onap/sdc/toscaparser/api/Group.java b/src/main/java/org/onap/sdc/toscaparser/api/Group.java index de031e6..15ddfb1 100644 --- a/src/main/java/org/onap/sdc/toscaparser/api/Group.java +++ b/src/main/java/org/onap/sdc/toscaparser/api/Group.java @@ -25,12 +25,18 @@ public class Group extends EntityTemplate { ArrayList memberNodes; LinkedHashMap customDef; Metadata metaData; - + + + public Group(String _name, LinkedHashMap _templates, + ArrayList _memberNodes, + LinkedHashMap _customDef){ + this(_name, _templates, _memberNodes, _customDef, null); + } public Group(String _name, LinkedHashMap _templates, ArrayList _memberNodes, - LinkedHashMap _customDef) { - super(_name, _templates, "group_type", _customDef); + LinkedHashMap _customDef, NodeTemplate parentNodeTemplate) { + super(_name, _templates, "group_type", _customDef, parentNodeTemplate); name = _name; tpl = _templates; diff --git a/src/main/java/org/onap/sdc/toscaparser/api/NodeTemplate.java b/src/main/java/org/onap/sdc/toscaparser/api/NodeTemplate.java index 270e908..eaa650b 100644 --- a/src/main/java/org/onap/sdc/toscaparser/api/NodeTemplate.java +++ b/src/main/java/org/onap/sdc/toscaparser/api/NodeTemplate.java @@ -29,15 +29,25 @@ public class NodeTemplate extends EntityTemplate { private static final String METADATA = "metadata"; + public NodeTemplate(String name, + LinkedHashMap ntnodeTemplates, + LinkedHashMap ntcustomDef, + ArrayList ntavailableRelTpls, + LinkedHashMap ntavailableRelTypes) { + this( name, ntnodeTemplates, ntcustomDef, ntavailableRelTpls, + ntavailableRelTypes, null); + } @SuppressWarnings("unchecked") public NodeTemplate(String name, LinkedHashMap ntnodeTemplates, LinkedHashMap ntcustomDef, ArrayList ntavailableRelTpls, - LinkedHashMap ntavailableRelTypes) { + LinkedHashMap ntavailableRelTypes, + NodeTemplate parentNodeTemplate) { - super(name, (LinkedHashMap)ntnodeTemplates.get(name), "node_type", ntcustomDef); + super(name, (LinkedHashMap)ntnodeTemplates.get(name), + "node_type", ntcustomDef, parentNodeTemplate); templates = ntnodeTemplates; _validateFields((LinkedHashMap)templates.get(name)); @@ -209,7 +219,7 @@ public class NodeTemplate extends EntityTemplate { LinkedHashMap req = new LinkedHashMap<>(); req.put("relationship", CopyUtils.copyLhmOrAl(requirement.getRelationship())); req.put("type",rtype); - RelationshipTemplate tpl = new RelationshipTemplate(req, rtype, customDef, this, source); + RelationshipTemplate tpl = new RelationshipTemplate(req, rtype, customDef, this, source, getParentNodeTemplate()); relationshipTpl.add(tpl); } diff --git a/src/main/java/org/onap/sdc/toscaparser/api/Policy.java b/src/main/java/org/onap/sdc/toscaparser/api/Policy.java index 9eaacfc..5945532 100644 --- a/src/main/java/org/onap/sdc/toscaparser/api/Policy.java +++ b/src/main/java/org/onap/sdc/toscaparser/api/Policy.java @@ -28,14 +28,22 @@ public class Policy extends EntityTemplate { String targetsType; ArrayList triggers; LinkedHashMap properties; - + public Policy(String _name, LinkedHashMap _policy, -// ArrayList targetObjects, ArrayList targetObjects, String _targetsType, LinkedHashMap _customDef) { - super(_name,_policy,"policy_type",_customDef); + this(_name, _policy, targetObjects, _targetsType, _customDef, null); + } + + public Policy(String _name, + LinkedHashMap _policy, +// ArrayList targetObjects, + ArrayList targetObjects, + String _targetsType, + LinkedHashMap _customDef, NodeTemplate parentNodeTemplate) { + super(_name,_policy,"policy_type",_customDef, parentNodeTemplate); if(_policy.get(METADATA) != null) { LinkedHashMap metadataMap = (LinkedHashMap)_policy.get(METADATA); diff --git a/src/main/java/org/onap/sdc/toscaparser/api/Property.java b/src/main/java/org/onap/sdc/toscaparser/api/Property.java index 6d05af0..0ef9dd1 100644 --- a/src/main/java/org/onap/sdc/toscaparser/api/Property.java +++ b/src/main/java/org/onap/sdc/toscaparser/api/Property.java @@ -1,29 +1,38 @@ package org.onap.sdc.toscaparser.api; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.Map; - -import org.onap.sdc.toscaparser.api.elements.PropertyDef; -import org.onap.sdc.toscaparser.api.elements.StatefulEntityType; +import com.google.common.collect.Lists; import org.onap.sdc.toscaparser.api.elements.constraints.Constraint; import org.onap.sdc.toscaparser.api.elements.constraints.Schema; import org.onap.sdc.toscaparser.api.functions.Function; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; public class Property { // TOSCA built-in Property type + private static final Logger logger = LoggerFactory.getLogger(Property.class.getName()); private static final String TYPE = "type"; private static final String REQUIRED = "required"; private static final String DESCRIPTION = "description"; private static final String DEFAULT = "default"; private static final String CONSTRAINTS = "constraints"; - + private static String ENTRY_SCHEMA = "entry_schema"; + private static String DATA_TYPE = "datatypes"; + private static final String[] PROPERTY_KEYS = { TYPE, REQUIRED, DESCRIPTION, DEFAULT, CONSTRAINTS}; private static final String ENTRYTYPE = "type"; private static final String ENTRYPROPERTIES = "properties"; + private static final String PATH_DELIMITER = "#"; private static final String[] ENTRY_SCHEMA_KEYS = { ENTRYTYPE, ENTRYPROPERTIES}; @@ -117,6 +126,195 @@ public class Property { ", customDef=" + customDef + '}'; } + + /** + * Retrieves property value as list of strings if
+ * - the value is simple
+ * - the value is list of simple values
+ * - the provided path refers to a simple property inside a data type
+ * @param propertyPath valid name of property for search.
+ * If a name refers to a simple field inside a datatype, the property name should be defined with # delimiter.
+ * + * @return List of property values. If not found, empty list will be returned.
+ * If property value is a list either of simple fields or of simple fields inside a datatype, all values from the list should be returned + */ + public List getLeafPropertyValue(String propertyPath) { + List propertyValueList = Collections.emptyList(); + + if (logger.isDebugEnabled()) { + logger.debug("getLeafPropertyValue=> A new request: propertyPath: {}, value: {}", propertyPath, getValue()); + } + if (propertyPath == null || getValue() == null || + //if entry_schema disappears, it is datatype, + // otherwise it is map of simple types - should be ignored + isValueMapOfSimpleTypes()) { + logger.error("It is a wrong request - ignoring! propertyPath: {}, value: {}", propertyPath, getValue()); + return propertyValueList; + } + String[] path = propertyPath.split(PATH_DELIMITER); + + if (Schema.isRequestedTypeSimple(getPropertyTypeByPath(path))) { + //the internal property type in the path is either simple or list of simple types + if (isValueInsideDataType()) { + if (logger.isDebugEnabled()) { + logger.debug("The requested is an internal simple property inside of a data type"); + } + //requested value is an internal simple property inside of a data type + propertyValueList = getSimplePropertyValueForComplexType(path); + } + else { + if (logger.isDebugEnabled()) { + logger.debug("The requested property has simple type or list of simple types"); + } + //the requested property is simple type or list of simple types + propertyValueList = getSimplePropertyValueForSimpleType(); + } + } + return propertyValueList; + } + + private boolean isValueMapOfSimpleTypes() { + if (getValue() instanceof Map && getEntrySchema() != null) { + logger.warn("This property value is a map of simple types"); + return true; + } + return false; + } + + private boolean isValueInsideDataType() { + //value is either a list of values for data type + //or data type + return (Schema.LIST.equals(getType()) && isDataTypeInEntrySchema()) + || (getEntrySchema() == null && getType().contains(DATA_TYPE)); + } + + private Object getSimpleValueFromComplexObject(Object current, String[] path) { + if (current == null) { + return null; + } + int index = 0; + + if (path.length > index) { + for (int i = index; i < path.length; i++) { + if (current instanceof Map) { + current = ((Map) current).get(path[i]); + } else if (current instanceof List) { + current = ((List) current).get(0); + i--; + } + else { + return null; + } + } + } + if (current != null) { + return current; + } + return null; + } + + private List getSimplePropertyValueForSimpleType() { + if (getValue() instanceof List || getValue() instanceof Map) { + return getSimplePropertyValueForComplexType(null); + } + return Lists.newArrayList(String.valueOf(value)); + } + + private List getSimplePropertyValueForComplexType(String[] path) { + if (getValue() instanceof List ) { + return ((List) getValue()).stream() + .map(v -> { + if (path != null) { + return getSimpleValueFromComplexObject(v, path); + } else { + return v; + } + }) + //it might be null when get_input can't be resolved + // e.g.: + // - get_input has two parameters: 1. list and 2. index in this list + //and list has no value + // - neither value no default is defined for get_input + .filter(Objects::nonNull) + .map(String::valueOf) + .collect(Collectors.toList()); + } + //it is data type + List valueList = Lists.newArrayList(); + String valueString = String.valueOf(getSimpleValueFromComplexObject(getValue(), path)); + if (Objects.nonNull(valueString)) { + valueList.add(valueString); + } + return valueList; + } + + private String getPropertyTypeByPath(String[] path) { + String propertyType = calculatePropertyType(); + + if (path.length > 0 && !path[0].isEmpty()) { + return getInternalPropertyType(propertyType, path, 0); + } + return propertyType; + } + + private String calculatePropertyType() { + String propertyType = getType(); + if (Schema.LIST.equals(propertyType)) { + //if it is list, return entry schema type + return (String)getEntrySchema().get(ENTRYTYPE); + } + return propertyType; + } + + private String calculatePropertyType(LinkedHashMap property) { + String type = (String) property.get(TYPE); + if (Schema.LIST.equals(type)) { + //it might be a data type + return getEntrySchemaType(property); + } + return type; + } + + private String getInternalPropertyType(String dataTypeName, String[] path, int index) { + if (path.length > index) { + LinkedHashMap complexProperty = (LinkedHashMap)customDef.get(dataTypeName); + if (complexProperty != null) { + LinkedHashMap dataTypeProperties = (LinkedHashMap) complexProperty.get(ENTRYPROPERTIES); + return getPropertyTypeFromCustomDefDeeply(path, index, dataTypeProperties); + } + } + //stop searching - seems as wrong flow: the path is finished but the value is not found yet + return null; + } + + private String getEntrySchemaType(LinkedHashMap property) { + LinkedHashMap entrySchema = (LinkedHashMap)property.get(ENTRY_SCHEMA); + if (entrySchema != null) { + return (String) entrySchema.get(TYPE); + } + return null; + } + + private String getPropertyTypeFromCustomDefDeeply(String[] path, int index, LinkedHashMap properties) { + if (properties != null) { + LinkedHashMap foundProperty = (LinkedHashMap) (properties).get(path[index]); + if (foundProperty != null) { + String propertyType = calculatePropertyType(foundProperty); + if (propertyType == null || index == path.length - 1){ + return propertyType; + } + return getInternalPropertyType(propertyType, path, index + 1); + } + } + return null; + } + + private boolean isDataTypeInEntrySchema() { + String entrySchemaType = (String)getEntrySchema().get(ENTRYTYPE); + return entrySchemaType != null && entrySchemaType.contains(DATA_TYPE); + } + + } /*python diff --git a/src/main/java/org/onap/sdc/toscaparser/api/RelationshipTemplate.java b/src/main/java/org/onap/sdc/toscaparser/api/RelationshipTemplate.java index a94caed..79bf83b 100644 --- a/src/main/java/org/onap/sdc/toscaparser/api/RelationshipTemplate.java +++ b/src/main/java/org/onap/sdc/toscaparser/api/RelationshipTemplate.java @@ -24,13 +24,21 @@ public class RelationshipTemplate extends EntityTemplate { private NodeTemplate target; private NodeTemplate source; private ArrayList _properties; - + public RelationshipTemplate(LinkedHashMap rtrelationshipTemplate, String rtname, LinkedHashMap rtcustomDef, NodeTemplate rttarget, NodeTemplate rtsource) { - super(rtname,rtrelationshipTemplate,"relationship_type",rtcustomDef); + this(rtrelationshipTemplate, rtname, rtcustomDef, rttarget, rtsource, null); + } + + public RelationshipTemplate(LinkedHashMap rtrelationshipTemplate, + String rtname, + LinkedHashMap rtcustomDef, + NodeTemplate rttarget, + NodeTemplate rtsource, NodeTemplate parentNodeTemplate) { + super(rtname,rtrelationshipTemplate,"relationship_type",rtcustomDef, parentNodeTemplate); name = rtname; target = rttarget; diff --git a/src/main/java/org/onap/sdc/toscaparser/api/TopologyTemplate.java b/src/main/java/org/onap/sdc/toscaparser/api/TopologyTemplate.java index 4c9a53d..0b1dfcd 100644 --- a/src/main/java/org/onap/sdc/toscaparser/api/TopologyTemplate.java +++ b/src/main/java/org/onap/sdc/toscaparser/api/TopologyTemplate.java @@ -71,6 +71,7 @@ public class TopologyTemplate { description = _tplDescription(); inputs = _inputs(); relationshipTemplates =_relationshipTemplates(); + //todo: pass subMappedNodeTemplate to ET constractor nodeTemplates = _nodeTemplates(); outputs = _outputs(); if(nodeTemplates != null) { @@ -128,7 +129,8 @@ public class TopologyTemplate { tpls, customDefs, relationshipTemplates, - relTypes); + relTypes, + subMappedNodeTemplate); if(tpl.getTypeDefinition() != null) { boolean b = NodeType.TOSCA_DEF.get(tpl.getType()) != null; if(b || (tpl.getCustomDef() != null && !tpl.getCustomDef().isEmpty())) { @@ -148,7 +150,7 @@ public class TopologyTemplate { if(tpls != null) { for(String name: tpls.keySet()) { RelationshipTemplate tpl = new RelationshipTemplate( - (LinkedHashMap)tpls.get(name),name,customDefs,null,null); + (LinkedHashMap)tpls.get(name),name,customDefs,null,null, subMappedNodeTemplate); alRelationshipTemplates.add(tpl); } @@ -216,7 +218,8 @@ public class TopologyTemplate { policyTpl, targetObjects, targetsType, - customDefs); + customDefs, + subMappedNodeTemplate); alPolicies.add(policyObj); } return alPolicies; @@ -244,7 +247,7 @@ public class TopologyTemplate { Group group = new Group(groupName, groupTpl, memberNodes, - customDefs); + customDefs, subMappedNodeTemplate); groups.add(group); } return groups; @@ -314,9 +317,7 @@ public class TopologyTemplate { if(tpl.get(INPUTS) != null) { return (LinkedHashMap)tpl.get(INPUTS); } - else { - return new LinkedHashMap(); - } + return new LinkedHashMap(); } @SuppressWarnings("unchecked") @@ -329,19 +330,15 @@ public class TopologyTemplate { if(tpl.get(RELATIONSHIP_TEMPLATES) != null) { return (LinkedHashMap)tpl.get(RELATIONSHIP_TEMPLATES); } - else { - return new LinkedHashMap(); - } + return new LinkedHashMap(); } @SuppressWarnings("unchecked") private LinkedHashMap _tplOutputs() { - if(tpl.get(OUTPUTS) != null) { - return (LinkedHashMap)tpl.get(OUTPUTS); - } - else { - return new LinkedHashMap(); - } + if(tpl.get(OUTPUTS) != null) { + return (LinkedHashMap)tpl.get(OUTPUTS); + } + return new LinkedHashMap(); } @SuppressWarnings("unchecked") @@ -349,9 +346,7 @@ public class TopologyTemplate { if(tpl.get(SUBSTITUTION_MAPPINGS) != null) { return (LinkedHashMap)tpl.get(SUBSTITUTION_MAPPINGS); } - else { - return new LinkedHashMap(); - } + return new LinkedHashMap(); } @SuppressWarnings("unchecked") @@ -359,9 +354,7 @@ public class TopologyTemplate { if(tpl.get(GROUPS) != null) { return (LinkedHashMap)tpl.get(GROUPS); } - else { - return new LinkedHashMap(); - } + return new LinkedHashMap(); } @SuppressWarnings("unchecked") @@ -369,9 +362,7 @@ public class TopologyTemplate { if(tpl.get(POLICIES) != null) { return (LinkedHashMap)tpl.get(POLICIES); } - else { - return new LinkedHashMap<>(); - } + return new LinkedHashMap<>(); } private void _validateField() { diff --git a/src/main/java/org/onap/sdc/toscaparser/api/elements/constraints/Schema.java b/src/main/java/org/onap/sdc/toscaparser/api/elements/constraints/Schema.java index 73a63ef..c0ed6bc 100644 --- a/src/main/java/org/onap/sdc/toscaparser/api/elements/constraints/Schema.java +++ b/src/main/java/org/onap/sdc/toscaparser/api/elements/constraints/Schema.java @@ -4,6 +4,7 @@ import org.onap.sdc.toscaparser.api.common.JToscaValidationIssue; import org.onap.sdc.toscaparser.api.utils.ThreadLocalsHolder; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; @@ -42,6 +43,11 @@ public class Schema { INTEGER, STRING, BOOLEAN, FLOAT, RANGE,NUMBER, TIMESTAMP, LIST, MAP, SCALAR_UNIT_SIZE, SCALAR_UNIT_FREQUENCY, SCALAR_UNIT_TIME, VERSION, PORTDEF, PORTSPEC, JSON}; + + public static final String SIMPLE_PROPERTY_TYPES[] = { + INTEGER, STRING, BOOLEAN, FLOAT, RANGE,NUMBER, TIMESTAMP, + SCALAR_UNIT_SIZE, SCALAR_UNIT_FREQUENCY, SCALAR_UNIT_TIME, + VERSION}; @SuppressWarnings("unused") private static final String SCALAR_UNIT_SIZE_DEFAULT = "B"; @@ -107,6 +113,10 @@ public class Schema { return (String)schema.getOrDefault(STATUS,""); } + public static boolean isRequestedTypeSimple(String type) { + return Arrays.stream(SIMPLE_PROPERTY_TYPES).anyMatch(t->t.equals(type)); + } + @SuppressWarnings("unchecked") public ArrayList getConstraints() { if(constraintsList.size() == 0) { 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 8e587a9..c660153 100644 --- a/src/test/java/org/onap/sdc/toscaparser/api/JToscaImportTest.java +++ b/src/test/java/org/onap/sdc/toscaparser/api/JToscaImportTest.java @@ -13,6 +13,7 @@ import java.util.Optional; 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; @@ -111,6 +112,38 @@ public class JToscaImportTest { assertNull(nodeTemplate.getPropertyValueFromTemplatesByName("test")); } + @Test + public void testGetParentNodeTemplateTest() throws JToscaException { + + String fileStr = JToscaImportTest.class.getClassLoader().getResource("csars/service-AdiodVmxVpeBvService-csar.csar").getFile(); + File file = new File(fileStr); + ToscaTemplate toscaTemplate = new ToscaTemplate(file.getAbsolutePath(), null, true, null); + NodeTemplate nodeTemplate = toscaTemplate.getNodeTemplates().get(0); + //parent of this VF is service (null) + assertNull(nodeTemplate.getParentNodeTemplate()); + List children = nodeTemplate.getSubMappingToscaTemplate().getNodeTemplates(); + assertFalse(children.isEmpty()); + NodeTemplate cVFC = children.get(4); + //parent is the VF above + assertEquals("2017-488_ADIOD-vPE 0", cVFC.getParentNodeTemplate().getName()); + List children1 = cVFC.getSubMappingToscaTemplate().getNodeTemplates(); + assertFalse(children1.isEmpty()); + //parent is the CVFC above + assertEquals(cVFC, children1.get(0).getParentNodeTemplate()); + +/* + + TopologyTemplate tt = nodeTemplate.getOriginComponentTemplate(); + List groups = tt.getGroups(); + List policies = tt.getPolicies(); + + TopologyTemplate tt1 = cVFC.getOriginComponentTemplate(); + groups = tt.getGroups(); + policies = tt.getPolicies(); +*/ + + } + @Test public void testNullValueHasNoNullPointerException() throws JToscaException { diff --git a/src/test/java/org/onap/sdc/toscaparser/api/elements/CalculatePropertyByPathTest.java b/src/test/java/org/onap/sdc/toscaparser/api/elements/CalculatePropertyByPathTest.java new file mode 100644 index 0000000..59c8445 --- /dev/null +++ b/src/test/java/org/onap/sdc/toscaparser/api/elements/CalculatePropertyByPathTest.java @@ -0,0 +1,147 @@ +package org.onap.sdc.toscaparser.api.elements; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.onap.sdc.toscaparser.api.JToscaImportTest; +import org.onap.sdc.toscaparser.api.NodeTemplate; +import org.onap.sdc.toscaparser.api.Property; +import org.onap.sdc.toscaparser.api.ToscaTemplate; +import org.onap.sdc.toscaparser.api.common.JToscaException; + +import java.io.File; +import java.net.URL; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class CalculatePropertyByPathTest { + private static ToscaTemplate toscaTemplate; + + @BeforeClass + public static void setUpClass() throws JToscaException { + URL scarUrl = JToscaImportTest.class.getClassLoader().getResource("csars/service-NetworkCloudVnfServiceMock-csar.csar"); + if (scarUrl != null) { + File file = new File(scarUrl.getFile()); + toscaTemplate = new ToscaTemplate(file.getAbsolutePath(), null, true, null); + } + + } + + @Test + public void testGetPropertyWhenPropertyHasListOfDataTypesAndPathIsNotEmpty() throws JToscaException { + NodeTemplate cp = toscaTemplate.getNodeTemplates().get(0) //Network Cloud VNF MOCK 0 + .getSubMappingToscaTemplate().getNodeTemplates().get(0) //abstract_testVM + .getSubMappingToscaTemplate().getNodeTemplates().get(0); //testVM_testVM_SRIOVtrunk1_port + + Property property = cp.getProperties().get("related_networks"); + List propertyValueList = property.getLeafPropertyValue("related_network_role"); + assertEquals(3, propertyValueList.size()); + assertTrue(propertyValueList.contains("cor_direct_2")); + assertTrue(propertyValueList.contains("sgi_direct_2")); + assertTrue(propertyValueList.contains("int_imbl_2")); + } + + @Test + public void testGetPropertyWhenPropertyHasDataTypeAndPathIsEmpty() { + NodeTemplate cp = toscaTemplate.getNodeTemplates().get(0) //Network Cloud VNF MOCK 0 + .getSubMappingToscaTemplate().getNodeTemplates().get(0) //abstract_testVM + .getSubMappingToscaTemplate().getNodeTemplates().get(1); //testVM_testVM_SRIOVNonTrunk0_port + + Property property = cp.getProperties().get("exCP_naming"); + List propertyValueList = property.getLeafPropertyValue(""); + assertTrue(propertyValueList.isEmpty()); + } + + @Test + public void testGetPropertyWhenPropertyHasSimpleTypeAndValueAsGetInputIsNotResolvedCorrectlyAndPathIsEmpty() { + NodeTemplate cp = toscaTemplate.getNodeTemplates().get(0) //Network Cloud VNF MOCK 0 + .getSubMappingToscaTemplate().getNodeTemplates().get(0) //abstract_testVM + .getSubMappingToscaTemplate().getNodeTemplates().get(1); //testVM_testVM_SRIOVNonTrunk0_port + + Property property = cp.getProperties().get("network"); + List propertyValueList = property.getLeafPropertyValue(""); + assertTrue(propertyValueList.isEmpty()); + } + + @Test + public void testGetPropertyWhenPropertyHasSimpleTypeAndPathIsEmpty() { + NodeTemplate cp = toscaTemplate.getNodeTemplates().get(0) //Network Cloud VNF MOCK 0 + .getSubMappingToscaTemplate().getNodeTemplates().get(0) //abstract_testVM + .getSubMappingToscaTemplate().getNodeTemplates().get(1); //testVM_testVM_SRIOVNonTrunk0_port + + Property property = cp.getProperties().get("subinterface_indicator"); + List propertyValueList = property.getLeafPropertyValue(""); + assertEquals(1, propertyValueList.size()); + assertEquals("false", propertyValueList.get(0)); + } + + + @Test + public void testGetPropertyWhenPropertyHasDataTypeAndPathIsNotEmpty() { + NodeTemplate cp = toscaTemplate.getNodeTemplates().get(0) //Network Cloud VNF MOCK 0 + .getSubMappingToscaTemplate().getNodeTemplates().get(0) //abstract_testVM + .getSubMappingToscaTemplate().getNodeTemplates().get(2); //testVM_testVM_OVS_port + + Property property = cp.getProperties().get("ip_requirements"); + List propertyValueList = property.getLeafPropertyValue("ip_version"); + assertEquals(1, propertyValueList.size()); + assertEquals("4", propertyValueList.get(0)); + } + + @Test + public void testGetPropertyWhenPropertyHasListOfDataTypesAndPathIsNull() { + NodeTemplate cp = toscaTemplate.getNodeTemplates().get(0) //Network Cloud VNF MOCK 0 + .getSubMappingToscaTemplate().getNodeTemplates().get(0) //abstract_testVM + .getSubMappingToscaTemplate().getNodeTemplates().get(2); //testVM_testVM_OVS_port + + Property property = cp.getProperties().get("ip_requirements"); + assertTrue(property.getLeafPropertyValue(null).isEmpty()); + } + + @Test + public void testGetPropertyWhenPropertyHasListOfDataTypesAndPathIsComplex() { + NodeTemplate cp = toscaTemplate.getNodeTemplates().get(0) //Network Cloud VNF MOCK 0 + .getSubMappingToscaTemplate().getNodeTemplates().get(0) //abstract_testVM + .getSubMappingToscaTemplate().getNodeTemplates().get(0); //testVM_testVM_SRIOVtrunk1_port + + Property property = cp.getProperties().get("ip_requirements"); + List propertyValueList = property.getLeafPropertyValue("ip_count_required#is_required"); + assertEquals(1, propertyValueList.size()); + assertEquals("false", propertyValueList.get(0)); + } + + @Test + public void testGetPropertyWhenPropertyHasListOfDataTypesAndPathIsWrong() { + NodeTemplate cp = toscaTemplate.getNodeTemplates().get(0) //Network Cloud VNF MOCK 0 + .getSubMappingToscaTemplate().getNodeTemplates().get(0) //abstract_testVM + .getSubMappingToscaTemplate().getNodeTemplates().get(0); //testVM_testVM_SRIOVtrunk1_port + + Property property = cp.getProperties().get("ip_requirements"); + List propertyValueList = property.getLeafPropertyValue("ip_count_required#is_required_1"); + assertEquals(0, propertyValueList.size()); + } + + @Test + public void testGetPropertyWhenPropertyHasDataTypeWithoutSchemaAndComplexPath() { + NodeTemplate cp = toscaTemplate.getNodeTemplates().get(0) //Network Cloud VNF MOCK 0 + .getSubMappingToscaTemplate().getNodeTemplates().get(0) //abstract_testVM + .getSubMappingToscaTemplate().getNodeTemplates().get(0); //testVM_testVM_SRIOVtrunk1_port + + Property property = cp.getProperties().get("mac_requirements"); + List propertyValueList = property.getLeafPropertyValue("mac_count_required#is_required"); + assertEquals(1, propertyValueList.size()); + assertEquals("false", propertyValueList.get(0)); + } + + @Test + public void testGetPropertyWhenPropertyHasDataTypeWithoutSchemaAndSimplePath() { + NodeTemplate cp = toscaTemplate.getNodeTemplates().get(0) //Network Cloud VNF MOCK 0 + .getSubMappingToscaTemplate().getNodeTemplates().get(0) //abstract_testVM + .getSubMappingToscaTemplate().getNodeTemplates().get(0); //testVM_testVM_SRIOVtrunk1_port + + Property property = cp.getProperties().get("mac_requirements"); + List propertyValueList = property.getLeafPropertyValue("mac_count_required"); + assertEquals(0, propertyValueList.size()); + } +} diff --git a/src/test/resources/csars/service-NetworkCloudVnfServiceMock-csar.csar b/src/test/resources/csars/service-NetworkCloudVnfServiceMock-csar.csar new file mode 100644 index 0000000000000000000000000000000000000000..aabf83cdec3d769b41ea03b770f9346dcd62ca99 GIT binary patch literal 60223 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 E>oYu2mj>YqC5q8QGO;6)5;|Ifj@5R+~G9<)0CV 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 Va1fzE001BIN=5_#V%Hy!{sa6)i-iCH literal 0 HcmV?d00001 diff --git a/version.properties b/version.properties index 61bae76..3a44f58 100644 --- a/version.properties +++ b/version.properties @@ -5,7 +5,7 @@ major=1 minor=4 -patch=9 +patch=10 base_version=${major}.${minor}.${patch} -- 2.16.6