From 974bbeb1ca432885c1569ec71c1b5060d5c1c519 Mon Sep 17 00:00:00 2001 From: vasraz Date: Tue, 19 Apr 2022 15:29:16 +0100 Subject: Update tosca parser for node template artifacts Signed-off-by: Vasyl Razinkov Change-Id: I824f69a771fb17f3ad8562a96c3670d87158dc6e Issue-ID: SDC-3965 --- .../onap/sdc/toscaparser/api/EntityTemplate.java | 330 +-------- .../org/onap/sdc/toscaparser/api/NodeTemplate.java | 390 ++--------- .../onap/sdc/toscaparser/api/ToscaTemplate.java | 176 +++-- .../sdc/toscaparser/api/elements/ArtifactDef.java | 55 ++ .../toscaparser/api/elements/ArtifactTypeDef.java | 45 +- .../toscaparser/api/elements/TypeValidation.java | 2 + .../sdc/tosca/parser/elements/EntityDetails.java | 3 +- .../parser/elements/NodeTemplateEntityDetails.java | 2 +- .../elements/queries/NodeTemplateEntityQuery.java | 4 +- .../elements/queries/TopologyTemplateQuery.java | 2 +- .../onap/sdc/tosca/parser/impl/QueryProcessor.java | 4 +- .../sdc/tosca/parser/impl/SdcCsarHelperImpl.java | 767 +++++++++++---------- .../tosca/parser/impl/SdcToscaParserFactory.java | 122 ++-- .../org/onap/sdc/impl/SdcToscaParserBasicTest.java | 19 +- .../onap/sdc/impl/ToscaParserArtifactsTest.java | 80 +++ .../onap/sdc/impl/ToscaParserNodeTemplateTest.java | 26 +- .../queries/TopologyTemplateQueryTest.java | 18 +- .../impl/ToscaParserNodeTemplateMockTest.java | 2 +- .../resources/csars/resource-VspWithArtifacts.csar | Bin 0 -> 70481 bytes 19 files changed, 774 insertions(+), 1273 deletions(-) create mode 100644 jtosca/src/main/java/org/onap/sdc/toscaparser/api/elements/ArtifactDef.java create mode 100644 sdc-tosca/src/test/java/org/onap/sdc/impl/ToscaParserArtifactsTest.java create mode 100644 sdc-tosca/src/test/resources/csars/resource-VspWithArtifacts.csar diff --git a/jtosca/src/main/java/org/onap/sdc/toscaparser/api/EntityTemplate.java b/jtosca/src/main/java/org/onap/sdc/toscaparser/api/EntityTemplate.java index 93bfe2b..9f8ccbd 100644 --- a/jtosca/src/main/java/org/onap/sdc/toscaparser/api/EntityTemplate.java +++ b/jtosca/src/main/java/org/onap/sdc/toscaparser/api/EntityTemplate.java @@ -107,12 +107,12 @@ public abstract class EntityTemplate { } } if (_entityName.equals("relationship_type")) { - Object relationship = _template.get("relationship"); + Object relationship = _template.get(RELATIONSHIP); type = null; if (relationship != null && relationship instanceof LinkedHashMap) { type = (String) ((LinkedHashMap) relationship).get("type"); } else if (relationship instanceof String) { - type = (String) entityTpl.get("relationship"); + type = (String) entityTpl.get(RELATIONSHIP); } else { type = (String) entityTpl.get("type"); } @@ -197,10 +197,9 @@ public abstract class EntityTemplate { for (String reqName : req.keySet()) { Object reqItem = req.get(reqName); if (reqItem instanceof LinkedHashMap) { - Object rel = ((LinkedHashMap) reqItem).get("relationship"); -// LinkedHashMap relationship = rel instanceof LinkedHashMap ? (LinkedHashMap) rel : null; + Object rel = ((LinkedHashMap) reqItem).get(RELATIONSHIP); String nodeName = ((LinkedHashMap) reqItem).get("node").toString(); - Object capability = ((LinkedHashMap) reqItem).get("capability"); + Object capability = ((LinkedHashMap) reqItem).get(CAPABILITY); String capabilityString = capability != null ? capability.toString() : null; reqs.add(new RequirementAssignment(reqName, nodeName, capabilityString, rel)); @@ -314,7 +313,7 @@ public abstract class EntityTemplate { } } // then update (if available) with the node properties - LinkedHashMap pp = (LinkedHashMap) props.get("properties"); + LinkedHashMap pp = (LinkedHashMap) props.get(PROPERTIES); if (pp != null) { properties.putAll(pp); } @@ -343,7 +342,7 @@ public abstract class EntityTemplate { LinkedHashMap capabilities = (LinkedHashMap) ((EntityType) typeDefinition).getValue(CAPABILITIES, entityTpl, false); if (capabilities != null) { - _commonValidateField(capabilities, allowedCaps, "capabilities"); + _commonValidateField(capabilities, allowedCaps, CAPABILITIES); _validateCapabilitiesProperties(capabilities); } } @@ -370,7 +369,7 @@ public abstract class EntityTemplate { int maxInstances = (int) propDict.get("max_instances"); int defaultInstances = (int) propDict.get("default_instances"); if (defaultInstances < minInstances || defaultInstances > maxInstances) { - //err_msg = ('"properties" of template "%s": ' + //err_msg = ('PROPERTIES of template "%s": ' // '"default_instances" value is not between ' // '"min_instances" and "max_instances".' % // self.name) @@ -396,7 +395,7 @@ public abstract class EntityTemplate { // validate all required properties have values if (properties != null) { ArrayList reqPropsNoValueOrDefault = new ArrayList(); - _commonValidateField(properties, allowedProps, "properties"); + _commonValidateField(properties, allowedProps, PROPERTIES); // make sure it's not missing any property required by a tosca type for (String r : requiredProps) { if (properties.get(r) == null) { @@ -427,12 +426,12 @@ public abstract class EntityTemplate { return;//??? } boolean bBad = false; - Object relationship = ((LinkedHashMap) template).get("relationship"); + Object relationship = ((LinkedHashMap) template).get(RELATIONSHIP); if (relationship != null) { if (!(relationship instanceof String)) { bBad = (((LinkedHashMap) relationship).get(TYPE) == null); } else if (relationship instanceof String) { - bBad = (template.get("relationship") == null); + bBad = (template.get(RELATIONSHIP) == null); } } else { bBad = (template.get(TYPE) == null); @@ -503,7 +502,7 @@ public abstract class EntityTemplate { Object relDef = relValue; LinkedHashMap rel = null; if (relDef instanceof LinkedHashMap) { - Object relob = ((LinkedHashMap) relDef).get("relationship"); + Object relob = ((LinkedHashMap) relDef).get(RELATIONSHIP); if (relob instanceof LinkedHashMap) { rel = (LinkedHashMap) relob; } @@ -576,310 +575,3 @@ public abstract class EntityTemplate { '}'; } } - -/*python - -class EntityTemplate(object): - '''Base class for TOSCA templates.''' - - SECTIONS = (DERIVED_FROM, PROPERTIES, REQUIREMENTS, - INTERFACES, CAPABILITIES, TYPE, DESCRIPTION, DIRECTIVES, - ATTRIBUTES, ARTIFACTS, NODE_FILTER, COPY) = \ - ('derived_from', 'properties', 'requirements', 'interfaces', - 'capabilities', 'type', 'description', 'directives', - 'attributes', 'artifacts', 'node_filter', 'copy') - REQUIREMENTS_SECTION = (NODE, CAPABILITY, RELATIONSHIP, OCCURRENCES, NODE_FILTER) = \ - ('node', 'capability', 'relationship', - 'occurrences', 'node_filter') - # Special key names - SPECIAL_SECTIONS = (METADATA) = ('metadata') - - def __init__(self, name, template, entity_name, custom_def=None): - self.name = name - self.entity_tpl = template - self.custom_def = custom_def - self._validate_field(self.entity_tpl) - type = self.entity_tpl.get('type') - UnsupportedType.validate_type(type) - if entity_name == 'node_type': - self.type_definition = NodeType(type, custom_def) \ - if type is not None else None - if entity_name == 'relationship_type': - relationship = template.get('relationship') - type = None - if relationship and isinstance(relationship, dict): - type = relationship.get('type') - elif isinstance(relationship, str): - type = self.entity_tpl['relationship'] - else: - type = self.entity_tpl['type'] - UnsupportedType.validate_type(type) - self.type_definition = RelationshipType(type, - None, custom_def) - if entity_name == 'policy_type': - if not type: - msg = (_('Policy definition of "%(pname)s" must have' - ' a "type" ''attribute.') % dict(pname=name)) - ValidationIssueCollector.appendException( - ValidationError(msg)) - - self.type_definition = PolicyType(type, custom_def) - if entity_name == 'group_type': - self.type_definition = GroupType(type, custom_def) \ - if type is not None else None - self._properties = None - self._interfaces = None - self._requirements = None - self._capabilities = None - - @property - def type(self): - if self.type_definition: - return self.type_definition.type - - @property - def parent_type(self): - if self.type_definition: - return self.type_definition.parent_type - - @property - def requirements(self): - if self._requirements is None: - self._requirements = self.type_definition.get_value( - self.REQUIREMENTS, - self.entity_tpl) or [] - return self._requirements - - def get_properties_objects(self): - '''Return properties objects for this template.''' - if self._properties is None: - self._properties = self._create_properties() - return self._properties - - def get_properties(self): - '''Return a dictionary of property name-object pairs.''' - return {prop.name: prop - for prop in self.get_properties_objects()} - - def get_property_value(self, name): - '''Return the value of a given property name.''' - props = self.get_properties() - if props and name in props.keys(): - return props[name].value - - @property - def interfaces(self): - if self._interfaces is None: - self._interfaces = self._create_interfaces() - return self._interfaces - - def get_capabilities_objects(self): - '''Return capabilities objects for this template.''' - if not self._capabilities: - self._capabilities = self._create_capabilities() - return self._capabilities - - def get_capabilities(self): - '''Return a dictionary of capability name-object pairs.''' - return {cap.name: cap - for cap in self.get_capabilities_objects()} - - def is_derived_from(self, type_str): - '''Check if object inherits from the given type. - - Returns true if this object is derived from 'type_str'. - False otherwise. - ''' - if not self.type: - return False - elif self.type == type_str: - return True - elif self.parent_type: - return self.parent_type.is_derived_from(type_str) - else: - return False - - def _create_capabilities(self): - capability = [] - caps = self.type_definition.get_value(self.CAPABILITIES, - self.entity_tpl, True) - if caps: - for name, props in caps.items(): - capabilities = self.type_definition.get_capabilities() - if name in capabilities.keys(): - c = capabilities[name] - properties = {} - # first use the definition default value - if c.properties: - for property_name in c.properties.keys(): - prop_def = c.properties[property_name] - if 'default' in prop_def: - properties[property_name] = prop_def['default'] - # then update (if available) with the node properties - if 'properties' in props and props['properties']: - properties.update(props['properties']) - - cap = CapabilityAssignment(name, properties, c) - capability.append(cap) - return capability - - def _validate_properties(self, template, entitytype): - properties = entitytype.get_value(self.PROPERTIES, template) - self._common_validate_properties(entitytype, properties) - - def _validate_capabilities(self): - type_capabilities = self.type_definition.get_capabilities() - allowed_caps = \ - type_capabilities.keys() if type_capabilities else [] - capabilities = self.type_definition.get_value(self.CAPABILITIES, - self.entity_tpl) - if capabilities: - self._common_validate_field(capabilities, allowed_caps, - 'capabilities') - self._validate_capabilities_properties(capabilities) - - def _validate_capabilities_properties(self, capabilities): - for cap, props in capabilities.items(): - capability = self.get_capability(cap) - if not capability: - continue - capabilitydef = capability.definition - self._common_validate_properties(capabilitydef, - props[self.PROPERTIES]) - - # validating capability properties values - for prop in self.get_capability(cap).get_properties_objects(): - prop.validate() - - # tODO(srinivas_tadepalli): temporary work around to validate - # default_instances until standardized in specification - if cap == "scalable" and prop.name == "default_instances": - prop_dict = props[self.PROPERTIES] - min_instances = prop_dict.get("min_instances") - max_instances = prop_dict.get("max_instances") - default_instances = prop_dict.get("default_instances") - if not (min_instances <= default_instances - <= max_instances): - err_msg = ('"properties" of template "%s": ' - '"default_instances" value is not between ' - '"min_instances" and "max_instances".' % - self.name) - ValidationIssueCollector.appendException( - ValidationError(message=err_msg)) - - def _common_validate_properties(self, entitytype, properties): - allowed_props = [] - required_props = [] - for p in entitytype.get_properties_def_objects(): - allowed_props.append(p.name) - # If property is 'required' and has no 'default' value then record - if p.required and p.default is None: - required_props.append(p.name) - # validate all required properties have values - if properties: - req_props_no_value_or_default = [] - self._common_validate_field(properties, allowed_props, - 'properties') - # make sure it's not missing any property required by a tosca type - for r in required_props: - if r not in properties.keys(): - req_props_no_value_or_default.append(r) - # Required properties found without value or a default value - if req_props_no_value_or_default: - ValidationIssueCollector.appendException( - MissingRequiredFieldError( - what='"properties" of template "%s"' % self.name, - required=req_props_no_value_or_default)) - else: - # Required properties in schema, but not in template - if required_props: - ValidationIssueCollector.appendException( - MissingRequiredFieldError( - what='"properties" of template "%s"' % self.name, - required=required_props)) - - def _validate_field(self, template): - if not isinstance(template, dict): - ValidationIssueCollector.appendException( - MissingRequiredFieldError( - what='Template "%s"' % self.name, required=self.TYPE)) - try: - relationship = template.get('relationship') - if relationship and not isinstance(relationship, str): - relationship[self.TYPE] - elif isinstance(relationship, str): - template['relationship'] - else: - template[self.TYPE] - except KeyError: - ValidationIssueCollector.appendException( - MissingRequiredFieldError( - what='Template "%s"' % self.name, required=self.TYPE)) - - def _common_validate_field(self, schema, allowedlist, section): - for name in schema: - if name not in allowedlist: - ValidationIssueCollector.appendException( - UnknownFieldError( - what=('"%(section)s" of template "%(nodename)s"' - % {'section': section, 'nodename': self.name}), - field=name)) - - def _create_properties(self): - props = [] - properties = self.type_definition.get_value(self.PROPERTIES, - self.entity_tpl) or {} - for name, value in properties.items(): - props_def = self.type_definition.get_properties_def() - if props_def and name in props_def: - prop = Property(name, value, - props_def[name].schema, self.custom_def) - props.append(prop) - for p in self.type_definition.get_properties_def_objects(): - if p.default is not None and p.name not in properties.keys(): - prop = Property(p.name, p.default, p.schema, self.custom_def) - props.append(prop) - return props - - def _create_interfaces(self): - interfaces = [] - type_interfaces = None - if isinstance(self.type_definition, RelationshipType): - if isinstance(self.entity_tpl, dict): - if self.INTERFACES in self.entity_tpl: - type_interfaces = self.entity_tpl[self.INTERFACES] - else: - for rel_def, value in self.entity_tpl.items(): - if rel_def != 'type': - rel_def = self.entity_tpl.get(rel_def) - rel = None - if isinstance(rel_def, dict): - rel = rel_def.get('relationship') - if rel: - if self.INTERFACES in rel: - type_interfaces = rel[self.INTERFACES] - break - else: - type_interfaces = self.type_definition.get_value(self.INTERFACES, - self.entity_tpl) - if type_interfaces: - for interface_type, value in type_interfaces.items(): - for op, op_def in value.items(): - iface = InterfacesDef(self.type_definition, - interfacetype=interface_type, - node_template=self, - name=op, - value=op_def) - interfaces.append(iface) - return interfaces - - def get_capability(self, name): - """Provide named capability - - :param name: name of capability - :return: capability object if found, None otherwise - """ - caps = self.get_capabilities() - if caps and name in caps.keys(): - return caps[name] -*/ diff --git a/jtosca/src/main/java/org/onap/sdc/toscaparser/api/NodeTemplate.java b/jtosca/src/main/java/org/onap/sdc/toscaparser/api/NodeTemplate.java index 4fabe38..aeae994 100644 --- a/jtosca/src/main/java/org/onap/sdc/toscaparser/api/NodeTemplate.java +++ b/jtosca/src/main/java/org/onap/sdc/toscaparser/api/NodeTemplate.java @@ -20,7 +20,17 @@ package org.onap.sdc.toscaparser.api; +import static org.onap.sdc.toscaparser.api.elements.EntityType.TOSCA_DEF; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import lombok.Getter; +import lombok.Setter; import org.onap.sdc.toscaparser.api.common.JToscaValidationIssue; +import org.onap.sdc.toscaparser.api.elements.ArtifactDef; import org.onap.sdc.toscaparser.api.elements.EntityType; import org.onap.sdc.toscaparser.api.elements.InterfacesDef; import org.onap.sdc.toscaparser.api.elements.Metadata; @@ -29,35 +39,33 @@ import org.onap.sdc.toscaparser.api.elements.RelationshipType; import org.onap.sdc.toscaparser.api.utils.CopyUtils; import org.onap.sdc.toscaparser.api.utils.ThreadLocalsHolder; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import static org.onap.sdc.toscaparser.api.elements.EntityType.TOSCA_DEF; - public class NodeTemplate extends EntityTemplate { + private static final String METADATA = "metadata"; private LinkedHashMap templates; - private LinkedHashMap customDef; private ArrayList availableRelTpls; private LinkedHashMap availableRelTypes; private LinkedHashMap related; private ArrayList relationshipTpl; private LinkedHashMap _relationships; + @Getter + @Setter private SubstitutionMappings subMappingToscaTemplate; + @Getter + @Setter private TopologyTemplate originComponentTemplate; + @Getter + @Setter private Metadata metadata; - - private static final String METADATA = "metadata"; + @Getter + private Map artifacts; public NodeTemplate(String name, LinkedHashMap ntnodeTemplates, LinkedHashMap ntcustomDef, ArrayList ntavailableRelTpls, LinkedHashMap ntavailableRelTypes) { - this(name, ntnodeTemplates, ntcustomDef, ntavailableRelTpls, - ntavailableRelTypes, null); + this(name, ntnodeTemplates, ntcustomDef, ntavailableRelTpls, ntavailableRelTypes, null); } @SuppressWarnings("unchecked") @@ -68,8 +76,7 @@ public class NodeTemplate extends EntityTemplate { LinkedHashMap ntavailableRelTypes, NodeTemplate parentNodeTemplate) { - super(name, (LinkedHashMap) ntnodeTemplates.get(name), - "node_type", ntcustomDef, parentNodeTemplate); + super(name, (LinkedHashMap) ntnodeTemplates.get(name), "node_type", ntcustomDef, parentNodeTemplate); templates = ntnodeTemplates; _validateFields((LinkedHashMap) templates.get(name)); @@ -81,6 +88,18 @@ public class NodeTemplate extends EntityTemplate { _relationships = new LinkedHashMap(); subMappingToscaTemplate = null; metadata = _metaData(); + artifacts = readArtifacts((Map) templates.get(name)); + } + + private Map readArtifacts(final Map nodetemplate) { + if (nodetemplate.get("artifacts") != null) { + final Map artifactsMap = new HashMap<>(); + ((Map) nodetemplate.get("artifacts")).forEach((name, value) -> { + artifactsMap.put(name, new ArtifactDef((Map) value)); + }); + return artifactsMap; + } + return null; } @SuppressWarnings("unchecked") @@ -126,13 +145,13 @@ public class NodeTemplate extends EntityTemplate { } if (bFound || customDef.get(node) != null) { ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE205", String.format( - "NotImplementedError: Lookup by TOSCA types is not supported. Requirement for \"%s\" can not be full-filled", - getName()))); + "NotImplementedError: Lookup by TOSCA types is not supported. Requirement for \"%s\" can not be full-filled", + getName()))); return null; } if (templates.get(node) == null) { ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE206", String.format( - "KeyError: Node template \"%s\" was not found", node))); + "KeyError: Node template \"%s\" was not found", node))); return null; } NodeTemplate relatedTpl = new NodeTemplate(node, templates, customDef, null, null); @@ -144,7 +163,8 @@ public class NodeTemplate extends EntityTemplate { if (relationship == null) { ArrayList parentReqs = ((NodeType) typeDefinition).getAllRequirements(); if (parentReqs == null) { - ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE207", "ValidationError: parent_req is null")); + ThreadLocalsHolder.getCollector() + .appendValidationIssue(new JToscaValidationIssue("JE207", "ValidationError: parent_req is null")); } else { // for(String key: req.keySet()) { // boolean bFoundRel = false; @@ -194,15 +214,15 @@ public class NodeTemplate extends EntityTemplate { relationshipString = (String) ((LinkedHashMap) relationship).get("type"); if (relationshipString != null) { if (availableRelTypes != null && !availableRelTypes.isEmpty() && - availableRelTypes.get(relationshipString) != null) { + availableRelTypes.get(relationshipString) != null) { ; } else if (!(relationshipString).startsWith(relPrfx)) { relationshipString = relPrfx + relationshipString; } } else { ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE208", String.format( - "MissingRequiredFieldError: \"relationship\" used in template \"%s\" is missing required field \"type\"", - relatedTpl.getName()))); + "MissingRequiredFieldError: \"relationship\" used in template \"%s\" is missing required field \"type\"", + relatedTpl.getName()))); } } for (RelationshipType rtype : ((NodeType) typeDefinition).getRelationship().keySet()) { @@ -320,7 +340,7 @@ public class NodeTemplate extends EntityTemplate { if (requires != null) { if (!(requires instanceof ArrayList)) { ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE209", String.format( - "TypeMismatchError: \"requirements\" of template \"%s\" are not of type \"list\"", name))); + "TypeMismatchError: \"requirements\" of template \"%s\" are not of type \"list\"", name))); } else { for (Object ro : requires) { LinkedHashMap req = (LinkedHashMap) ro; @@ -361,10 +381,10 @@ public class NodeTemplate extends EntityTemplate { DataEntity.validateDatatype("Integer", val, null, null, null); } if (occurrences.size() != 2 || - !(0 <= (int) occurrences.get(0) && (int) occurrences.get(0) <= (int) occurrences.get(1)) || - (int) occurrences.get(1) == 0) { + !(0 <= (int) occurrences.get(0) && (int) occurrences.get(0) <= (int) occurrences.get(1)) || + (int) occurrences.get(1) == 0) { ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE210", String.format( - "InvalidPropertyValueError: property has invalid value %s", occurrences.toString()))); + "InvalidPropertyValueError: property has invalid value %s", occurrences.toString()))); } } @@ -379,15 +399,14 @@ public class NodeTemplate extends EntityTemplate { } if (!bFound) { ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE211", String.format( - "UnknownFieldError: \"requirements\" of template \"%s\" contains unknown field \"%s\"", name, key))); + "UnknownFieldError: \"requirements\" of template \"%s\" contains unknown field \"%s\"", name, key))); } } } @SuppressWarnings("unchecked") private void _validateInterfaces() { - LinkedHashMap ifaces = (LinkedHashMap) - ((NodeType) typeDefinition).getValue(INTERFACES, entityTpl, false); + LinkedHashMap ifaces = (LinkedHashMap) ((NodeType) typeDefinition).getValue(INTERFACES, entityTpl, false); if (ifaces != null) { for (Map.Entry me : ifaces.entrySet()) { String iname = me.getKey(); @@ -410,7 +429,7 @@ public class NodeTemplate extends EntityTemplate { _commonValidateField(value, _collectCustomIfaceOperations(iname), "interfaces"); } else { ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE212", String.format( - "UnknownFieldError: \"interfaces\" of template \"%s\" contains unknown field %s", name, iname))); + "UnknownFieldError: \"interfaces\" of template \"%s\" contains unknown field %s", name, iname))); } } } @@ -419,8 +438,7 @@ public class NodeTemplate extends EntityTemplate { @SuppressWarnings("unchecked") private ArrayList _collectCustomIfaceOperations(String iname) { ArrayList allowedOperations = new ArrayList<>(); - LinkedHashMap nodetypeIfaceDef = (LinkedHashMap) ((NodeType) - typeDefinition).getInterfaces().get(iname); + LinkedHashMap nodetypeIfaceDef = (LinkedHashMap) ((NodeType) typeDefinition).getInterfaces().get(iname); allowedOperations.addAll(nodetypeIfaceDef.keySet()); String ifaceType = (String) nodetypeIfaceDef.get("type"); if (ifaceType != null) { @@ -503,322 +521,14 @@ public class NodeTemplate extends EntityTemplate { } if (!bFound) { ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE213", String.format( - "UnknownFieldError: Node template \"%s\" has unknown field \"%s\"", name, ntname))); + "UnknownFieldError: Node template \"%s\" has unknown field \"%s\"", name, ntname))); } } } - // getter/setter - - // multilevel nesting - public SubstitutionMappings getSubMappingToscaTemplate() { - return subMappingToscaTemplate; - } - - public void setSubMappingToscaTemplate(SubstitutionMappings sm) { - subMappingToscaTemplate = sm; - } - - public Metadata getMetaData() { - return metadata; - } - - public void setMetaData(Metadata metadata) { - this.metadata = metadata; - } - @Override public String toString() { return getName(); } - public TopologyTemplate getOriginComponentTemplate() { - return originComponentTemplate; - } - - public void setOriginComponentTemplate(TopologyTemplate originComponentTemplate) { - this.originComponentTemplate = originComponentTemplate; - } - } - -/*python - -from toscaparser.common.exception import ValidationIssueCollector -from toscaparser.common.exception import InvalidPropertyValueError -from toscaparser.common.exception import MissingRequiredFieldError -from toscaparser.common.exception import TypeMismatchError -from toscaparser.common.exception import UnknownFieldError -from toscaparser.common.exception import ValidationError -from toscaparser.dataentity import DataEntity -from toscaparser.elements.interfaces import CONFIGURE -from toscaparser.elements.interfaces import CONFIGURE_SHORTNAME -from toscaparser.elements.interfaces import INTERFACE_DEF_RESERVED_WORDS -from toscaparser.elements.interfaces import InterfacesDef -from toscaparser.elements.interfaces import LIFECYCLE -from toscaparser.elements.interfaces import LIFECYCLE_SHORTNAME -from toscaparser.elements.relationshiptype import RelationshipType -from toscaparser.entity_template import EntityTemplate -from toscaparser.relationship_template import RelationshipTemplate -from toscaparser.utils.gettextutils import _ - -log = logging.getLogger('tosca') - - -class NodeTemplate(EntityTemplate): - '''Node template from a Tosca profile.''' - def __init__(self, name, node_templates, custom_def=None, - available_rel_tpls=None, available_rel_types=None): - super(NodeTemplate, self).__init__(name, node_templates[name], - 'node_type', - custom_def) - self.templates = node_templates - self._validate_fields(node_templates[name]) - self.custom_def = custom_def - self.related = {} - self.relationship_tpl = [] - self.available_rel_tpls = available_rel_tpls - self.available_rel_types = available_rel_types - self._relationships = {} - self.sub_mapping_tosca_template = None - - @property - def relationships(self): - if not self._relationships: - requires = self.requirements - if requires and isinstance(requires, list): - for r in requires: - for r1, value in r.items(): - explicit = self._get_explicit_relationship(r, value) - if explicit: - for key, value in explicit.items(): - self._relationships[key] = value - return self._relationships - - def _get_explicit_relationship(self, req, value): - """Handle explicit relationship - - For example, - - req: - node: DBMS - relationship: tosca.relationships.HostedOn - """ - explicit_relation = {} - node = value.get('node') if isinstance(value, dict) else value - - if node: - # TO-DO(spzala) implement look up once Glance meta data is available - # to find a matching TOSCA node using the TOSCA types - msg = _('Lookup by TOSCA types is not supported. ' - 'Requirement for "%s" can not be full-filled.') % self.name - if (node in list(self.type_definition.TOSCA_DEF.keys()) - or node in self.custom_def): - ValidationIssueCollector.appendException(NotImplementedError(msg)) - return - - if node not in self.templates: - ValidationIssueCollector.appendException( - KeyError(_('Node template "%s" was not found.') % node)) - return - - related_tpl = NodeTemplate(node, self.templates, self.custom_def) - relationship = value.get('relationship') \ - if isinstance(value, dict) else None - # check if it's type has relationship defined - if not relationship: - parent_reqs = self.type_definition.get_all_requirements() - if parent_reqs is None: - ValidationIssueCollector.appendException( - ValidationError(message='parent_req is ' + - str(parent_reqs))) - else: - for key in req.keys(): - for req_dict in parent_reqs: - if key in req_dict.keys(): - relationship = (req_dict.get(key). - get('relationship')) - break - if relationship: - found_relationship_tpl = False - # apply available relationship templates if found - if self.available_rel_tpls: - for tpl in self.available_rel_tpls: - if tpl.name == relationship: - rtype = RelationshipType(tpl.type, None, - self.custom_def) - explicit_relation[rtype] = related_tpl - tpl.target = related_tpl - tpl.source = self - self.relationship_tpl.append(tpl) - found_relationship_tpl = True - # create relationship template object. - rel_prfx = self.type_definition.RELATIONSHIP_PREFIX - if not found_relationship_tpl: - if isinstance(relationship, dict): - relationship = relationship.get('type') - if relationship: - if self.available_rel_types and \ - relationship in self.available_rel_types.keys(): - pass - elif not relationship.startswith(rel_prfx): - relationship = rel_prfx + relationship - else: - ValidationIssueCollector.appendException( - MissingRequiredFieldError( - what=_('"relationship" used in template ' - '"%s"') % related_tpl.name, - required=self.TYPE)) - for rtype in self.type_definition.relationship.keys(): - if rtype.type == relationship: - explicit_relation[rtype] = related_tpl - related_tpl._add_relationship_template(req, - rtype.type, - self) - elif self.available_rel_types: - if relationship in self.available_rel_types.keys(): - rel_type_def = self.available_rel_types.\ - get(relationship) - if 'derived_from' in rel_type_def: - super_type = \ - rel_type_def.get('derived_from') - if not super_type.startswith(rel_prfx): - super_type = rel_prfx + super_type - if rtype.type == super_type: - explicit_relation[rtype] = related_tpl - related_tpl.\ - _add_relationship_template( - req, rtype.type, self) - return explicit_relation - - def _add_relationship_template(self, requirement, rtype, source): - req = requirement.copy() - req['type'] = rtype - tpl = RelationshipTemplate(req, rtype, self.custom_def, self, source) - self.relationship_tpl.append(tpl) - - def get_relationship_template(self): - return self.relationship_tpl - - def _add_next(self, nodetpl, relationship): - self.related[nodetpl] = relationship - - @property - def related_nodes(self): - if not self.related: - for relation, node in self.type_definition.relationship.items(): - for tpl in self.templates: - if tpl == node.type: - self.related[NodeTemplate(tpl)] = relation - return self.related.keys() - - def validate(self, tosca_tpl=None): - self._validate_capabilities() - self._validate_requirements() - self._validate_properties(self.entity_tpl, self.type_definition) - self._validate_interfaces() - for prop in self.get_properties_objects(): - prop.validate() - - def _validate_requirements(self): - type_requires = self.type_definition.get_all_requirements() - allowed_reqs = ["template"] - if type_requires: - for treq in type_requires: - for key, value in treq.items(): - allowed_reqs.append(key) - if isinstance(value, dict): - for key in value: - allowed_reqs.append(key) - - requires = self.type_definition.get_value(self.REQUIREMENTS, - self.entity_tpl) - if requires: - if not isinstance(requires, list): - ValidationIssueCollector.appendException( - TypeMismatchError( - what='"requirements" of template "%s"' % self.name, - type='list')) - else: - for req in requires: - for r1, value in req.items(): - if isinstance(value, dict): - self._validate_requirements_keys(value) - self._validate_requirements_properties(value) - allowed_reqs.append(r1) - self._common_validate_field(req, allowed_reqs, - 'requirements') - - def _validate_requirements_properties(self, requirements): - # TO-DO(anyone): Only occurrences property of the requirements is - # validated here. Validation of other requirement properties are being - # validated in different files. Better to keep all the requirements - # properties validation here. - for key, value in requirements.items(): - if key == 'occurrences': - self._validate_occurrences(value) - break - - def _validate_occurrences(self, occurrences): - DataEntity.validate_datatype('list', occurrences) - for value in occurrences: - DataEntity.validate_datatype('integer', value) - if len(occurrences) != 2 or not (0 <= occurrences[0] <= occurrences[1]) \ - or occurrences[1] == 0: - ValidationIssueCollector.appendException( - InvalidPropertyValueError(what=(occurrences))) - - def _validate_requirements_keys(self, requirement): - for key in requirement.keys(): - if key not in self.REQUIREMENTS_SECTION: - ValidationIssueCollector.appendException( - UnknownFieldError( - what='"requirements" of template "%s"' % self.name, - field=key)) - - def _validate_interfaces(self): - ifaces = self.type_definition.get_value(self.INTERFACES, - self.entity_tpl) - if ifaces: - for name, value in ifaces.items(): - if name in (LIFECYCLE, LIFECYCLE_SHORTNAME): - self._common_validate_field( - value, InterfacesDef. - interfaces_node_lifecycle_operations, - 'interfaces') - elif name in (CONFIGURE, CONFIGURE_SHORTNAME): - self._common_validate_field( - value, InterfacesDef. - interfaces_relationship_configure_operations, - 'interfaces') - elif name in self.type_definition.interfaces.keys(): - self._common_validate_field( - value, - self._collect_custom_iface_operations(name), - 'interfaces') - else: - ValidationIssueCollector.appendException( - UnknownFieldError( - what='"interfaces" of template "%s"' % - self.name, field=name)) - - def _collect_custom_iface_operations(self, name): - allowed_operations = [] - nodetype_iface_def = self.type_definition.interfaces[name] - allowed_operations.extend(nodetype_iface_def.keys()) - if 'type' in nodetype_iface_def: - iface_type = nodetype_iface_def['type'] - if iface_type in self.type_definition.custom_def: - iface_type_def = self.type_definition.custom_def[iface_type] - else: - iface_type_def = self.type_definition.TOSCA_DEF[iface_type] - allowed_operations.extend(iface_type_def.keys()) - allowed_operations = [op for op in allowed_operations if - op not in INTERFACE_DEF_RESERVED_WORDS] - return allowed_operations - - def _validate_fields(self, nodetemplate): - for name in nodetemplate.keys(): - if name not in self.SECTIONS and name not in self.SPECIAL_SECTIONS: - ValidationIssueCollector.appendException( - UnknownFieldError(what='Node template "%s"' % self.name, - field=name))*/ diff --git a/jtosca/src/main/java/org/onap/sdc/toscaparser/api/ToscaTemplate.java b/jtosca/src/main/java/org/onap/sdc/toscaparser/api/ToscaTemplate.java index ddb8ddb..e2ec62a 100644 --- a/jtosca/src/main/java/org/onap/sdc/toscaparser/api/ToscaTemplate.java +++ b/jtosca/src/main/java/org/onap/sdc/toscaparser/api/ToscaTemplate.java @@ -36,12 +36,11 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Predicate; - 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.EntityType; import org.onap.sdc.toscaparser.api.elements.Metadata; import org.onap.sdc.toscaparser.api.extensions.ExtTools; import org.onap.sdc.toscaparser.api.parameters.Input; @@ -56,8 +55,7 @@ import org.yaml.snakeyaml.Yaml; public class ToscaTemplate extends Object { public static final int MAX_LEVELS = 20; - private static Logger log = LoggerFactory.getLogger(ToscaTemplate.class.getName()); - + private static final Logger log = LoggerFactory.getLogger(ToscaTemplate.class.getName()); // TOSCA template key names private static final String DEFINITION_VERSION = "tosca_definitions_version"; private static final String DEFAULT_NAMESPACE = "tosca_default_namespace"; @@ -78,18 +76,16 @@ public class ToscaTemplate extends Object { private static final String POLICY_TYPES = "policy_types"; private static final String GROUP_TYPES = "group_types"; private static final String REPOSITORIES = "repositories"; - - private static String SECTIONS[] = { - DEFINITION_VERSION, DEFAULT_NAMESPACE, TEMPLATE_NAME, - TOPOLOGY_TEMPLATE, TEMPLATE_AUTHOR, TEMPLATE_VERSION, - DESCRIPTION, IMPORTS, DSL_DEFINITIONS, NODE_TYPES, - RELATIONSHIP_TYPES, RELATIONSHIP_TEMPLATES, - CAPABILITY_TYPES, ARTIFACT_TYPES, DATA_TYPES, - INTERFACE_TYPES, POLICY_TYPES, GROUP_TYPES, REPOSITORIES - }; - // Sections that are specific to individual template definitions private static final String METADATA = "metadata"; + private static String SECTIONS[] = { + DEFINITION_VERSION, DEFAULT_NAMESPACE, TEMPLATE_NAME, + TOPOLOGY_TEMPLATE, TEMPLATE_AUTHOR, TEMPLATE_VERSION, + DESCRIPTION, IMPORTS, DSL_DEFINITIONS, NODE_TYPES, + RELATIONSHIP_TYPES, RELATIONSHIP_TEMPLATES, + CAPABILITY_TYPES, ARTIFACT_TYPES, DATA_TYPES, + INTERFACE_TYPES, POLICY_TYPES, GROUP_TYPES, REPOSITORIES + }; private static ArrayList SPECIAL_SECTIONS; private ExtTools exttools = new ExtTools(); @@ -152,17 +148,18 @@ public class ToscaTemplate extends Object { VALID_TEMPLATE_VERSIONS = new ArrayList<>(); VALID_TEMPLATE_VERSIONS.add("tosca_simple_yaml_1_0"); VALID_TEMPLATE_VERSIONS.add("tosca_simple_yaml_1_1"); + VALID_TEMPLATE_VERSIONS.add("tosca_simple_yaml_1_2"); + VALID_TEMPLATE_VERSIONS.add("tosca_simple_yaml_1_3"); VALID_TEMPLATE_VERSIONS.addAll(exttools.getVersions()); ADDITIONAL_SECTIONS = new LinkedHashMap<>(); SPECIAL_SECTIONS = new ArrayList<>(); SPECIAL_SECTIONS.add(METADATA); ADDITIONAL_SECTIONS.put("tosca_simple_yaml_1_0", SPECIAL_SECTIONS); ADDITIONAL_SECTIONS.put("tosca_simple_yaml_1_1", SPECIAL_SECTIONS); + ADDITIONAL_SECTIONS.put("tosca_simple_yaml_1_2", SPECIAL_SECTIONS); + ADDITIONAL_SECTIONS.put("tosca_simple_yaml_1_3", SPECIAL_SECTIONS); ADDITIONAL_SECTIONS.putAll(exttools.getSections()); - //long startTime = System.nanoTime(); - - isFile = aFile; inputPath = null; path = null; @@ -182,7 +179,7 @@ public class ToscaTemplate extends Object { if (path != null && !path.isEmpty()) { try (InputStream input = new FileInputStream(new File(path));) { //System.out.println("Loading YAML file " + path); - log.debug("ToscaTemplate Loading YAMEL file {}", path); + log.debug("ToscaTemplate Loading YAML file {}", path); Yaml yaml = new Yaml(); Object data = yaml.load(input); this.tpl = (LinkedHashMap) data; @@ -190,13 +187,13 @@ public class ToscaTemplate extends Object { log.error("ToscaTemplate - Exception loading yaml: {}", e.getMessage()); log.error("Exception", e); ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE275", - "ToscaTemplate - Exception loading yaml: -> " + e.getMessage())); + "ToscaTemplate - Exception loading yaml: -> " + e.getMessage())); return; } catch (Exception e) { log.error("ToscaTemplate - Error loading yaml, aborting -> ", e.getMessage()); log.error("Exception", e); ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE275", - "ToscaTemplate - Error loading yaml, aborting -> " + e.getMessage())); + "ToscaTemplate - Error loading yaml, aborting -> " + e.getMessage())); return; } @@ -215,7 +212,7 @@ public class ToscaTemplate extends Object { tpl = yamlDictTpl; } else { ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE244", - "ValueError: No path or yaml_dict_tpl was provided. There is nothing to parse")); + "ValueError: No path or yaml_dict_tpl was provided. There is nothing to parse")); log.debug("ToscaTemplate ValueError: No path or yaml_dict_tpl was provided. There is nothing to parse"); } @@ -264,12 +261,12 @@ public class ToscaTemplate extends Object { private TopologyTemplate _topologyTemplate() { return new TopologyTemplate( - _tplTopologyTemplate(), - _getAllCustomDefs(imports), - relationshipTypes, - parsedParams, - null, - resolveGetInput); + _tplTopologyTemplate(), + _getAllCustomDefs(imports), + relationshipTypes, + parsedParams, + null, + resolveGetInput); } private ArrayList _inputs() { @@ -314,7 +311,7 @@ public class ToscaTemplate extends Object { @SuppressWarnings("unchecked") private ArrayList _tplRepositories() { LinkedHashMap repositories = - (LinkedHashMap) tpl.get(REPOSITORIES); + (LinkedHashMap) tpl.get(REPOSITORIES); ArrayList reposit = new ArrayList<>(); if (repositories != null) { for (Map.Entry me : repositories.entrySet()) { @@ -350,7 +347,7 @@ public class ToscaTemplate extends Object { @SuppressWarnings("unchecked") private HashSet getTopologyDataTypes() { LinkedHashMap value = - (LinkedHashMap) tpl.get(DATA_TYPES); + (LinkedHashMap) tpl.get(DATA_TYPES); HashSet datatypes = new HashSet<>(); if (value != null) { customDefsFinal.putAll(value); @@ -360,7 +357,6 @@ public class ToscaTemplate extends Object { } } - return datatypes; } @@ -380,10 +376,9 @@ public class ToscaTemplate extends Object { @SuppressWarnings("unchecked") private LinkedHashMap _getAllCustomDefs(Object alImports) { - String types[] = { - IMPORTS, NODE_TYPES, CAPABILITY_TYPES, RELATIONSHIP_TYPES, - DATA_TYPES, INTERFACE_TYPES, POLICY_TYPES, GROUP_TYPES + IMPORTS, NODE_TYPES, CAPABILITY_TYPES, RELATIONSHIP_TYPES, ARTIFACT_TYPES, + DATA_TYPES, INTERFACE_TYPES, POLICY_TYPES, GROUP_TYPES }; List> imports = (List>) alImports; @@ -480,12 +475,13 @@ public class ToscaTemplate extends Object { */ private String getPath(String path, String importFileName) { String tempFullPath = (Paths.get(path).toAbsolutePath().getParent() - .toString() + File.separator + importFileName.replace("../", "")).replace('\\', '/'); + .toString() + File.separator + importFileName.replace("../", "")).replace('\\', '/'); String tempPartialPath = (Paths.get(path).toAbsolutePath().getParent().toString()).replace('\\', '/'); - if (Files.exists(Paths.get(tempFullPath))) + if (Files.exists(Paths.get(tempFullPath))) { return tempFullPath; - else + } else { return getPath(tempPartialPath, importFileName); + } } /** @@ -507,10 +503,10 @@ public class ToscaTemplate extends Object { Map.Entry val = it.next(); if (val.getValue().contains("/")) { importFileName = (Paths.get(rootPath).toAbsolutePath().getParent().toString() + File - .separator + val.getValue().replace("../", "")).replace('\\', '/'); + .separator + val.getValue().replace("../", "")).replace('\\', '/'); } else { importFileName = (Paths.get(path).toAbsolutePath().getParent().toString() + File - .separator + val.getValue().replace("../", "")).replace('\\', '/'); + .separator + val.getValue().replace("../", "")).replace('\\', '/'); } retMap.put("importFileName", importFileName); retMap.put("importRelativeName", val.getValue()); @@ -530,8 +526,8 @@ public class ToscaTemplate extends Object { * @return the list containing filtered imports */ private List> filterImportsForRecursion(List> - customImports, Map importNameDetails) { + customImports, Map importNameDetails) { for (Map map1 : customImports) { for (Map.Entry entry : map1.entrySet()) { Map innerMostMap = (Map) entry.getValue(); @@ -627,27 +623,27 @@ public class ToscaTemplate extends Object { this.processedImports = new HashSet<>(); for (Map.Entry me : nestedToscaTplsWithTopology.entrySet()) { LinkedHashMap toscaTpl = - (LinkedHashMap) me.getValue(); + (LinkedHashMap) me.getValue(); for (NodeTemplate nt : tt.getNodeTemplates()) { if (_isSubMappedNode(nt, toscaTpl)) { parsedParams = _getParamsForNestedTemplate(nt); ArrayList alim = (ArrayList) toscaTpl.get(IMPORTS); LinkedHashMap topologyTpl = - (LinkedHashMap) toscaTpl.get(TOPOLOGY_TEMPLATE); + (LinkedHashMap) toscaTpl.get(TOPOLOGY_TEMPLATE); TopologyTemplate topologyWithSubMapping = - new TopologyTemplate(topologyTpl, - _getAllCustomDefs(alim), - relationshipTypes, - parsedParams, - nt, - resolveGetInput); + new TopologyTemplate(topologyTpl, + _getAllCustomDefs(alim), + relationshipTypes, + parsedParams, + nt, + resolveGetInput); nt.setOriginComponentTemplate(topologyWithSubMapping); if (topologyWithSubMapping.getSubstitutionMappings() != null) { // Record nested topology templates in top level template //nestedToscaTemplatesWithTopology.add(topologyWithSubMapping); // Set substitution mapping object for mapped node nt.setSubMappingToscaTemplate( - topologyWithSubMapping.getSubstitutionMappings()); + topologyWithSubMapping.getSubstitutionMappings()); _handleNestedToscaTemplatesWithTopology(topologyWithSubMapping); } } @@ -689,7 +685,7 @@ public class ToscaTemplate extends Object { String sVersion = _tplVersion(); if (sVersion == null) { ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE245", String.format( - "MissingRequiredField: Template is missing required field \"%s\"", DEFINITION_VERSION))); + "MissingRequiredField: Template is missing required field \"%s\"", DEFINITION_VERSION))); } else { _validateVersion(sVersion); this.version = sVersion; @@ -706,14 +702,14 @@ public class ToscaTemplate extends Object { // check ADDITIONAL_SECTIONS if (!bFound) { if (ADDITIONAL_SECTIONS.get(version) != null && - ADDITIONAL_SECTIONS.get(version).contains(sKey)) { + ADDITIONAL_SECTIONS.get(version).contains(sKey)) { bFound = true; } } if (!bFound) { ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE246", String.format( - "UnknownFieldError: Template contains unknown field \"%s\"", - sKey))); + "UnknownFieldError: Template contains unknown field \"%s\"", + sKey))); } } } @@ -728,11 +724,9 @@ public class ToscaTemplate extends Object { } if (!bFound) { ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE247", String.format( - "InvalidTemplateVersion: \"%s\" is invalid. Valid versions are %s", - sVersion, VALID_TEMPLATE_VERSIONS.toString()))); - } else if ((!sVersion.equals("tosca_simple_yaml_1_0") && !sVersion.equals("tosca_simple_yaml_1_1"))) { + "InvalidTemplateVersion: \"%s\" is invalid. Valid versions are %s", sVersion, VALID_TEMPLATE_VERSIONS.toString()))); + } else if (!sVersion.startsWith("tosca_simple_yaml_1_")) { EntityType.updateDefinitions(sVersion); - } } @@ -756,7 +750,8 @@ public class ToscaTemplate extends Object { return csar.getTempDir() + File.separator + csar.getMainTemplate(); } } else { - ThreadLocalsHolder.getCollector().appendValidationIssue(new JToscaValidationIssue("JE248", "ValueError: " + _path + " is not a valid file")); + ThreadLocalsHolder.getCollector() + .appendValidationIssue(new JToscaValidationIssue("JE248", "ValueError: " + _path + " is not a valid file")); return null; } return null; @@ -768,7 +763,8 @@ public class ToscaTemplate extends Object { if (validationIssuesCaught > 0) { List validationIssueStrings = ThreadLocalsHolder.getCollector().getValidationIssueReport(); log.trace("####################################################################################################"); - log.trace("ToscaTemplate - verifyTemplate - {} Parsing Critical{} occurred...", validationIssuesCaught, (validationIssuesCaught > 1 ? "s" : "")); + log.trace("ToscaTemplate - verifyTemplate - {} Parsing Critical{} occurred...", validationIssuesCaught, + (validationIssuesCaught > 1 ? "s" : "")); for (String s : validationIssueStrings) { log.trace("{}. CSAR name - {}", s, inputPath); } @@ -837,8 +833,8 @@ public class ToscaTemplate extends Object { private boolean _isSubMappedNode(NodeTemplate nt, LinkedHashMap toscaTpl) { // Return True if the nodetemple is substituted if (nt != null && nt.getSubMappingToscaTemplate() == null && - getSubMappingNodeType(toscaTpl).equals(nt.getType()) && - nt.getInterfaces().size() < 1) { + getSubMappingNodeType(toscaTpl).equals(nt.getType()) && + nt.getInterfaces().size() < 1) { return true; } return false; @@ -865,7 +861,7 @@ public class ToscaTemplate extends Object { // Return substitution mappings node type if (toscaTpl != null) { return TopologyTemplate.getSubMappingNodeType( - (LinkedHashMap) toscaTpl.get(TOPOLOGY_TEMPLATE)); + (LinkedHashMap) toscaTpl.get(TOPOLOGY_TEMPLATE)); } return null; } @@ -873,7 +869,7 @@ public class ToscaTemplate extends Object { public boolean hasNestedTemplates() { // Return True if the tosca template has nested templates return nestedToscaTemplatesWithTopology != null && - nestedToscaTemplatesWithTopology.size() >= 1; + nestedToscaTemplatesWithTopology.size() >= 1; } @@ -897,33 +893,33 @@ public class ToscaTemplate extends Object { @Override public String toString() { return "ToscaTemplate{" + - "exttools=" + exttools + - ", VALID_TEMPLATE_VERSIONS=" + VALID_TEMPLATE_VERSIONS + - ", ADDITIONAL_SECTIONS=" + ADDITIONAL_SECTIONS + - ", isFile=" + isFile + - ", path='" + path + '\'' + - ", inputPath='" + inputPath + '\'' + - ", parsedParams=" + parsedParams + - ", tpl=" + tpl + - ", version='" + version + '\'' + - ", imports=" + imports + - ", relationshipTypes=" + relationshipTypes + - ", metaData=" + metaData + - ", description='" + description + '\'' + - ", topologyTemplate=" + topologyTemplate + - ", repositories=" + repositories + - ", inputs=" + inputs + - ", relationshipTemplates=" + relationshipTemplates + - ", nodeTemplates=" + nodeTemplates + - ", outputs=" + outputs + - ", policies=" + policies + - ", nestedToscaTplsWithTopology=" + nestedToscaTplsWithTopology + - ", nestedToscaTemplatesWithTopology=" + nestedToscaTemplatesWithTopology + - ", graph=" + graph + - ", csarTempDir='" + csarTempDir + '\'' + - ", nestingLoopCounter=" + nestingLoopCounter + - ", dataTypes=" + dataTypes + - '}'; + "exttools=" + exttools + + ", VALID_TEMPLATE_VERSIONS=" + VALID_TEMPLATE_VERSIONS + + ", ADDITIONAL_SECTIONS=" + ADDITIONAL_SECTIONS + + ", isFile=" + isFile + + ", path='" + path + '\'' + + ", inputPath='" + inputPath + '\'' + + ", parsedParams=" + parsedParams + + ", tpl=" + tpl + + ", version='" + version + '\'' + + ", imports=" + imports + + ", relationshipTypes=" + relationshipTypes + + ", metaData=" + metaData + + ", description='" + description + '\'' + + ", topologyTemplate=" + topologyTemplate + + ", repositories=" + repositories + + ", inputs=" + inputs + + ", relationshipTemplates=" + relationshipTemplates + + ", nodeTemplates=" + nodeTemplates + + ", outputs=" + outputs + + ", policies=" + policies + + ", nestedToscaTplsWithTopology=" + nestedToscaTplsWithTopology + + ", nestedToscaTemplatesWithTopology=" + nestedToscaTemplatesWithTopology + + ", graph=" + graph + + ", csarTempDir='" + csarTempDir + '\'' + + ", nestingLoopCounter=" + nestingLoopCounter + + ", dataTypes=" + dataTypes + + '}'; } public List getInputs(boolean annotationsRequired) { diff --git a/jtosca/src/main/java/org/onap/sdc/toscaparser/api/elements/ArtifactDef.java b/jtosca/src/main/java/org/onap/sdc/toscaparser/api/elements/ArtifactDef.java new file mode 100644 index 0000000..f2713ee --- /dev/null +++ b/jtosca/src/main/java/org/onap/sdc/toscaparser/api/elements/ArtifactDef.java @@ -0,0 +1,55 @@ +/* + * - + * ============LICENSE_START======================================================= + * Copyright (C) 2022 Nordix Foundation. + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.sdc.toscaparser.api.elements; + +import java.util.Map; +import lombok.Getter; +import lombok.NonNull; + +@Getter +public class ArtifactDef { + + @NonNull + private final String type; + @NonNull + private final String file; + private final String repository; + private final String description; + private final String deploy_path; + private final String artifact_version; + private final String checksum; + private final String checksum_algorithm; + private final Map properties; + + public ArtifactDef(final Map mapDef) { + type = (String) mapDef.get("type"); + file = (String) mapDef.get("file"); + repository = (String) mapDef.get("repository"); + description = (String) mapDef.get("description"); + deploy_path = (String) mapDef.get("deploy_path"); + artifact_version = (String) mapDef.get("artifact_version"); + checksum = (String) mapDef.get("checksum"); + checksum_algorithm = (String) mapDef.get("checksum_algorithm"); + properties = (Map) mapDef.get("properties"); + } + +} diff --git a/jtosca/src/main/java/org/onap/sdc/toscaparser/api/elements/ArtifactTypeDef.java b/jtosca/src/main/java/org/onap/sdc/toscaparser/api/elements/ArtifactTypeDef.java index 9cf8c6c..c160a32 100644 --- a/jtosca/src/main/java/org/onap/sdc/toscaparser/api/elements/ArtifactTypeDef.java +++ b/jtosca/src/main/java/org/onap/sdc/toscaparser/api/elements/ArtifactTypeDef.java @@ -21,7 +21,9 @@ package org.onap.sdc.toscaparser.api.elements; import java.util.LinkedHashMap; +import lombok.Getter; +@Getter public class ArtifactTypeDef extends StatefulEntityType { private String type; @@ -29,7 +31,6 @@ public class ArtifactTypeDef extends StatefulEntityType { private LinkedHashMap properties; private LinkedHashMap parentArtifacts; - public ArtifactTypeDef(String type, LinkedHashMap customDef) { super(type, ARTIFACT_PREFIX, customDef); @@ -76,46 +77,4 @@ public class ArtifactTypeDef extends StatefulEntityType { return null; } - public String getType() { - return type; - } - } - -/*python -class ArtifactTypeDef(StatefulEntityType): - '''TOSCA built-in artifacts type.''' - - def __init__(self, atype, custom_def=None): - super(ArtifactTypeDef, self).__init__(atype, self.ARTIFACT_PREFIX, - custom_def) - self.type = atype - self.custom_def = custom_def - self.properties = None - if self.PROPERTIES in self.defs: - self.properties = self.defs[self.PROPERTIES] - self.parent_artifacts = self._get_parent_artifacts() - - def _get_parent_artifacts(self): - artifacts = {} - parent_artif = self.parent_type.type if self.parent_type else None - if parent_artif: - while parent_artif != 'tosca.artifacts.Root': - artifacts[parent_artif] = self.TOSCA_DEF[parent_artif] - parent_artif = artifacts[parent_artif]['derived_from'] - return artifacts - - @property - def parent_type(self): - '''Return a artifact entity from which this entity is derived.''' - if not hasattr(self, 'defs'): - return None - partifact_entity = self.derived_from(self.defs) - if partifact_entity: - return ArtifactTypeDef(partifact_entity, self.custom_def) - - def get_artifact(self, name): - '''Return the definition of an artifact field by name.''' - if name in self.defs: - return self.defs[name] -*/ diff --git a/jtosca/src/main/java/org/onap/sdc/toscaparser/api/elements/TypeValidation.java b/jtosca/src/main/java/org/onap/sdc/toscaparser/api/elements/TypeValidation.java index 18dd5ca..a30e25c 100644 --- a/jtosca/src/main/java/org/onap/sdc/toscaparser/api/elements/TypeValidation.java +++ b/jtosca/src/main/java/org/onap/sdc/toscaparser/api/elements/TypeValidation.java @@ -62,6 +62,8 @@ public class TypeValidation { ArrayList vtv = new ArrayList<>(); vtv.add("tosca_simple_yaml_1_0"); vtv.add("tosca_simple_yaml_1_1"); + vtv.add("tosca_simple_yaml_1_2"); + vtv.add("tosca_simple_yaml_1_3"); ExtTools exttools = new ExtTools(); vtv.addAll(exttools.getVersions()); return vtv; diff --git a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/EntityDetails.java b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/EntityDetails.java index afdb90e..09ad6b4 100644 --- a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/EntityDetails.java +++ b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/EntityDetails.java @@ -26,7 +26,6 @@ import org.onap.sdc.tosca.parser.enums.SdcTypes; import org.onap.sdc.toscaparser.api.*; import org.onap.sdc.toscaparser.api.parameters.Input; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; @@ -132,7 +131,7 @@ public abstract class EntityDetails implements IEntityDetails { List children =((NodeTemplate) ((NodeTemplateEntityDetails)member).getEntityTemplate()) .getSubMappingToscaTemplate().getNodeTemplates(); List vfcChildren = children.stream() - .filter(c -> SdcTypes.VFC.getValue().equals(c.getMetaData().getValue(TYPE))) + .filter(c -> SdcTypes.VFC.getValue().equals(c.getMetadata().getValue(TYPE))) .collect(toList()); return !vfcChildren.isEmpty(); } diff --git a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/NodeTemplateEntityDetails.java b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/NodeTemplateEntityDetails.java index b5c1340..890a01c 100644 --- a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/NodeTemplateEntityDetails.java +++ b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/NodeTemplateEntityDetails.java @@ -45,7 +45,7 @@ public class NodeTemplateEntityDetails extends EntityDetails { @Override public Metadata getMetadata() { - return nodeTemplate.getMetaData(); + return nodeTemplate.getMetadata(); } @Override diff --git a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/queries/NodeTemplateEntityQuery.java b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/queries/NodeTemplateEntityQuery.java index 352d28d..caafa1d 100644 --- a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/queries/NodeTemplateEntityQuery.java +++ b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/queries/NodeTemplateEntityQuery.java @@ -79,9 +79,9 @@ public class NodeTemplateEntityQuery extends EntityQuery { private Stream filter(final List nodeTemplateList) { return nodeTemplateList.stream() - .filter(nt -> isSearchCriteriaMatched(nt.getMetaData(), nt.getType())) + .filter(nt -> isSearchCriteriaMatched(nt.getMetadata(), nt.getType())) .filter(nt -> getNodeTemplateType() == null || - isStringMatchingOrNull(nt.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE), + isStringMatchingOrNull(nt.getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE), getNodeTemplateType().getValue())); } diff --git a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/queries/TopologyTemplateQuery.java b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/queries/TopologyTemplateQuery.java index 99dd7fd..88e1eac 100644 --- a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/queries/TopologyTemplateQuery.java +++ b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/queries/TopologyTemplateQuery.java @@ -66,7 +66,7 @@ public class TopologyTemplateQuery { } public Boolean isMatchingSearchCriteria(NodeTemplate nodeTemplate) { - boolean isMatched = Objects.nonNull(nodeTemplate.getMetaData()) && isSearchedTemplate(nodeTemplate.getMetaData()); + boolean isMatched = Objects.nonNull(nodeTemplate.getMetadata()) && isSearchedTemplate(nodeTemplate.getMetadata()); if(logger.isDebugEnabled()) { logger.debug("Node template {} is{} matching search criteria", nodeTemplate.getName(), isMatched ? "" : " not"); } diff --git a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/impl/QueryProcessor.java b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/impl/QueryProcessor.java index c703e2c..5bbd2aa 100644 --- a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/impl/QueryProcessor.java +++ b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/impl/QueryProcessor.java @@ -126,7 +126,7 @@ class QueryProcessor { final List topologyTemplateList = Collections.emptyList(); boolean isTopologyTemplateFound = isRecursive ? - SdcTypes.isComplex(current.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)) + SdcTypes.isComplex(current.getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)) : topologyTemplateQuery.isMatchingSearchCriteria(current); if (isTopologyTemplateFound) { topologyTemplateList.add(current); @@ -135,7 +135,7 @@ class QueryProcessor { return topologyTemplateList; } } - if (SdcTypes.isComplex(current.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)) && + if (SdcTypes.isComplex(current.getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)) && current.getSubMappingToscaTemplate() != null) { //search the node template inside a given topology template topologyTemplateList.addAll(current.getSubMappingToscaTemplate().getNodeTemplates() diff --git a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/impl/SdcCsarHelperImpl.java b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/impl/SdcCsarHelperImpl.java index 921a145..20e0582 100644 --- a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/impl/SdcCsarHelperImpl.java +++ b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/impl/SdcCsarHelperImpl.java @@ -7,9 +7,9 @@ * 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. @@ -20,20 +20,20 @@ package org.onap.sdc.tosca.parser.impl; -import java.util.List; +import static java.util.stream.Collectors.toList; + import java.util.ArrayList; import java.util.Arrays; -import java.util.Map; -import java.util.Map.Entry; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; -import java.util.Optional; -import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import java.util.Objects; +import java.util.Optional; import java.util.stream.Collectors; -import static java.util.stream.Collectors.toList; - import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -74,9 +74,9 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { private static final String PATH_DELIMITER = "#"; private static final String CUSTOMIZATION_UUID = "customizationUUID"; private static final String GROUPS_VF_MODULE = "org.openecomp.groups.VfModule"; + private static final Logger log = LoggerFactory.getLogger(SdcCsarHelperImpl.class.getName()); private ToscaTemplate toscaTemplate; private ConfigurationManager configurationManager; - private static Logger log = LoggerFactory.getLogger(SdcCsarHelperImpl.class.getName()); public SdcCsarHelperImpl(ToscaTemplate toscaTemplate) { this.toscaTemplate = toscaTemplate; @@ -86,137 +86,144 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { this.toscaTemplate = toscaTemplate; this.configurationManager = configurationManager; } - + @Override public List getPoliciesOfTarget(NodeTemplate nodeTemplate) { - return getPoliciesOfNodeTemplate(nodeTemplate.getName()) - .stream() - .sorted(Policy::compareTo) - .collect(toList()); + return getPoliciesOfNodeTemplate(nodeTemplate.getName()) + .stream() + .sorted(Policy::compareTo) + .collect(toList()); } - + @Override - public List getPoliciesOfOriginOfNodeTemplate(NodeTemplate nodeTemplate) { - if(StringUtils.isNotEmpty(nodeTemplate.getName())){ - return getNodeTemplateByName(nodeTemplate.getName()).getOriginComponentTemplate().getPolicies(); - } - return new ArrayList<>(); + public List getPoliciesOfOriginOfNodeTemplate(NodeTemplate nodeTemplate) { + if (StringUtils.isNotEmpty(nodeTemplate.getName())) { + return getNodeTemplateByName(nodeTemplate.getName()).getOriginComponentTemplate().getPolicies(); + } + return new ArrayList<>(); } - + @Override public List getPoliciesOfTargetByToscaPolicyType(NodeTemplate nodeTemplate, String policyTypeName) { - return getPoliciesOfNodeTemplate(nodeTemplate.getName()) - .stream() - .filter(p->p.getType().equals(policyTypeName)) - .sorted(Policy::compareTo) - .collect(toList()); + return getPoliciesOfNodeTemplate(nodeTemplate.getName()) + .stream() + .filter(p -> p.getType().equals(policyTypeName)) + .sorted(Policy::compareTo) + .collect(toList()); } - + @Override public List getPoliciesOfOriginOfNodeTemplateByToscaPolicyType(NodeTemplate nodeTemplate, String policyTypeName) { - return getPoliciesOfOriginOfNodeTemplate(nodeTemplate) - .stream() - .filter(p->p.getType().equals(policyTypeName)) - .sorted(Policy::compareTo) - .collect(toList()); + return getPoliciesOfOriginOfNodeTemplate(nodeTemplate) + .stream() + .filter(p -> p.getType().equals(policyTypeName)) + .sorted(Policy::compareTo) + .collect(toList()); } @Override public List getPolicyTargetsFromTopologyTemplate(String policyName) { - if(toscaTemplate.getNodeTemplates() == null){ - return new ArrayList<>(); - } - List targetNames = getPolicyTargets(policyName); - return toscaTemplate.getNodeTemplates().stream() - .filter(nt->targetNames.contains(nt.getName())) - .collect(toList()); - } - - @Override - public List getPolicyTargetsFromOrigin(NodeTemplate nodeTemplate, String policyName) { - if(StringUtils.isNotEmpty(nodeTemplate.getName())){ + if (toscaTemplate.getNodeTemplates() == null) { + return new ArrayList<>(); + } + List targetNames = getPolicyTargets(policyName); + return toscaTemplate.getNodeTemplates().stream() + .filter(nt -> targetNames.contains(nt.getName())) + .collect(toList()); + } + + @Override + public List getPolicyTargetsFromOrigin(NodeTemplate nodeTemplate, String policyName) { + if (StringUtils.isNotEmpty(nodeTemplate.getName())) { Optional policyOpt = getNodeTemplateByName(nodeTemplate.getName()) - .getOriginComponentTemplate() - .getPolicies() - .stream() - .filter(p -> p.getName() - .equals(policyName)) - .findFirst(); - if(policyOpt.isPresent()){ + .getOriginComponentTemplate() + .getPolicies() + .stream() + .filter(p -> p.getName() + .equals(policyName)) + .findFirst(); + if (policyOpt.isPresent()) { List targets = policyOpt.get().getTargets(); if (targets != null) { return nodeTemplate.getOriginComponentTemplate().getNodeTemplates() - .stream() - .filter(nt -> targets.contains(nt.getName())).collect(Collectors.toList()); + .stream() + .filter(nt -> targets.contains(nt.getName())).collect(Collectors.toList()); } } - } - return new ArrayList<>(); - } - - @Override - public List getPoliciesOfTopologyTemplate(){ - if(toscaTemplate.getPolicies() == null) - return new ArrayList<>(); - return toscaTemplate.getPolicies() - .stream() - .sorted(Policy::compareTo) - .collect(toList()); - } - - @Override - public List getPoliciesOfTopologyTemplateByToscaPolicyType(String policyTypeName){ - if(toscaTemplate.getPolicies() == null) - return new ArrayList<>(); - return toscaTemplate.getPolicies() - .stream() - .filter(p->p.getType().equals(policyTypeName)) - .sorted(Policy::compareTo) - .collect(toList()); - } - + } + return new ArrayList<>(); + } + + @Override + public List getPoliciesOfTopologyTemplate() { + if (toscaTemplate.getPolicies() == null) { + return new ArrayList<>(); + } + return toscaTemplate.getPolicies() + .stream() + .sorted(Policy::compareTo) + .collect(toList()); + } + + @Override + public List getPoliciesOfTopologyTemplateByToscaPolicyType(String policyTypeName) { + if (toscaTemplate.getPolicies() == null) { + return new ArrayList<>(); + } + return toscaTemplate.getPolicies() + .stream() + .filter(p -> p.getType().equals(policyTypeName)) + .sorted(Policy::compareTo) + .collect(toList()); + } + + @Override public NodeTemplate getNodeTemplateByName(String nodeTemplateName) { - if(toscaTemplate.getNodeTemplates() == null) - return null; - return toscaTemplate.getNodeTemplates() - .stream() - .filter(nt -> nt.getName().equals(nodeTemplateName)) - .findFirst().orElse(null); - } - + if (toscaTemplate.getNodeTemplates() == null) { + return null; + } + return toscaTemplate.getNodeTemplates() + .stream() + .filter(nt -> nt.getName().equals(nodeTemplateName)) + .findFirst().orElse(null); + } + private List getPoliciesOfNodeTemplate(String nodeTemplateName) { - if(toscaTemplate.getPolicies() == null) - return new ArrayList<>(); - return toscaTemplate.getPolicies() - .stream() - .filter(p -> p.getTargets()!= null && p.getTargets().contains(nodeTemplateName)) - .collect(toList()); - } - + if (toscaTemplate.getPolicies() == null) { + return new ArrayList<>(); + } + return toscaTemplate.getPolicies() + .stream() + .filter(p -> p.getTargets() != null && p.getTargets().contains(nodeTemplateName)) + .collect(toList()); + } + private List getPolicyTargets(String policyName) { - return getPolicyByName(policyName).map(Policy::getTargets).orElse(new ArrayList<>()); + return getPolicyByName(policyName).map(Policy::getTargets).orElse(new ArrayList<>()); } - + private List getGroupMembers(String groupName) { - return getGroupByName(groupName).map(Group::getMembers).orElse(new ArrayList<>()); + return getGroupByName(groupName).map(Group::getMembers).orElse(new ArrayList<>()); } - + private Optional getPolicyByName(String policyName) { - if(toscaTemplate.getPolicies() == null) - return Optional.empty(); - return toscaTemplate.getPolicies() - .stream() - .filter(p -> p.getName().equals(policyName)).findFirst(); + if (toscaTemplate.getPolicies() == null) { + return Optional.empty(); + } + return toscaTemplate.getPolicies() + .stream() + .filter(p -> p.getName().equals(policyName)).findFirst(); } - + private Optional getGroupByName(String groupName) { - if(toscaTemplate.getGroups() == null) - return Optional.empty(); - return toscaTemplate.getGroups() - .stream() - .filter(g -> g.getName().equals(groupName)).findFirst(); + if (toscaTemplate.getGroups() == null) { + return Optional.empty(); + } + return toscaTemplate.getGroups() + .stream() + .filter(g -> g.getName().equals(groupName)).findFirst(); } - + @Override //Sunny flow - covered with UT, flat and nested public String getNodeTemplatePropertyLeafValue(NodeTemplate nodeTemplate, String leafValuePath) { @@ -238,7 +245,8 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { LinkedHashMap properties = nodeTemplate.getProperties(); return PropertyUtils.processProperties(split, properties); } - + + @Override public Map> getCpPropertiesFromVfcAsObject(NodeTemplate vfc) { if (vfc == null) { log.error("getCpPropertiesFromVfc - vfc is null"); @@ -264,21 +272,22 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { return cps; } - private void findPutAllPortsProperties(Map> cps, Map props) { - if (!cps.isEmpty()) { - for (Entry> port : cps.entrySet()) { - for (Map.Entry property: props.entrySet()) { - if (property.getKey().startsWith(port.getKey())) { - String portProperty = property.getKey().replaceFirst(port.getKey() + "_", ""); - if (property.getValue() != null) { - cps.get(port.getKey()).put(portProperty, property.getValue().getValue()); - } - } - } - } - } - } + private void findPutAllPortsProperties(Map> cps, Map props) { + if (!cps.isEmpty()) { + for (Entry> port : cps.entrySet()) { + for (Map.Entry property : props.entrySet()) { + if (property.getKey().startsWith(port.getKey())) { + String portProperty = property.getKey().replaceFirst(port.getKey() + "_", ""); + if (property.getValue() != null) { + cps.get(port.getKey()).put(portProperty, property.getValue().getValue()); + } + } + } + } + } + } + @Override public Map> getCpPropertiesFromVfc(NodeTemplate vfc) { if (vfc == null) { @@ -304,20 +313,20 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { return cps; } - private void findBuildPutAllPortsProperties(Map> cps, Map props) { - if (!cps.isEmpty()) { - for (Entry> port : cps.entrySet()) { - for (Map.Entry property: props.entrySet()) { - if (property.getKey().startsWith(port.getKey())) { - Map portPaths = new HashMap<>(); - String portProperty = property.getKey().replaceFirst(port.getKey() + "_", ""); - buildPathMappedToValue(portProperty, property.getValue().getValue(), portPaths); - cps.get(port.getKey()).putAll(portPaths); - } - } - } - } - } + private void findBuildPutAllPortsProperties(Map> cps, Map props) { + if (!cps.isEmpty()) { + for (Entry> port : cps.entrySet()) { + for (Map.Entry property : props.entrySet()) { + if (property.getKey().startsWith(port.getKey())) { + Map portPaths = new HashMap<>(); + String portProperty = property.getKey().replaceFirst(port.getKey() + "_", ""); + buildPathMappedToValue(portProperty, property.getValue().getValue(), portPaths); + cps.get(port.getKey()).putAll(portPaths); + } + } + } + } + } @SuppressWarnings("unchecked") private void buildPathMappedToValue(String path, Object property, Map pathsMap) { @@ -330,7 +339,7 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { } } } else if (property instanceof List) { - for (Object item: (List)property) { + for (Object item : (List) property) { buildPathMappedToValue(path, item, pathsMap); } } else { @@ -365,7 +374,6 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { return metadata.getValue(metadataPropertyName); } - @Override //Sunny flow - covered with UT public List getServiceNodeTemplatesByType(String nodeType) { @@ -385,7 +393,6 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { return res; } - @Override public List getServiceNodeTemplates() { return toscaTemplate.getNodeTemplates(); @@ -416,12 +423,14 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { String name = nodeTemplateByCustomizationUuid.getName(); String normaliseComponentInstanceName = SdcToscaUtility.normaliseComponentInstanceName(name); List serviceLevelGroups = toscaTemplate.getTopologyTemplate().getGroups(); - log.debug("getVfModulesByVf - VF node template name {}, normalized name {}. Searching groups on service level starting with VF normalized name...", name, normaliseComponentInstanceName); + log.debug( + "getVfModulesByVf - VF node template name {}, normalized name {}. Searching groups on service level starting with VF normalized name...", + name, normaliseComponentInstanceName); if (serviceLevelGroups != null) { return serviceLevelGroups - .stream() - .filter(x -> GROUPS_VF_MODULE.equals(x.getTypeDefinition().getType()) && x.getName().startsWith(normaliseComponentInstanceName)) - .collect(toList()); + .stream() + .filter(x -> GROUPS_VF_MODULE.equals(x.getTypeDefinition().getType()) && x.getName().startsWith(normaliseComponentInstanceName)) + .collect(toList()); } } return new ArrayList<>(); @@ -448,7 +457,7 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { Input input = findFirst.get(); Object current = input.getDefault(); Object property = PropertyUtils.iterateProcessPath(2, current, split); - return property == null || property instanceof Function? null : String.valueOf(property); + return property == null || property instanceof Function ? null : String.valueOf(property); } } log.error("getServiceInputLeafValue - value not found"); @@ -464,7 +473,8 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { String[] split = getSplittedPath(inputLeafValuePath); if (split.length < 2 || !split[1].equals("default")) { - log.error("getServiceInputLeafValueOfDefaultAsObject - inputLeafValuePath should be of format #default[optionally #] "); + log.error( + "getServiceInputLeafValueOfDefaultAsObject - inputLeafValuePath should be of format #default[optionally #] "); return null; } @@ -485,7 +495,6 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { return leafValuePath.split(PATH_DELIMITER); } - @Override //Sunny flow - covered with UT public String getServiceSubstitutionMappingsTypeName() { @@ -513,7 +522,7 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { @Override //Sunny flow - covered with UT public Map getServiceMetadataProperties() { - if (toscaTemplate.getMetaData() == null){ + if (toscaTemplate.getMetaData() == null) { return null; } return new HashMap<>(toscaTemplate.getMetaData().getAllProperties()); @@ -521,7 +530,7 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { @Override public Map getServiceMetadataAllProperties() { - if (toscaTemplate.getMetaData() == null){ + if (toscaTemplate.getMetaData() == null) { return null; } return toscaTemplate.getMetaData().getAllProperties(); @@ -549,7 +558,7 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { String[] split = getSplittedPath(leafValuePath); LinkedHashMap properties = group.getProperties(); Object property = PropertyUtils.processProperties(split, properties); - return property == null || property instanceof Function? null : String.valueOf(property); + return property == null || property instanceof Function ? null : String.valueOf(property); } @Override @@ -589,8 +598,9 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { return cpList; } cpList = getNodeTemplateBySdcType(vfInstance, SdcTypes.CP); - if (cpList == null || cpList.isEmpty()) + if (cpList == null || cpList.isEmpty()) { log.debug("getCpListByVf cps not exist for vfCustomizationId {}", vfCustomizationId); + } return cpList; } @@ -602,19 +612,22 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { return new ArrayList<>(); } - if (serviceLevelVfModule == null || serviceLevelVfModule.getMetadata() == null || serviceLevelVfModule.getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELINVARIANTUUID) == null) { - log.error("getMembersOfVfModule - vfModule or its metadata is null. Cannot match a VF group based on invariantUuid from missing metadata."); + if (serviceLevelVfModule == null || serviceLevelVfModule.getMetadata() == null + || serviceLevelVfModule.getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELINVARIANTUUID) == null) { + log.error( + "getMembersOfVfModule - vfModule or its metadata is null. Cannot match a VF group based on invariantUuid from missing metadata."); return new ArrayList<>(); } - SubstitutionMappings substitutionMappings = vf.getSubMappingToscaTemplate(); if (substitutionMappings != null) { List groups = substitutionMappings.getGroups(); if (groups != null) { Optional findFirst = groups - .stream() - .filter(x -> (x.getMetadata() != null && serviceLevelVfModule.getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELINVARIANTUUID).equals(x.getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELINVARIANTUUID)))).findFirst(); + .stream() + .filter(x -> (x.getMetadata() != null && serviceLevelVfModule.getMetadata() + .getValue(SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELINVARIANTUUID) + .equals(x.getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELINVARIANTUUID)))).findFirst(); if (findFirst.isPresent()) { List members = findFirst.get().getMembers(); if (members != null) { @@ -628,7 +641,7 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { @Override public List> getNodeTemplatePairsByReqName( - List listOfReqNodeTemplates, List listOfCapNodeTemplates, String reqName) { + List listOfReqNodeTemplates, List listOfCapNodeTemplates, String reqName) { if (listOfReqNodeTemplates == null) { log.error("getNodeTemplatePairsByReqName - listOfReqNodeTemplates is null"); @@ -672,8 +685,8 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { log.error("getAllottedResources nodeTemplates not exist"); } nodeTemplates = nodeTemplates.stream().filter( - x -> x.getMetaData() != null && x.getMetaData().getValue("category").equals("Allotted Resource")) - .collect(toList()); + x -> x.getMetadata() != null && x.getMetadata().getValue("category").equals("Allotted Resource")) + .collect(toList()); if (nodeTemplates.isEmpty()) { log.debug("getAllottedResources - allotted resources not exist"); } @@ -700,58 +713,60 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { */ @Override public String getConformanceLevel() { - LinkedHashMap csarMeta = toscaTemplate.getMetaProperties("csar.meta"); - if (csarMeta == null){ - log.warn("No csar.meta file is found in CSAR - this file should hold the conformance level of the CSAR. This might be OK for older CSARs."); - if (configurationManager != null && !configurationManager.getErrorConfiguration() - .getErrorInfo("CONFORMANCE_LEVEL_ERROR").getFailOnError()){ - String csarConLevel = configurationManager.getConfiguration().getConformanceLevel().getMaxVersion(); - log.warn("csarConformanceLevel is not found in input csar; defaulting to max version {}" , csarConLevel); - return csarConLevel; - } - else { - log.warn("csarConformanceLevel is not found in input csar; returning null as no defaults defined in error configuration"); - return null; - } - } - - Object conformanceLevel = csarMeta.get("SDC-TOSCA-Definitions-Version"); - if (conformanceLevel != null){ - String confLevelStr = conformanceLevel.toString(); - log.debug("CSAR conformance level is {}", confLevelStr); - return confLevelStr; - } else { - log.error("Invalid csar.meta file - no entry found for SDC-TOSCA-Definitions-Version key. This entry should hold the conformance level."); - return null; - } - } - - - @Override - public String getNodeTemplateCustomizationUuid(NodeTemplate nt) { - String res = null; - if (nt != null && nt.getMetaData() != null){ - res = nt.getMetaData().getValue(CUSTOMIZATION_UUID); - } else { - log.error("Node template or its metadata is null"); - } - return res; - } + LinkedHashMap csarMeta = toscaTemplate.getMetaProperties("csar.meta"); + if (csarMeta == null) { + log.warn( + "No csar.meta file is found in CSAR - this file should hold the conformance level of the CSAR. This might be OK for older CSARs."); + if (configurationManager != null && !configurationManager.getErrorConfiguration() + .getErrorInfo("CONFORMANCE_LEVEL_ERROR").getFailOnError()) { + String csarConLevel = configurationManager.getConfiguration().getConformanceLevel().getMaxVersion(); + log.warn("csarConformanceLevel is not found in input csar; defaulting to max version {}", csarConLevel); + return csarConLevel; + } else { + log.warn("csarConformanceLevel is not found in input csar; returning null as no defaults defined in error configuration"); + return null; + } + } + Object conformanceLevel = csarMeta.get("SDC-TOSCA-Definitions-Version"); + if (conformanceLevel != null) { + String confLevelStr = conformanceLevel.toString(); + log.debug("CSAR conformance level is {}", confLevelStr); + return confLevelStr; + } else { + log.error("Invalid csar.meta file - no entry found for SDC-TOSCA-Definitions-Version key. This entry should hold the conformance level."); + return null; + } + } + + + @Override + public String getNodeTemplateCustomizationUuid(NodeTemplate nt) { + String res = null; + if (nt != null && nt.getMetadata() != null) { + res = nt.getMetadata().getValue(CUSTOMIZATION_UUID); + } else { + log.error("Node template or its metadata is null"); + } + return res; + } + + @Override public List getNodeTemplateBySdcType(NodeTemplate parentNodeTemplate, SdcTypes sdcType) { - return getNodeTemplateBySdcType(parentNodeTemplate, sdcType, false); + return getNodeTemplateBySdcType(parentNodeTemplate, sdcType, false); } + @Override public boolean isNodeTypeSupported(NodeTemplate nodeTemplate) { SdcTypes[] supportedTypes = SdcTypes.values(); return Arrays.stream(supportedTypes) - .anyMatch(v->nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE) - .equals(v.getValue())); + .anyMatch(v -> nodeTemplate.getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE) + .equals(v.getValue())); } - - private List getNodeTemplateBySdcType(NodeTemplate parentNodeTemplate, SdcTypes sdcType, boolean isVNF) { - - if (parentNodeTemplate == null) { + + private List getNodeTemplateBySdcType(NodeTemplate parentNodeTemplate, SdcTypes sdcType, boolean isVNF) { + + if (parentNodeTemplate == null) { log.error("getNodeTemplateBySdcType - nodeTemplate is null or empty"); return new ArrayList<>(); } @@ -766,24 +781,23 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { if (substitutionMappings != null) { List nodeTemplates = substitutionMappings.getNodeTemplates(); if (nodeTemplates != null && !nodeTemplates.isEmpty()) { - if (sdcType.equals(SdcTypes.VFC) && isVNF) { - return nodeTemplates.stream() - .filter(x -> (x.getMetaData() != null && - sdcType.getValue().equals(x.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE))) && isVNFType(x)) - .collect(toList()); - } - else { + if (sdcType.equals(SdcTypes.VFC) && isVNF) { return nodeTemplates.stream() - .filter(x -> (x.getMetaData() != null && - sdcType.getValue().equals(x.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE))) && !isVNFType(x)) - .collect(toList()); - } - } - else { + .filter(x -> (x.getMetadata() != null && + sdcType.getValue().equals(x.getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE))) && isVNFType(x)) + .collect(toList()); + } else { + return nodeTemplates.stream() + .filter(x -> (x.getMetadata() != null && + sdcType.getValue().equals(x.getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE))) && !isVNFType(x)) + .collect(toList()); + } + } else { log.debug("getNodeTemplateBySdcType - SubstitutionMappings' node Templates not exist"); } - } else + } else { log.debug("getNodeTemplateBySdcType - SubstitutionMappings not exist"); + } return new ArrayList<>(); } @@ -821,10 +835,10 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { return filterMap; } - - public NodeTemplate getVnfConfig(String vfCustomizationUuid) { - - if (GeneralUtility.isEmptyString(vfCustomizationUuid)) { + + public NodeTemplate getVnfConfig(String vfCustomizationUuid) { + + if (GeneralUtility.isEmptyString(vfCustomizationUuid)) { log.error("getVnfConfig - vfCustomizationId - is null or empty"); return null; } @@ -832,7 +846,7 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { List serviceVfList = getServiceVfList(); NodeTemplate vfInstance = getNodeTemplateByCustomizationUuid(serviceVfList, vfCustomizationUuid); return getNodeTemplateBySdcType(vfInstance, SdcTypes.VFC, true).stream().findAny().orElse(null); - } + } @Override public boolean hasTopology(NodeTemplate nodeTemplate) { @@ -841,8 +855,8 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { return false; } - if (nodeTemplate.getMetaData() != null) { - String type = nodeTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE); + if (nodeTemplate.getMetadata() != null) { + String type = nodeTemplate.getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE); log.debug("hasTopology - node template {} is a {} type", nodeTemplate.getName(), type); return SdcTypes.isComplex(type); } @@ -863,14 +877,14 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { if (nodeTemplates != null && !nodeTemplates.isEmpty()) { return nodeTemplates.stream() - .filter(x -> !isVNFType(x)) - .collect(toList()); - } - else { + .filter(x -> !isVNFType(x)) + .collect(toList()); + } else { log.debug("getNodeTemplateChildren - SubstitutionMappings' node Templates not exist"); } - } else + } else { log.debug("getNodeTemplateChildren - SubstitutionMappings not exist"); + } return new ArrayList<>(); } @@ -883,7 +897,7 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { } List nodeTemplates = getServiceNodeTemplates(); - Optional findFirst = nodeTemplates.stream().filter(nt -> nt.getName().equals(nodeName)).findFirst(); + Optional findFirst = nodeTemplates.stream().filter(nt -> nt.getName().equals(nodeName)).findFirst(); return findFirst.isPresent() ? findFirst.get() : null; } @@ -895,7 +909,7 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { return null; } - return nt.getMetaData(); + return nt.getMetadata(); } @Override @@ -935,77 +949,79 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { Object property = PropertyUtils.processProperties(split, properties); return property == null || property instanceof Function ? null : String.valueOf(property); } - + @Override public ArrayList getGroupsOfOriginOfNodeTemplate(NodeTemplate nodeTemplate) { - if(StringUtils.isNotEmpty(nodeTemplate.getName())){ - return getNodeTemplateByName(nodeTemplate.getName()).getSubMappingToscaTemplate().getGroups(); - } - return new ArrayList<>(); + if (StringUtils.isNotEmpty(nodeTemplate.getName())) { + return getNodeTemplateByName(nodeTemplate.getName()).getSubMappingToscaTemplate().getGroups(); + } + return new ArrayList<>(); } @Override public ArrayList getGroupsOfTopologyTemplateByToscaGroupType(String groupType) { - if(toscaTemplate.getGroups() == null) - return new ArrayList<>(); - return (ArrayList) toscaTemplate.getGroups() - .stream() - .filter(g->g.getType().equals(groupType)) - .sorted(Group::compareTo) - .collect(toList()); - } - + if (toscaTemplate.getGroups() == null) { + return new ArrayList<>(); + } + return (ArrayList) toscaTemplate.getGroups() + .stream() + .filter(g -> g.getType().equals(groupType)) + .sorted(Group::compareTo) + .collect(toList()); + } + @Override public ArrayList getGroupsOfTopologyTemplate() { - return toscaTemplate.getGroups() == null ? new ArrayList<>() : toscaTemplate.getGroups(); + return toscaTemplate.getGroups() == null ? new ArrayList<>() : toscaTemplate.getGroups(); } - + @Override public ArrayList getGroupsOfOriginOfNodeTemplateByToscaGroupType(NodeTemplate nodeTemplate, String groupType) { - return (ArrayList) getGroupsOfOriginOfNodeTemplate(nodeTemplate) - .stream() - .filter(g->g.getType().equals(groupType)) - .sorted(Group::compareTo) - .collect(toList()); + return (ArrayList) getGroupsOfOriginOfNodeTemplate(nodeTemplate) + .stream() + .filter(g -> g.getType().equals(groupType)) + .sorted(Group::compareTo) + .collect(toList()); } @Override public List getGroupMembersFromTopologyTemplate(String groupName) { - if(toscaTemplate.getNodeTemplates() == null){ - return new ArrayList<>(); - } - List membersNames = getGroupMembers(groupName); - return toscaTemplate.getNodeTemplates().stream() - .filter(nt->membersNames.contains(nt.getName())) - .collect(toList()); + if (toscaTemplate.getNodeTemplates() == null) { + return new ArrayList<>(); + } + List membersNames = getGroupMembers(groupName); + return toscaTemplate.getNodeTemplates().stream() + .filter(nt -> membersNames.contains(nt.getName())) + .collect(toList()); } - + @Override public List getGroupMembersOfOriginOfNodeTemplate(NodeTemplate nodeTemplate, String groupName) { - ArrayList groups = getGroupsOfOriginOfNodeTemplate(nodeTemplate); - if(!groups.isEmpty()){ - Optional group = groups.stream().filter(g -> g.getName().equals(groupName)).findFirst(); - if(group.isPresent()){ - return nodeTemplate.getSubMappingToscaTemplate().getNodeTemplates().stream() - .filter(nt -> group.get().getMembers().contains(nt.getName())) - .collect(toList()); - } - } - return new ArrayList<>(); - } - + ArrayList groups = getGroupsOfOriginOfNodeTemplate(nodeTemplate); + if (!groups.isEmpty()) { + Optional group = groups.stream().filter(g -> g.getName().equals(groupName)).findFirst(); + if (group.isPresent()) { + return nodeTemplate.getSubMappingToscaTemplate().getNodeTemplates().stream() + .filter(nt -> group.get().getMembers().contains(nt.getName())) + .collect(toList()); + } + } + return new ArrayList<>(); + } + + @Override public List getServiceNodeTemplateBySdcType(SdcTypes sdcType) { - if (sdcType == null) { - log.error("getServiceNodeTemplateBySdcType - sdcType is null or empty"); - return new ArrayList<>(); - } - - TopologyTemplate topologyTemplate = toscaTemplate.getTopologyTemplate(); - return getNodeTemplateBySdcType(topologyTemplate, sdcType); + if (sdcType == null) { + log.error("getServiceNodeTemplateBySdcType - sdcType is null or empty"); + return new ArrayList<>(); + } + + TopologyTemplate topologyTemplate = toscaTemplate.getTopologyTemplate(); + return getNodeTemplateBySdcType(topologyTemplate, sdcType); } - /************************************* helper functions ***********************************/ + /************************************* helper functions ***********************************/ private boolean isVNFType(NodeTemplate nt) { return nt.getType().endsWith("VnfConfiguration"); } @@ -1014,12 +1030,12 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { private Map filterProperties(Object property, String path, FilterType filterType, String pattern, Map filterMap) { if (property instanceof Map) { - for (Map.Entry item: ((Map) property).entrySet()) { + for (Map.Entry item : ((Map) property).entrySet()) { String itemPath = path + PATH_DELIMITER + item.getKey(); filterProperties(item.getValue(), itemPath, filterType, pattern, filterMap); } } else if (property instanceof List) { - for (Object item: (List)property) { + for (Object item : (List) property) { filterProperties(item, path, filterType, pattern, filterMap); } } else { @@ -1030,7 +1046,7 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { return filterMap; } - + /************************************* helper functions ***********************************/ private List getNodeTemplateBySdcType(TopologyTemplate topologyTemplate, SdcTypes sdcType) { if (sdcType == null) { @@ -1045,8 +1061,11 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { List nodeTemplates = topologyTemplate.getNodeTemplates(); - if (nodeTemplates != null && !nodeTemplates.isEmpty()) - return nodeTemplates.stream().filter(x -> (x.getMetaData() != null && sdcType.getValue().equals(x.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)))).collect(toList()); + if (nodeTemplates != null && !nodeTemplates.isEmpty()) { + return nodeTemplates.stream() + .filter(x -> (x.getMetadata() != null && sdcType.getValue().equals(x.getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)))) + .collect(toList()); + } log.debug("getNodeTemplateBySdcType - topologyTemplate's nodeTemplates not exist"); return new ArrayList<>(); @@ -1054,104 +1073,99 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { //Assumed to be unique property for the list private NodeTemplate getNodeTemplateByCustomizationUuid(List nodeTemplates, String customizationId) { - if (customizationId != null) { - Optional findFirst = nodeTemplates.stream().filter(x -> (x.getMetaData() != null && customizationId.equals(x.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)))).findFirst(); + if (customizationId != null) { + Optional findFirst = nodeTemplates.stream().filter( + x -> (x.getMetadata() != null && customizationId.equals(x.getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)))) + .findFirst(); return findFirst.isPresent() ? findFirst.get() : null; - } - else { + } else { log.error("getNodeTemplateByCustomizationUuid - customizationId is null"); return null; } } - @Override - public Map> getInterfacesOf(NodeTemplate nt){ - if (nt == null) { - return null; + @Override + public Map> getInterfacesOf(NodeTemplate nt) { + if (nt == null) { + return null; + } + return nt.getAllInterfaceDetailsForNodeType(); } - return nt.getAllInterfaceDetailsForNodeType(); - } - @Override - public List getInterfaces(NodeTemplate nt){ - Map> interfaceDetails = nt.getAllInterfaceDetailsForNodeType(); - return new ArrayList<>(interfaceDetails.keySet()); - } + @Override + public List getInterfaces(NodeTemplate nt) { + Map> interfaceDetails = nt.getAllInterfaceDetailsForNodeType(); + return new ArrayList<>(interfaceDetails.keySet()); + } - @Override - public List getInterfaceDetails(NodeTemplate nt, String interfaceName){ - Map> interfaceDetails = nt.getAllInterfaceDetailsForNodeType(); - return interfaceDetails.get(interfaceName); - } + @Override + public List getInterfaceDetails(NodeTemplate nt, String interfaceName) { + Map> interfaceDetails = nt.getAllInterfaceDetailsForNodeType(); + return interfaceDetails.get(interfaceName); + } - @Override - public List getAllInterfaceOperations(NodeTemplate nt, String interfaceName){ - Map> interfaceDetails = nt.getAllInterfaceDetailsForNodeType(); - return interfaceDetails.values().stream().flatMap(List::stream).map(val -> val.getOperationName()).collect( - Collectors.toList()); - } + @Override + public List getAllInterfaceOperations(NodeTemplate nt, String interfaceName) { + Map> interfaceDetails = nt.getAllInterfaceDetailsForNodeType(); + return interfaceDetails.values().stream().flatMap(List::stream).map(val -> val.getOperationName()).collect( + Collectors.toList()); + } - @Override - public InterfacesDef getInterfaceOperationDetails(NodeTemplate nt, String interfaceName, String operationName){ - Map> interfaceDetails = nt.getAllInterfaceDetailsForNodeType(); - if(!interfaceDetails.isEmpty()){ - List interfaceDefs = interfaceDetails.get(interfaceName); - return interfaceDefs.stream().filter(val -> val.getOperationName().equals(operationName)).findFirst().orElse(null); + @Override + public InterfacesDef getInterfaceOperationDetails(NodeTemplate nt, String interfaceName, String operationName) { + Map> interfaceDetails = nt.getAllInterfaceDetailsForNodeType(); + if (!interfaceDetails.isEmpty()) { + List interfaceDefs = interfaceDetails.get(interfaceName); + return interfaceDefs.stream().filter(val -> val.getOperationName().equals(operationName)).findFirst().orElse(null); + } + return null; } - return null; - } @Override public List getPropertyLeafValueByPropertyNamePathAndNodeTemplatePath(String propertyNamePath, String nodeTemplatePath) { log.info("A new request is received: property path is [{}], node template path is [{}]", - propertyNamePath, nodeTemplatePath); + propertyNamePath, nodeTemplatePath); List propertyValuesList; if (StringUtils.isEmpty(nodeTemplatePath) || StringUtils.isEmpty(propertyNamePath)) { log.error("One of parameters is empty or null: property path is [{}], node template path is [{}]", - propertyNamePath, nodeTemplatePath); + propertyNamePath, nodeTemplatePath); propertyValuesList = Collections.emptyList(); - } - else { + } else { String[] nodeTemplates = getSplittedPath(nodeTemplatePath); propertyValuesList = getPropertyFromInternalNodeTemplate(getNodeTemplateByName(nodeTemplates[0]), 1, nodeTemplates, propertyNamePath); log.info("Found property value {} by path [{}] for node template [{}]", - propertyValuesList, propertyNamePath, nodeTemplatePath); + propertyValuesList, propertyNamePath, nodeTemplatePath); } return propertyValuesList; } private List getPropertyFromInternalNodeTemplate(NodeTemplate parent, int index, - String[] nodeTemplatePath, String propertyPath) { + String[] nodeTemplatePath, String propertyPath) { List propertyValuesList; if (parent == null) { log.error("Node template {} is not found, the request will be rejected", nodeTemplatePath[index]); propertyValuesList = Collections.emptyList(); - } - else if (nodeTemplatePath.length <= index) { + } else if (nodeTemplatePath.length <= index) { log.debug("Stop NODE TEMPLATE searching"); propertyValuesList = getSimpleOrListPropertyValue(parent, propertyPath); - } - else { + } else { log.debug("Node template {} is found with name {}", nodeTemplatePath[index], parent.getName()); NodeTemplate childNT = getChildNodeTemplateByName(parent, nodeTemplatePath[index]); if (childNT == null || !isNodeTypeSupported(childNT)) { log.error("Unsupported or not found node template named {}, the request will be rejected", - nodeTemplatePath[index]); + nodeTemplatePath[index]); propertyValuesList = Collections.emptyList(); - } - else { + } else { propertyValuesList = getPropertyFromInternalNodeTemplate(childNT, index + 1, nodeTemplatePath, - propertyPath); + propertyPath); } } return propertyValuesList; } - - private List getSimpleOrListPropertyValue(NodeTemplate nodeTemplate, String propertyPath) { List propertyValueList; String[] path = getSplittedPath(propertyPath); @@ -1161,51 +1175,48 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { //the requested property type is either simple or list of simple types PropertySchemaType propertyType = PropertySchemaType.getEnumByValue(property.getType()); if (propertyType == PropertySchemaType.LIST && - PropertyUtils.isDataPropertyType((String)property.getEntrySchema() - .get(SdcPropertyNames.PROPERTY_NAME_TYPE))) { + PropertyUtils.isDataPropertyType((String) property.getEntrySchema() + .get(SdcPropertyNames.PROPERTY_NAME_TYPE))) { //cover the case when a type of property "path[0]' is list of data types // and the requested property is an internal simple property of this data type propertyValueList = calculatePropertyValue(getNodeTemplatePropertyValueAsObject(nodeTemplate, path[0]), path, nodeTemplate.getName()); - } - else { + } else { //the requested property is simple type or list of simple types - propertyValueList = calculatePropertyValue(getNodeTemplatePropertyValueAsObject(nodeTemplate, propertyPath), null, nodeTemplate.getName()); + propertyValueList = calculatePropertyValue(getNodeTemplatePropertyValueAsObject(nodeTemplate, propertyPath), null, + nodeTemplate.getName()); } - } - else { + } else { log.error("The type of property {} on node {} is neither simple nor list of simple objects, the request will be rejected", - propertyPath, nodeTemplate.getName()); + propertyPath, nodeTemplate.getName()); propertyValueList = Collections.emptyList(); } return propertyValueList; } - private List calculatePropertyValue(Object valueAsObject, String path[], String nodeName) { + private List calculatePropertyValue(Object valueAsObject, String[] path, String nodeName) { if (valueAsObject == null || valueAsObject instanceof Map) { - log.error("The property {} either is not found on node template [{}], or it is data type, or it is not resolved get_input", path, nodeName); + log.error("The property {} either is not found on node template [{}], or it is data type, or it is not resolved get_input", path, + nodeName); return Collections.emptyList(); } if (path != null) { - return PropertyUtils.findSimplePropertyValueInListOfDataTypes((List)valueAsObject, path); + return PropertyUtils.findSimplePropertyValueInListOfDataTypes((List) valueAsObject, path); } return PropertyUtils.buildSimplePropertValueOrList(valueAsObject); } - - - private Property getNodeTemplatePropertyObjectByName(NodeTemplate nodeTemplate, String propertyName) { return nodeTemplate.getPropertiesObjects() - .stream() - .filter(p->p.getName().equals(propertyName)) - .findFirst() - .orElse(null); + .stream() + .filter(p -> p.getName().equals(propertyName)) + .findFirst() + .orElse(null); } private NodeTemplate getChildNodeTemplateByName(NodeTemplate parent, String nodeTemplateName) { return getNodeTemplateChildren(parent) .stream() - .filter(nt->nt.getName().equals(nodeTemplateName)) + .filter(nt -> nt.getName().equals(nodeTemplateName)) .findFirst().orElse(null); } @@ -1219,7 +1230,7 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { if (log.isDebugEnabled()) { log.debug("getEntity request: EntityQuery <{}>, TopologyTemplateQuery <{}>, isRecursive<{}>", - entityQuery, topologyTemplateQuery, isRecursive); + entityQuery, topologyTemplateQuery, isRecursive); } return new QueryProcessor(toscaTemplate, entityQuery, topologyTemplateQuery, isRecursive).doQuery(); } @@ -1230,12 +1241,12 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { } @Override - public List getVFModule(String cuuid){ + public List getVFModule(String cuuid) { String normalisedComponentInstanceName = SdcToscaUtility.normaliseComponentInstanceName(getVfiNameByCuuid(cuuid)); List vfModulesFromVf = getVfModulesFromVf(cuuid); List vfModulesFromService = getVfModulesFromService().stream() - .filter(v->v.getName().startsWith(normalisedComponentInstanceName)) - .collect(toList()); + .filter(v -> v.getName().startsWith(normalisedComponentInstanceName)) + .collect(toList()); addMembersToVfModuleInstances(vfModulesFromVf, vfModulesFromService); return vfModulesFromService; } @@ -1246,29 +1257,29 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { List vfModuleInstances = new ArrayList<>(); getVfModulesFromVf().forEach(vfmodule -> { - if (Objects.isNull(vfmodule.getParent())){ + if (Objects.isNull(vfmodule.getParent())) { vfModuleInstances.add(vfmodule); } else { vfModules.add(vfmodule); } }); - addMembersToVfModuleInstances(vfModules,vfModuleInstances); + addMembersToVfModuleInstances(vfModules, vfModuleInstances); return vfModuleInstances; } private void addMembersToVfModuleInstances(List vfModules, List vfModuleInstances) { - for(IEntityDetails vfModuleInstance : vfModuleInstances){ + for (IEntityDetails vfModuleInstance : vfModuleInstances) { String origGroupName = getOriginalGroupName(vfModuleInstance); setVFModuleMembers(vfModules, vfModuleInstance, origGroupName); } } private void setVFModuleMembers(List vfModules, IEntityDetails vfModuleInstance, String origGroupName) { - for (IEntityDetails vfModule : vfModules){ - if (vfModuleInstance instanceof GroupEntityDetails && vfModule.getName().equals(origGroupName)){ + for (IEntityDetails vfModule : vfModules) { + if (vfModuleInstance instanceof GroupEntityDetails && vfModule.getName().equals(origGroupName)) { List memberNodes = vfModule.getMemberNodes(); - ((GroupEntityDetails)vfModuleInstance).setMemberNodes(memberNodes); + ((GroupEntityDetails) vfModuleInstance).setMemberNodes(memberNodes); } } } @@ -1280,36 +1291,36 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { private List getVfModulesFromService() { EntityQuery entityQuery = EntityQuery.newBuilder(GROUPS_VF_MODULE) - .build(); + .build(); TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE) - .build(); + .build(); return getEntity(entityQuery, topologyTemplateQuery, false); } private List getVfModulesFromVf(String cuuid) { EntityQuery entityQuery = EntityQuery.newBuilder(GROUPS_VF_MODULE) - .build(); + .build(); TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.VF) - .customizationUUID(cuuid) - .build(); + .customizationUUID(cuuid) + .build(); return getEntity(entityQuery, topologyTemplateQuery, false); } private List getVfModulesFromVf() { EntityQuery entityQuery = EntityQuery.newBuilder(GROUPS_VF_MODULE) - .build(); + .build(); TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE) - .build(); + .build(); return getEntity(entityQuery, topologyTemplateQuery, true); } private String getVfiNameByCuuid(String cuuid) { EntityQuery entityQuery = EntityQuery.newBuilder(SdcTypes.VF) - .customizationUUID(cuuid) - .build(); + .customizationUUID(cuuid) + .build(); TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE) - .build(); + .build(); return getEntity(entityQuery, topologyTemplateQuery, true).get(0).getName(); } - } +} diff --git a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/impl/SdcToscaParserFactory.java b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/impl/SdcToscaParserFactory.java index e24a231..b77b84c 100644 --- a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/impl/SdcToscaParserFactory.java +++ b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/impl/SdcToscaParserFactory.java @@ -7,9 +7,9 @@ * 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. @@ -22,36 +22,39 @@ package org.onap.sdc.tosca.parser.impl; import java.util.ArrayList; import java.util.List; - import org.onap.sdc.tosca.parser.api.ConformanceLevel; +import org.onap.sdc.tosca.parser.api.ISdcCsarHelper; import org.onap.sdc.tosca.parser.config.ConfigurationManager; import org.onap.sdc.tosca.parser.config.ErrorInfo; import org.onap.sdc.tosca.parser.config.JToscaValidationIssueInfo; import org.onap.sdc.tosca.parser.config.SdcToscaParserErrors; import org.onap.sdc.tosca.parser.enums.JToscaValidationIssueType; -import org.onap.sdc.tosca.parser.utils.GeneralUtility; -import org.onap.sdc.tosca.parser.api.ISdcCsarHelper; import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException; +import org.onap.sdc.tosca.parser.utils.GeneralUtility; import org.onap.sdc.toscaparser.api.ToscaTemplate; -import org.onap.sdc.toscaparser.api.common.JToscaValidationIssue; import org.onap.sdc.toscaparser.api.common.JToscaException; +import org.onap.sdc.toscaparser.api.common.JToscaValidationIssue; import org.onap.sdc.toscaparser.api.utils.JToscaErrorCodes; import org.onap.sdc.toscaparser.api.utils.ThreadLocalsHolder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SdcToscaParserFactory { - private static Logger log = LoggerFactory.getLogger(SdcToscaParserFactory.class.getName()); + + private static Logger log = LoggerFactory.getLogger(SdcToscaParserFactory.class.getName()); private static ConfigurationManager configurationManager; private static volatile SdcToscaParserFactory instance; private List criticalExceptions = new ArrayList<>(); private List warningExceptions = new ArrayList<>(); private List notAnalyzadExceptions = new ArrayList<>(); - private SdcToscaParserFactory() {} + + private SdcToscaParserFactory() { + } /** * Get an SdcToscaParserFactory instance. + * * @return SdcToscaParserFactory instance. */ public static SdcToscaParserFactory getInstance() { @@ -84,7 +87,7 @@ public class SdcToscaParserFactory { /** * Get an ISdcCsarHelper object for this CSAR file. * - * @param csarPath - the absolute path to CSAR file. + * @param csarPath - the absolute path to CSAR file. * @param resolveGetInput - resolve get_input properties * @return ISdcCsarHelper object. * @throws SdcToscaParserException - in case the path or CSAR are invalid. @@ -106,25 +109,25 @@ public class SdcToscaParserFactory { validateCsarVersion(cSarConformanceLevel); try { handleErrorsByTypes(csarPath, cSarConformanceLevel); - } catch (JToscaException e) { + } catch (JToscaException e) { throwSdcToscaParserException(e); - } + } return sdcCsarHelperImpl; } } private void handleErrorsByTypes(String csarPath, String cSarConformanceLevel) throws JToscaException { clearValidationIssuesLists(); - for(JToscaValidationIssue toscaValidationIssue : ThreadLocalsHolder.getCollector().getValidationIssues().values()){ - List issueInfos = configurationManager.getJtoscaValidationIssueConfiguration().getValidationIssues().get(toscaValidationIssue.getCode()); - if(issueInfos != null && !issueInfos.isEmpty()){ - JToscaValidationIssueInfo issueInfo = null; - issueInfo = issueInfos.stream() - .filter(i-> isMatchConformanceLevel(cSarConformanceLevel,i.getSinceCsarConformanceLevel())) - .max((i1,i2) -> GeneralUtility.conformanceLevelCompare(i1.getSinceCsarConformanceLevel(), i2.getSinceCsarConformanceLevel()) ) + for (JToscaValidationIssue toscaValidationIssue : ThreadLocalsHolder.getCollector().getValidationIssues().values()) { + List issueInfos = configurationManager.getJtoscaValidationIssueConfiguration().getValidationIssues() + .get(toscaValidationIssue.getCode()); + if (issueInfos != null && !issueInfos.isEmpty()) { + final JToscaValidationIssueInfo issueInfo = issueInfos.stream() + .filter(i -> isMatchConformanceLevel(cSarConformanceLevel, i.getSinceCsarConformanceLevel())) + .max((i1, i2) -> GeneralUtility.conformanceLevelCompare(i1.getSinceCsarConformanceLevel(), i2.getSinceCsarConformanceLevel())) .orElse(null); - if(issueInfo != null){ + if (issueInfo != null) { switch (JToscaValidationIssueType.valueOf(issueInfo.getIssueType())) { case CRITICAL: criticalExceptions.add(toscaValidationIssue); @@ -135,59 +138,61 @@ public class SdcToscaParserFactory { default: break; } - }else{ + } else { notAnalyzadExceptions.add(toscaValidationIssue); } - }else{//notAnalyzed + } else {//notAnalyzed notAnalyzadExceptions.add(toscaValidationIssue); } - } - logErrors(csarPath); + } + logErrors(csarPath); } - private void clearValidationIssuesLists(){ + private void clearValidationIssuesLists() { notAnalyzadExceptions.clear(); criticalExceptions.clear(); warningExceptions.clear(); } - private void logErrors(String inputPath) throws JToscaException{ - //Warnings - int warningsCount = warningExceptions.size(); - if (warningsCount > 0) { - log.warn("####################################################################################################"); - log.warn("CSAR Warnings found! CSAR name - {}", inputPath); - log.warn("ToscaTemplate - verifyTemplate - {} Parsing Warning{} occurred...", warningsCount, (warningsCount > 1 ? "s" : "")); - for (JToscaValidationIssue info : warningExceptions) { - log.warn("JTosca Exception [{}]: {}. CSAR name - {}", info.getCode(),info.getMessage(), inputPath); - } - log.warn("####################################################################################################"); - } - //Criticals - int criticalsCount = criticalExceptions.size(); - if (criticalsCount > 0) { - log.error("####################################################################################################"); - log.error("ToscaTemplate - verifyTemplate - {} Parsing Critical{} occurred...", criticalsCount, (criticalsCount > 1 ? "s" : "")); - for (JToscaValidationIssue info : criticalExceptions) { - log.error("JTosca Exception [{}]: {}. CSAR name - {}", info.getCode(),info.getMessage(), inputPath); - } - throw new JToscaException(String.format("CSAR Validation Failed. CSAR name - {}. Please check logs for details.", inputPath), JToscaErrorCodes.CSAR_TOSCA_VALIDATION_ERROR.getValue()); - } + private void logErrors(String inputPath) throws JToscaException { + //Warnings + int warningsCount = warningExceptions.size(); + if (warningsCount > 0) { + log.warn("####################################################################################################"); + log.warn("CSAR Warnings found! CSAR name - {}", inputPath); + log.warn("ToscaTemplate - verifyTemplate - {} Parsing Warning{} occurred...", warningsCount, (warningsCount > 1 ? "s" : "")); + for (JToscaValidationIssue info : warningExceptions) { + log.warn("JTosca Exception [{}]: {}. CSAR name - {}", info.getCode(), info.getMessage(), inputPath); + } + log.warn("####################################################################################################"); + } + //Criticals + int criticalsCount = criticalExceptions.size(); + if (criticalsCount > 0) { + log.error("####################################################################################################"); + log.error("ToscaTemplate - verifyTemplate - {} Parsing Critical{} occurred...", criticalsCount, (criticalsCount > 1 ? "s" : "")); + for (JToscaValidationIssue info : criticalExceptions) { + log.error("JTosca Exception [{}]: {}. CSAR name - {}", info.getCode(), info.getMessage(), inputPath); + } + throw new JToscaException(String.format("CSAR Validation Failed. CSAR name - {}. Please check logs for details.", inputPath), + JToscaErrorCodes.CSAR_TOSCA_VALIDATION_ERROR.getValue()); + } } + public List getCriticalExceptions() { - return criticalExceptions; - } + return criticalExceptions; + } - public List getWarningExceptions() { - return warningExceptions; - } + public List getWarningExceptions() { + return warningExceptions; + } - public List getNotAnalyzadExceptions() { - return notAnalyzadExceptions; - } + public List getNotAnalyzadExceptions() { + return notAnalyzadExceptions; + } - private void validateCsarVersion(String cSarVersion) throws SdcToscaParserException { + private void validateCsarVersion(String cSarVersion) throws SdcToscaParserException { ConformanceLevel level = configurationManager.getConfiguration().getConformanceLevel(); String minVersion = level.getMinVersion(); if (cSarVersion != null) { @@ -199,7 +204,7 @@ public class SdcToscaParserFactory { } } - private boolean isMatchConformanceLevel(String ValidationIssueVersion, String cSarVersion){ + private boolean isMatchConformanceLevel(String ValidationIssueVersion, String cSarVersion) { if (ValidationIssueVersion != null && cSarVersion != null) { if ((GeneralUtility.conformanceLevelCompare(ValidationIssueVersion, cSarVersion) >= 0)) { return true; @@ -207,16 +212,17 @@ public class SdcToscaParserFactory { } return false; } + private void throwConformanceLevelException(String minVersion) throws SdcToscaParserException { ErrorInfo errorInfo = configurationManager.getErrorConfiguration().getErrorInfo(SdcToscaParserErrors.CONFORMANCE_LEVEL_ERROR.toString()); throw new SdcToscaParserException(String.format(errorInfo.getMessage(), minVersion), errorInfo.getCode()); } private void throwSdcToscaParserException(JToscaException e) throws SdcToscaParserException { - ErrorInfo errorInfo = configurationManager.getErrorConfiguration().getErrorInfo(SdcToscaParserErrors.getSdcErrorByJToscaError(JToscaErrorCodes.getByCode(e.getCode())).toString()); + ErrorInfo errorInfo = configurationManager.getErrorConfiguration() + .getErrorInfo(SdcToscaParserErrors.getSdcErrorByJToscaError(JToscaErrorCodes.getByCode(e.getCode())).toString()); throw new SdcToscaParserException(errorInfo.getMessage(), errorInfo.getCode()); } - } diff --git a/sdc-tosca/src/test/java/org/onap/sdc/impl/SdcToscaParserBasicTest.java b/sdc-tosca/src/test/java/org/onap/sdc/impl/SdcToscaParserBasicTest.java index 5b3a4d9..d348bad 100644 --- a/sdc-tosca/src/test/java/org/onap/sdc/impl/SdcToscaParserBasicTest.java +++ b/sdc-tosca/src/test/java/org/onap/sdc/impl/SdcToscaParserBasicTest.java @@ -29,7 +29,6 @@ import org.onap.sdc.tosca.parser.api.ISdcCsarHelper; import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException; import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory; - public class SdcToscaParserBasicTest extends BaseSetupExtension { public static final String VF_CUSTOMIZATION_UUID = "56179cd8-de4a-4c38-919b-bbc4452d2d73"; @@ -60,7 +59,7 @@ public class SdcToscaParserBasicTest extends BaseSetupExtension { static ISdcCsarHelper csarHelperServiceAnnotations; static ISdcCsarHelper csarHelperServiceAdiodAnnotations; static ISdcCsarHelper csarHelperServiceNetworkCloud; - static Map>> fdntCsarHelper_Data; + static Map>> fdntCsarHelper_Data; @Override void setup() throws SdcToscaParserException { @@ -94,9 +93,7 @@ public class SdcToscaParserBasicTest extends BaseSetupExtension { fdntCsarHelper_Data = new HashMap<>() { { - HashMap> FDNT; - - FDNT = new HashMap<>(); + final Map> FDNT = new HashMap<>(); FDNT.put("VF Name", Arrays.asList("FDNT 1")); FDNT.put("capabilities", Arrays.asList( "dnt_fw_rhrg.binding_DNT_FW_INT_DNS_TRUSTED_RVMI", @@ -155,19 +152,13 @@ public class SdcToscaParserBasicTest extends BaseSetupExtension { } protected ISdcCsarHelper getCsarHelper(String path) throws SdcToscaParserException { - System.out.println("Parsing CSAR " + path + "..."); - String fileStr1 = SdcToscaParserBasicTest.class.getClassLoader().getResource(path).getFile(); - File file1 = new File(fileStr1); - ISdcCsarHelper sdcCsarHelper = factory.getSdcCsarHelper(file1.getAbsolutePath()); - return sdcCsarHelper; + return getCsarHelper(path, true); } protected ISdcCsarHelper getCsarHelper(String path, boolean resolveGetInput) throws SdcToscaParserException { System.out.println("Parsing CSAR " + path + "..."); - String fileStr1 = SdcToscaParserBasicTest.class.getClassLoader().getResource(path).getFile(); - File file1 = new File(fileStr1); - ISdcCsarHelper sdcCsarHelper = factory.getSdcCsarHelper(file1.getAbsolutePath(), resolveGetInput); - return sdcCsarHelper; + return factory.getSdcCsarHelper(new File(SdcToscaParserBasicTest.class.getClassLoader().getResource(path).getFile()).getAbsolutePath(), + resolveGetInput); } @Override diff --git a/sdc-tosca/src/test/java/org/onap/sdc/impl/ToscaParserArtifactsTest.java b/sdc-tosca/src/test/java/org/onap/sdc/impl/ToscaParserArtifactsTest.java new file mode 100644 index 0000000..c8d5367 --- /dev/null +++ b/sdc-tosca/src/test/java/org/onap/sdc/impl/ToscaParserArtifactsTest.java @@ -0,0 +1,80 @@ +/* + * - + * ============LICENSE_START======================================================= + * Copyright (C) 2022 Nordix Foundation. + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.sdc.impl; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.net.URL; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.onap.sdc.tosca.parser.api.ISdcCsarHelper; +import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory; +import org.onap.sdc.toscaparser.api.NodeTemplate; +import org.onap.sdc.toscaparser.api.elements.ArtifactDef; + +class ToscaParserArtifactsTest { + + private static final String TEST_ARTIFACTS_FILENAME = "csars/resource-VspWithArtifacts.csar"; + private static final String TEST_ARTIFACT_TYPE = "tosca.artifacts.asd.deploymentItem"; + private static final List ARTIFACTS_NAME_LIST = Arrays.asList("sampleapp-db", "sampleapp-services"); + private static ISdcCsarHelper helper = null; + + @BeforeAll + public static void setup() throws Exception { + final URL resource = ToscaParserArtifactsTest.class.getClassLoader().getResource(TEST_ARTIFACTS_FILENAME); + if (resource != null) { + helper = SdcToscaParserFactory.getInstance().getSdcCsarHelper(resource.getFile()); + } + assertNotNull(helper); + } + + @Test + void testGetArtifacts() { + final NodeTemplate nodeTemplate = helper.getServiceNodeTemplates().get(0); + assertNotNull(nodeTemplate); + final Map artifacts = nodeTemplate.getArtifacts(); + assertNotNull(artifacts); + assertEquals(2, artifacts.size()); + artifacts.entrySet().forEach(entry -> { + assertTrue(ARTIFACTS_NAME_LIST.contains(entry.getKey())); + final ArtifactDef artifactDef = entry.getValue(); + assertNotNull(artifactDef); + final String artifactTypeDefType = artifactDef.getType(); + assertNotNull(artifactTypeDefType); + assertEquals(TEST_ARTIFACT_TYPE, artifactTypeDefType); + final Map properties = artifactDef.getProperties(); + assertNotNull(properties); + assertFalse(properties.isEmpty()); + final String file = artifactDef.getFile(); + assertNotNull(file); + assertTrue(file.startsWith("../Artifacts/Deployment/HELM/sampleapp-")); + }); + + } + +} diff --git a/sdc-tosca/src/test/java/org/onap/sdc/impl/ToscaParserNodeTemplateTest.java b/sdc-tosca/src/test/java/org/onap/sdc/impl/ToscaParserNodeTemplateTest.java index 408693b..d0b8579 100644 --- a/sdc-tosca/src/test/java/org/onap/sdc/impl/ToscaParserNodeTemplateTest.java +++ b/sdc-tosca/src/test/java/org/onap/sdc/impl/ToscaParserNodeTemplateTest.java @@ -563,7 +563,7 @@ import org.onap.sdc.toscaparser.api.parameters.Input; public void testGetVnfConfig() { NodeTemplate vnfConfig = nfodCsarHlper.getVnfConfig("9bb2ef82-f8f6-4391-bc71-db063f15bf57"); assertNotNull(vnfConfig); - assertEquals("vnfConfiguration", vnfConfig.getMetaData().getValue("name")); + assertEquals("vnfConfiguration", vnfConfig.getMetadata().getValue("name")); } @Test @@ -657,9 +657,9 @@ import org.onap.sdc.toscaparser.api.parameters.Input; children.sort(Comparator.comparing(NodeTemplate::getName)); assertEquals("DNT_FW_RSG_SI_1", children.get(1).getName()); - assertEquals("VFC", children.get(1).getMetaData().getValue("type")); + assertEquals("VFC", children.get(1).getMetadata().getValue("type")); assertEquals("DNT_PORT", children.get(2).getName()); - assertEquals("CP", children.get(2).getMetaData().getValue("type")); + assertEquals("CP", children.get(2).getMetadata().getValue("type")); } @Test @@ -671,7 +671,7 @@ import org.onap.sdc.toscaparser.api.parameters.Input; vfChildren.sort(Comparator.comparing(NodeTemplate::getName)); assertEquals("VFC1 DUMMY", vfChildren.get(0).getName()); assertEquals("VF_VNF", vfChildren.get(1).getName()); - assertEquals("CVFC", vfChildren.get(1).getMetaData().getValue("type")); + assertEquals("CVFC", vfChildren.get(1).getMetadata().getValue("type")); List vfcChildren = nestedVfcCsarHlper.getNodeTemplateChildren(vfChildren.get(1)); @@ -697,7 +697,7 @@ import org.onap.sdc.toscaparser.api.parameters.Input; public void testGetVnfConfigGetProperties() { NodeTemplate vnfConfig = nfodCsarHlper.getVnfConfig("9bb2ef82-f8f6-4391-bc71-db063f15bf57"); assertNotNull(vnfConfig); - assertEquals("vnfConfiguration", vnfConfig.getMetaData().getValue("name")); + assertEquals("vnfConfiguration", vnfConfig.getMetadata().getValue("name")); String manufacturer_reference_number = nfodCsarHlper.getNodeTemplatePropertyLeafValue(vnfConfig, "allowed_flavors#ATT_part_12345_for_FortiGate-VM00#vendor_info#manufacturer_reference_number"); String num_cpus = nfodCsarHlper.getNodeTemplatePropertyLeafValue(vnfConfig, "allowed_flavors#ATT_part_67890_for_FortiGate-VM01#compute_flavor#num_cpus"); @@ -728,7 +728,7 @@ import org.onap.sdc.toscaparser.api.parameters.Input; public void testNewGetVnfConfigGetProperties() { NodeTemplate vnfConfig = nfodNEWCsarHlper.getVnfConfig("a6587663-b27f-4e88-8a86-604604302ce6"); assertNotNull(vnfConfig); - assertEquals("vnfConfiguration", vnfConfig.getMetaData().getValue("name")); + assertEquals("vnfConfiguration", vnfConfig.getMetadata().getValue("name")); //Deployment flavor 1 String manufacturer_reference_number = nfodNEWCsarHlper.getNodeTemplatePropertyLeafValue(vnfConfig, "allowed_flavors#123456#vendor_info#manufacturer_reference_number"); @@ -770,7 +770,7 @@ import org.onap.sdc.toscaparser.api.parameters.Input; NodeTemplate nodeTemplate = fdntCsarHelper.getServiceNodeTemplateByNodeName("FDNT 1"); assertNotNull(nodeTemplate); assertEquals(nodeTemplate.getName(), "FDNT 1"); - assertEquals(nodeTemplate.getMetaData().getValue("type"), "VF"); + assertEquals(nodeTemplate.getMetadata().getValue("type"), "VF"); } @Test @@ -942,7 +942,7 @@ import org.onap.sdc.toscaparser.api.parameters.Input; NodeTemplate nodeTemplate = QAServiceForToscaParserTests.getServiceNodeTemplateByNodeName("VF_1_V_port_1 0"); assertNotNull(nodeTemplate); assertEquals(nodeTemplate.getName(), "VF_1_V_port_1 0"); - assertEquals(nodeTemplate.getMetaData().getValue("type"), "VF"); + assertEquals(nodeTemplate.getMetadata().getValue("type"), "VF"); } @Test @@ -950,7 +950,7 @@ import org.onap.sdc.toscaparser.api.parameters.Input; NodeTemplate nodeTemplate = QAServiceForToscaParserTests.getServiceNodeTemplateByNodeName("ExtVL 0"); assertNotNull(nodeTemplate); assertEquals(nodeTemplate.getName(), "ExtVL 0"); - assertEquals(nodeTemplate.getMetaData().getValue("type"), "VL"); + assertEquals(nodeTemplate.getMetadata().getValue("type"), "VL"); } @Test @@ -958,7 +958,7 @@ import org.onap.sdc.toscaparser.api.parameters.Input; NodeTemplate nodeTemplate = QAServiceForToscaParserTests.getServiceNodeTemplateByNodeName("ExtCP 0"); assertNotNull(nodeTemplate); assertEquals(nodeTemplate.getName(), "ExtCP 0"); - assertEquals(nodeTemplate.getMetaData().getValue("type"), "CP"); + assertEquals(nodeTemplate.getMetadata().getValue("type"), "CP"); } @Test @@ -966,7 +966,7 @@ import org.onap.sdc.toscaparser.api.parameters.Input; NodeTemplate nodeTemplate = QAServiceForToscaParserTests.getServiceNodeTemplateByNodeName("PNF TEST 0"); assertNotNull(nodeTemplate); assertEquals(nodeTemplate.getName(), "PNF TEST 0"); - assertEquals(nodeTemplate.getMetaData().getValue("type"), "PNF"); + assertEquals(nodeTemplate.getMetadata().getValue("type"), "PNF"); } //QA region getServiceNodeTemplateBySdcType tests @@ -975,7 +975,7 @@ import org.onap.sdc.toscaparser.api.parameters.Input; public void getServiceNodeTemplateBySdcType_VF() { List vfList = QAServiceForToscaParserTests.getServiceNodeTemplatesByType("org.openecomp.resource.vf.Vf1VPort1"); assertEquals(2, vfList.size()); - assertEquals("VF_1_V_port_1", vfList.get(0).getMetaData().getValue("name")); + assertEquals("VF_1_V_port_1", vfList.get(0).getMetadata().getValue("name")); } // endregion Added by QA - Continue with testings of resolve get_input @@ -1006,7 +1006,7 @@ import org.onap.sdc.toscaparser.api.parameters.Input; NodeTemplate nodeTemplate = csarHelperServiceWithCrs.getServiceNodeTemplateByNodeName("chaya best cr 0"); List crCpChildren = csarHelperServiceWithCrs.getNodeTemplateBySdcType(nodeTemplate, SdcTypes.CP); assertEquals(crCpChildren.get(0).getName(), "ContrailPort 0"); - assertEquals(crCpChildren.get(0).getMetaData().getValue("type"), SdcTypes.CP.name()); + assertEquals(crCpChildren.get(0).getMetadata().getValue("type"), SdcTypes.CP.name()); } @Test diff --git a/sdc-tosca/src/test/java/org/onap/sdc/tosca/parser/elements/queries/TopologyTemplateQueryTest.java b/sdc-tosca/src/test/java/org/onap/sdc/tosca/parser/elements/queries/TopologyTemplateQueryTest.java index 018675a..9656fb5 100644 --- a/sdc-tosca/src/test/java/org/onap/sdc/tosca/parser/elements/queries/TopologyTemplateQueryTest.java +++ b/sdc-tosca/src/test/java/org/onap/sdc/tosca/parser/elements/queries/TopologyTemplateQueryTest.java @@ -54,7 +54,7 @@ public class TopologyTemplateQueryTest { public void templateIsFoundByTypeOnly() { TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE) .build(); - when(nodeTemplate.getMetaData()).thenReturn(metadata); + when(nodeTemplate.getMetadata()).thenReturn(metadata); when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.SERVICE.getValue()); assertTrue(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate)); } @@ -63,7 +63,7 @@ public class TopologyTemplateQueryTest { public void templateIsNotFoundWhenMetadataIsNull() { TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.VF) .build(); - when(nodeTemplate.getMetaData()).thenReturn(null); + when(nodeTemplate.getMetadata()).thenReturn(null); assertFalse(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate)); } @@ -71,7 +71,7 @@ public class TopologyTemplateQueryTest { public void templateIsFoundIfItIsService() { TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE) .build(); - when(nodeTemplate.getMetaData()).thenReturn(metadata); + when(nodeTemplate.getMetadata()).thenReturn(metadata); when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.SERVICE.getValue()); assertTrue(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate)); } @@ -81,7 +81,7 @@ public class TopologyTemplateQueryTest { TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC) .customizationUUID("345") .build(); - when(nodeTemplate.getMetaData()).thenReturn(metadata); + when(nodeTemplate.getMetadata()).thenReturn(metadata); when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.CVFC.getValue()); when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)).thenReturn("345"); assertTrue(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate)); @@ -91,7 +91,7 @@ public class TopologyTemplateQueryTest { public void templateIsNotFoundWhenTypeIsNotMatchedAndCuuidIsNotSet() { TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC) .build(); - when(nodeTemplate.getMetaData()).thenReturn(metadata); + when(nodeTemplate.getMetadata()).thenReturn(metadata); when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.VF.getValue()); assertFalse(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate)); } @@ -101,7 +101,7 @@ public class TopologyTemplateQueryTest { TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.VF) .customizationUUID("2345") .build(); - when(nodeTemplate.getMetaData()).thenReturn(metadata); + when(nodeTemplate.getMetadata()).thenReturn(metadata); when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)).thenReturn(null); when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.VF.getValue()); assertFalse(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate)); @@ -111,7 +111,7 @@ public class TopologyTemplateQueryTest { public void templateIsFoundWhenTypeIsMatchedAndCuuidIsNullInMetadata() { TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.VF) .build(); - when(nodeTemplate.getMetaData()).thenReturn(metadata); + when(nodeTemplate.getMetadata()).thenReturn(metadata); when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)).thenReturn(null); when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.VF.getValue()); assertTrue(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate)); @@ -122,7 +122,7 @@ public class TopologyTemplateQueryTest { TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC) .customizationUUID("345") .build(); - when(nodeTemplate.getMetaData()).thenReturn(metadata); + when(nodeTemplate.getMetadata()).thenReturn(metadata); when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.CVFC.getValue()); when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)).thenReturn("345"); assertTrue(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate)); @@ -133,7 +133,7 @@ public class TopologyTemplateQueryTest { TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CR) .customizationUUID("345") .build(); - when(nodeTemplate.getMetaData()).thenReturn(metadata); + when(nodeTemplate.getMetadata()).thenReturn(metadata); when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.CVFC.getValue()); assertFalse(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate)); } diff --git a/sdc-tosca/src/test/java/org/onap/sdc/tosca/parser/impl/ToscaParserNodeTemplateMockTest.java b/sdc-tosca/src/test/java/org/onap/sdc/tosca/parser/impl/ToscaParserNodeTemplateMockTest.java index e58d863..533b8ee 100644 --- a/sdc-tosca/src/test/java/org/onap/sdc/tosca/parser/impl/ToscaParserNodeTemplateMockTest.java +++ b/sdc-tosca/src/test/java/org/onap/sdc/tosca/parser/impl/ToscaParserNodeTemplateMockTest.java @@ -185,7 +185,7 @@ public class ToscaParserNodeTemplateMockTest { @Test public void verifyNodeTypeIsNotSupported() { - when(nodeTemplate.getMetaData()).thenReturn(metadata); + when(nodeTemplate.getMetadata()).thenReturn(metadata); when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn("VFC-TEST"); ISdcCsarHelper sdcCsarHelper = new SdcCsarHelperImpl(toscaTemplate); diff --git a/sdc-tosca/src/test/resources/csars/resource-VspWithArtifacts.csar b/sdc-tosca/src/test/resources/csars/resource-VspWithArtifacts.csar new file mode 100644 index 0000000..b4402d0 Binary files /dev/null and b/sdc-tosca/src/test/resources/csars/resource-VspWithArtifacts.csar differ -- cgit 1.2.3-korg