aboutsummaryrefslogtreecommitdiffstats
path: root/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/ToscaTemplate.java
diff options
context:
space:
mode:
Diffstat (limited to 'jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/ToscaTemplate.java')
-rw-r--r--jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/ToscaTemplate.java1002
1 files changed, 0 insertions, 1002 deletions
diff --git a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/ToscaTemplate.java b/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/ToscaTemplate.java
deleted file mode 100644
index b13a2a5..0000000
--- a/jtosca/src/main/java/org/openecomp/sdc/toscaparser/api/ToscaTemplate.java
+++ /dev/null
@@ -1,1002 +0,0 @@
-package org.openecomp.sdc.toscaparser.api;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.*;
-
-import org.openecomp.sdc.toscaparser.api.common.ExceptionCollector;
-import org.openecomp.sdc.toscaparser.api.common.JToscaException;
-import org.openecomp.sdc.toscaparser.api.elements.EntityType;
-import org.openecomp.sdc.toscaparser.api.elements.Metadata;
-import org.openecomp.sdc.toscaparser.api.extensions.ExtTools;
-import org.openecomp.sdc.toscaparser.api.parameters.Input;
-import org.openecomp.sdc.toscaparser.api.parameters.Output;
-import org.openecomp.sdc.toscaparser.api.prereq.CSAR;
-import org.openecomp.sdc.toscaparser.api.utils.JToscaErrorCodes;
-import org.openecomp.sdc.toscaparser.api.utils.ThreadLocalsHolder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.yaml.snakeyaml.Yaml;
-
-public class ToscaTemplate extends Object {
-
- private static 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";
- private static final String TEMPLATE_NAME = "template_name";
- private static final String TOPOLOGY_TEMPLATE = "topology_template";
- private static final String TEMPLATE_AUTHOR = "template_author";
- private static final String TEMPLATE_VERSION = "template_version";
- private static final String DESCRIPTION = "description";
- private static final String IMPORTS = "imports";
- private static final String DSL_DEFINITIONS = "dsl_definitions";
- private static final String NODE_TYPES = "node_types";
- private static final String RELATIONSHIP_TYPES = "relationship_types";
- private static final String RELATIONSHIP_TEMPLATES = "relationship_templates";
- private static final String CAPABILITY_TYPES = "capability_types";
- private static final String ARTIFACT_TYPES = "artifact_types";
- private static final String DATA_TYPES = "data_types";
- private static final String INTERFACE_TYPES = "interface_types";
- 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 ArrayList<String> SPECIAL_SECTIONS;
-
- private ExtTools exttools = new ExtTools();
-
- private ArrayList<String> VALID_TEMPLATE_VERSIONS;
- private LinkedHashMap<String,ArrayList<String>> ADDITIONAL_SECTIONS;
-
- private boolean isFile;
- private String path;
- private String inputPath;
- private LinkedHashMap<String,Object> parsedParams;
- private LinkedHashMap<String,Object> tpl;
- private String version;
- private ArrayList<Object> imports;
- private LinkedHashMap<String,Object> relationshipTypes;
- private Metadata metaData;
- private String description;
- private TopologyTemplate topologyTemplate;
- private ArrayList<Repository> repositories;
- private ArrayList<Input> inputs;
- private ArrayList<RelationshipTemplate> relationshipTemplates;
- private ArrayList<NodeTemplate> nodeTemplates;
- private ArrayList<Output> outputs;
- private ArrayList<Policy> policies;
- private LinkedHashMap<String,Object> nestedToscaTplsWithTopology;
- private ArrayList<TopologyTemplate> nestedToscaTemplatesWithTopology;
- private ToscaGraph graph;
- private String csarTempDir;
- private int nestingLoopCounter;
- private LinkedHashMap<String, LinkedHashMap<String, Object>> metaProperties;
-
- @SuppressWarnings("unchecked")
- public ToscaTemplate(String _path,
- LinkedHashMap<String,Object> _parsedParams,
- boolean aFile,
- LinkedHashMap<String,Object> yamlDictTpl) throws JToscaException {
-
- ThreadLocalsHolder.setCollector(new ExceptionCollector(_path));
-
- VALID_TEMPLATE_VERSIONS = new ArrayList<>();
- VALID_TEMPLATE_VERSIONS.add("tosca_simple_yaml_1_0");
- 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.putAll(exttools.getSections());
-
- //long startTime = System.nanoTime();
-
-
- isFile = aFile;
- inputPath = null;
- path = null;
- tpl = null;
- csarTempDir = null;
- nestedToscaTplsWithTopology = new LinkedHashMap<String,Object>();
- nestedToscaTemplatesWithTopology = new ArrayList<TopologyTemplate>();
-
- if(_path != null && !_path.isEmpty()) {
- // save the original input path
- inputPath = _path;
- // get the actual path (will change with CSAR)
- path = _getPath(_path);
- // load the YAML template
- if (path != null && !path.isEmpty()) {
- try {
- //System.out.println("Loading YAML file " + path);
- log.debug("ToscaTemplate Loading YAMEL file {}", path);
- InputStream input = new FileInputStream(new File(path));
- Yaml yaml = new Yaml();
- Object data = yaml.load(input);
- this.tpl = (LinkedHashMap<String,Object>) data;
- }
- catch (FileNotFoundException e) {
- log.error("ToscaTemplate - Exception loading yaml: {}", e.getMessage());
- return;
- }
- catch(Exception e) {
- log.error("ToscaTemplate - Error loading yaml, aborting");
- return;
- }
-
- if(yamlDictTpl != null) {
- //msg = (_('Both path and yaml_dict_tpl arguments were '
- // 'provided. Using path and ignoring yaml_dict_tpl.'))
- //log.info(msg)
- log.debug("ToscaTemplate - Both path and yaml_dict_tpl arguments were provided. Using path and ignoring yaml_dict_tpl");
- }
- }
- else {
- // no input to process...
- _abort();
- }
- }
- else {
- if(yamlDictTpl != null) {
- tpl = yamlDictTpl;
- }
- else {
- ThreadLocalsHolder.getCollector().appendException(
- "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");
-
- }
- }
-
- if(tpl != null) {
- parsedParams = _parsedParams;
- _validateField();
- this.version = _tplVersion();
- this.metaData = _tplMetaData();
- this.relationshipTypes = _tplRelationshipTypes();
- this.description = _tplDescription();
- this.topologyTemplate = _topologyTemplate();
- this.repositories = _tplRepositories();
- if(topologyTemplate.getTpl() != null) {
- this.inputs = _inputs();
- this.relationshipTemplates = _relationshipTemplates();
- this.nodeTemplates = _nodeTemplates();
- this.outputs = _outputs();
- this.policies = _policies();
- _handleNestedToscaTemplatesWithTopology();
- graph = new ToscaGraph(nodeTemplates);
- }
- }
-
- if(csarTempDir != null) {
- CSAR.deleteDir(new File(csarTempDir));
- csarTempDir = null;
- }
-
- verifyTemplate();
-
- }
-
- private void _abort() throws JToscaException {
- // print out all exceptions caught
- verifyTemplate();
- throw new JToscaException("jtosca aborting", JToscaErrorCodes.PATH_NOT_VALID.getValue());
- }
- private TopologyTemplate _topologyTemplate() {
- return new TopologyTemplate(
- _tplTopologyTemplate(),
- _getAllCustomDefs(imports),
- relationshipTypes,
- parsedParams,
- null);
- }
-
- private ArrayList<Input> _inputs() {
- return topologyTemplate.getInputs();
- }
-
- private ArrayList<NodeTemplate> _nodeTemplates() {
- return topologyTemplate.getNodeTemplates();
- }
-
- private ArrayList<RelationshipTemplate> _relationshipTemplates() {
- return topologyTemplate.getRelationshipTemplates();
- }
-
- private ArrayList<Output> _outputs() {
- return topologyTemplate.getOutputs();
- }
-
- private String _tplVersion() {
- return (String)tpl.get(DEFINITION_VERSION);
- }
-
- @SuppressWarnings("unchecked")
- private Metadata _tplMetaData() {
- Object mdo = tpl.get(METADATA);
- if(mdo instanceof LinkedHashMap) {
- return new Metadata((Map<String, Object>)mdo);
- }
- else {
- return null;
- }
- }
-
- private String _tplDescription() {
- return (String)tpl.get(DESCRIPTION);
- }
-
- private ArrayList<Object> _tplImports() {
- return (ArrayList<Object>)tpl.get(IMPORTS);
- }
-
- private ArrayList<Repository> _tplRepositories() {
- LinkedHashMap<String,Object> repositories =
- (LinkedHashMap<String,Object>)tpl.get(REPOSITORIES);
- ArrayList<Repository> reposit = new ArrayList<>();
- if(repositories != null) {
- for(Map.Entry<String,Object> me: repositories.entrySet()) {
- Repository reposits = new Repository(me.getKey(),me.getValue());
- reposit.add(reposits);
- }
- }
- return reposit;
- }
-
- private LinkedHashMap<String,Object> _tplRelationshipTypes() {
- return (LinkedHashMap<String,Object>)_getCustomTypes(RELATIONSHIP_TYPES,null);
- }
-
- @SuppressWarnings("unchecked")
- private LinkedHashMap<String,Object> _tplRelationshipTemplates() {
- return (LinkedHashMap<String,Object>)_tplTopologyTemplate().get(RELATIONSHIP_TEMPLATES);
- }
-
- @SuppressWarnings("unchecked")
- private LinkedHashMap<String,Object> _tplTopologyTemplate() {
- return (LinkedHashMap<String,Object>)tpl.get(TOPOLOGY_TEMPLATE);
- }
-
- private ArrayList<Policy> _policies() {
- return topologyTemplate.getPolicies();
- }
-
- private LinkedHashMap<String,Object> _getAllCustomDefs(ArrayList<Object> alImports) {
-
- String types[] = {
- IMPORTS, NODE_TYPES, CAPABILITY_TYPES, RELATIONSHIP_TYPES,
- DATA_TYPES, INTERFACE_TYPES, POLICY_TYPES, GROUP_TYPES
- };
- LinkedHashMap<String,Object> customDefsFinal = new LinkedHashMap<String,Object>();
- LinkedHashMap<String,Object> customDefs = _getCustomTypes(types,alImports);
- if(customDefs != null) {
- customDefsFinal.putAll(customDefs);
- if(customDefs.get(IMPORTS) != null) {
- @SuppressWarnings("unchecked")
- LinkedHashMap<String,Object> importDefs = _getAllCustomDefs((ArrayList<Object>)customDefs.get(IMPORTS));
- customDefsFinal.putAll(importDefs);
- }
- }
-
- // As imports are not custom_types, remove from the dict
- customDefsFinal.remove(IMPORTS);
-
- return customDefsFinal;
- }
-
- @SuppressWarnings("unchecked")
- private LinkedHashMap<String,Object> _getCustomTypes(Object typeDefinitions,ArrayList<Object> alImports) {
-
- // Handle custom types defined in imported template files
- // This method loads the custom type definitions referenced in "imports"
- // section of the TOSCA YAML template.
-
- LinkedHashMap<String,Object> customDefs = new LinkedHashMap<String,Object>();
- ArrayList<String> typeDefs = new ArrayList<String>();
- if(typeDefinitions instanceof String[]) {
- for(String s: (String[])typeDefinitions) {
- typeDefs.add(s);
- }
- }
- else {
- typeDefs.add((String)typeDefinitions);
- }
-
- if(alImports == null) {
- alImports = _tplImports();
- }
-
- if(alImports != null) {
- ImportsLoader customService = new ImportsLoader(alImports,path,typeDefs,tpl);
- ArrayList<LinkedHashMap<String,Object>> nestedToscaTpls = customService.getNestedToscaTpls();
- _updateNestedToscaTplsWithTopology(nestedToscaTpls);
-
- customDefs = customService.getCustomDefs();
- if(customDefs == null) {
- return null;
- }
- }
-
- //Handle custom types defined in current template file
- for(String td: typeDefs) {
- if(!td.equals(IMPORTS)) {
- LinkedHashMap<String,Object> innerCustomTypes = (LinkedHashMap<String,Object> )tpl.get(td);
- if(innerCustomTypes != null) {
- customDefs.putAll(innerCustomTypes);
- }
- }
- }
- return customDefs;
- }
-
- private void _updateNestedToscaTplsWithTopology(ArrayList<LinkedHashMap<String,Object>> nestedToscaTpls) {
- for(LinkedHashMap<String,Object> ntpl: nestedToscaTpls) {
- // there is just one key:value pair in ntpl
- for(Map.Entry<String,Object> me: ntpl.entrySet()) {
- String fileName = me.getKey();
- @SuppressWarnings("unchecked")
- LinkedHashMap<String,Object> toscaTpl = (LinkedHashMap<String,Object>)me.getValue();
- if(toscaTpl.get(TOPOLOGY_TEMPLATE) != null) {
- if(nestedToscaTplsWithTopology.get(fileName) == null) {
- nestedToscaTplsWithTopology.putAll(ntpl);
- }
- }
- }
- }
- }
-
- // **experimental** (multi level nesting) RECURSIVE - BEWARE OF INIFINITE LOOPS...
- private void _handleNestedToscaTemplatesWithTopology2(TopologyTemplate tt) {
- if(++nestingLoopCounter > 10) {
- log.error("ToscaTemplate - _handleNestedToscaTemplatesWithTopology2 - Nested Topologies Loop: too many levels, aborting");
- return;
- }
- for(Map.Entry<String,Object> me: nestedToscaTplsWithTopology.entrySet()) {
- String fname = me.getKey();
- LinkedHashMap<String,Object> toscaTpl =
- (LinkedHashMap<String,Object>)me.getValue();
- for(NodeTemplate nt: tt.getNodeTemplates()) {
- if(_isSubMappedNode2(nt,toscaTpl)) {
- parsedParams = _getParamsForNestedTemplate(nt);
- LinkedHashMap<String,Object> topologyTpl =
- (LinkedHashMap<String,Object>)toscaTpl.get(TOPOLOGY_TEMPLATE);
- TopologyTemplate topologyWithSubMapping =
- new TopologyTemplate(topologyTpl,
- _getAllCustomDefs(null),
- relationshipTypes,
- parsedParams,
- nt);
- if(topologyWithSubMapping.getSubstitutionMappings() != null) {
- // Record nested topology templates in top level template
- //nestedToscaTemplatesWithTopology.add(topologyWithSubMapping);
- // Set substitution mapping object for mapped node
- nt.setSubMappingToscaTemplate2(
- topologyWithSubMapping.getSubstitutionMappings());
- _handleNestedToscaTemplatesWithTopology2(topologyWithSubMapping);
- }
- }
- }
- }
- }
-
- private void _handleNestedToscaTemplatesWithTopology() {
- for(Map.Entry<String,Object> me: nestedToscaTplsWithTopology.entrySet()) {
- String fname = me.getKey();
- LinkedHashMap<String,Object> toscaTpl =
- (LinkedHashMap<String,Object>)me.getValue();
- for(NodeTemplate nt: nodeTemplates) {
- if(_isSubMappedNode(nt,toscaTpl)) {
- parsedParams = _getParamsForNestedTemplate(nt);
- ArrayList<Object> alim = (ArrayList<Object>)toscaTpl.get(IMPORTS);
- LinkedHashMap<String,Object> topologyTpl =
- (LinkedHashMap<String,Object>)toscaTpl.get(TOPOLOGY_TEMPLATE);
- TopologyTemplate topologyWithSubMapping =
- new TopologyTemplate(topologyTpl,
- //_getAllCustomDefs(null),
- _getAllCustomDefs(alim),
- relationshipTypes,
- parsedParams,
- nt);
- 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());
- }
- }
- }
- }
- }
-
- private void _validateField() {
- String sVersion = _tplVersion();
- if(sVersion == null) {
- ThreadLocalsHolder.getCollector().appendException(String.format(
- "MissingRequiredField: Template is missing required field \"%s\"",DEFINITION_VERSION));
- }
- else {
- _validateVersion(sVersion);
- this.version = sVersion;
- }
-
- for (String sKey : tpl.keySet()) {
- boolean bFound = false;
- for (String sSection: SECTIONS) {
- if(sKey.equals(sSection)) {
- bFound = true;
- break;
- }
- }
- // check ADDITIONAL_SECTIONS
- if(!bFound) {
- if(ADDITIONAL_SECTIONS.get(version) != null &&
- ADDITIONAL_SECTIONS.get(version).contains(sKey)) {
- bFound = true;
- }
- }
- if(!bFound) {
- ThreadLocalsHolder.getCollector().appendException(String.format(
- "UnknownFieldError: Template contains unknown field \"%s\"",
- sKey));
- }
- }
- }
-
- private void _validateVersion(String sVersion) {
- boolean bFound = false;
- for(String vtv: VALID_TEMPLATE_VERSIONS) {
- if(sVersion.equals(vtv)) {
- bFound = true;
- break;
- }
- }
- if(!bFound) {
- ThreadLocalsHolder.getCollector().appendException(String.format(
- "InvalidTemplateVersion: \"%s\" is invalid. Valid versions are %s",
- sVersion,VALID_TEMPLATE_VERSIONS.toString()));
- }
- else if(!sVersion.equals("tosca_simple_yaml_1_0")) {
- EntityType.updateDefinitions(sVersion);
- }
- }
-
- private String _getPath(String _path) throws JToscaException {
- if (_path.toLowerCase().endsWith(".yaml") || _path.toLowerCase().endsWith(".yml")) {
- return _path;
- }
- else if (_path.toLowerCase().endsWith(".zip") || _path.toLowerCase().endsWith(".csar")) {
- // a CSAR archive
- CSAR csar = new CSAR(_path, isFile);
- if (csar.validate()) {
- try {
- csar.decompress();
- metaProperties = csar.getMetaProperties();
- }
- catch (IOException e) {
- log.error("ToscaTemplate - _getPath - IOException trying to decompress {}", _path);
- return null;
- }
- isFile = true; // the file has been decompressed locally
- csar.cleanup();
- csarTempDir = csar.getTempDir();
- return csar.getTempDir() + File.separator + csar.getMainTemplate();
- }
- }
- else {
- ThreadLocalsHolder.getCollector().appendException("ValueError: " + _path + " is not a valid file");
- return null;
- }
- return null;
- }
-
- private void verifyTemplate() throws JToscaException {
- ThreadLocalsHolder.getCollector().setWantTrace(false);
-
- //Warnings
- int warningsCount = ThreadLocalsHolder.getCollector().warningsCaught();
- if (warningsCount > 0) {
- List<String> warningsStrings = ThreadLocalsHolder.getCollector().getWarningsReport();
- log.warn("####################################################################################################");
- log.warn("CSAR Warnings found! CSAR name - {}", inputPath);
- log.warn("ToscaTemplate - verifyTemplate - {} Parsing Warning{} occurred...", warningsCount, (warningsCount > 1 ? "s" : ""));
- for (String s : warningsStrings) {
- log.warn("{}. CSAR name - {}", s, inputPath);
- }
- log.warn("####################################################################################################");
- }
-
- //Criticals
- int criticalsCount = ThreadLocalsHolder.getCollector().criticalsCaught();
- if (criticalsCount > 0) {
- List<String> criticalStrings = ThreadLocalsHolder.getCollector().getCriticalsReport();
- log.error("####################################################################################################");
- log.error("ToscaTemplate - verifyTemplate - {} Parsing Critical{} occurred...", criticalsCount, (criticalsCount > 1 ? "s" : ""));
- for (String s : criticalStrings) {
- log.error("{}. CSAR name - {}", s, inputPath);
- }
- throw new JToscaException(String.format("CSAR Validation Failed. CSAR name - {}. Please check logs for details.", inputPath), JToscaErrorCodes.CSAR_TOSCA_VALIDATION_ERROR.getValue());
- }
- }
-
- public String getPath() {
- return path;
- }
-
- public String getVersion() {
- return version;
- }
-
- public String getDescription() {
- return description;
- }
-
- public TopologyTemplate getTopologyTemplate() {
- return topologyTemplate;
- }
-
- public Metadata getMetaData() {
- return metaData;
- }
-
- public ArrayList<Input> getInputs() {
- return inputs;
- }
-
- public ArrayList<Output> getOutputs() {
- return outputs;
- }
-
- public ArrayList<Policy> getPolicies() {
- return policies;
- }
-
- public ArrayList<NodeTemplate> getNodeTemplates() {
- return nodeTemplates;
- }
-
- public LinkedHashMap<String, Object> getMetaProperties(String propertiesFile) {
- return metaProperties.get(propertiesFile);
- }
-
- private boolean _isSubMappedNode(NodeTemplate nt,LinkedHashMap<String,Object> toscaTpl) {
- // Return True if the nodetemple is substituted
- if(nt != null && nt.getSubMappingToscaTemplate() == null &&
- getSubMappingNodeType(toscaTpl).equals(nt.getType()) &&
- nt.getInterfaces().size() < 1) {
- return true;
- }
- return false;
- }
-
- private boolean _isSubMappedNode2(NodeTemplate nt,LinkedHashMap<String,Object> toscaTpl) {
- // Return True if the nodetemple is substituted
- if(nt != null && nt.getSubMappingToscaTemplate2() == null &&
- getSubMappingNodeType(toscaTpl).equals(nt.getType()) &&
- nt.getInterfaces().size() < 1) {
- return true;
- }
- return false;
- }
-
- private LinkedHashMap<String,Object> _getParamsForNestedTemplate(NodeTemplate nt) {
- // Return total params for nested_template
- LinkedHashMap<String,Object> pparams;
- if(parsedParams != null) {
- pparams = parsedParams;
- }
- else {
- pparams = new LinkedHashMap<String,Object>();
- }
- if(nt != null) {
- for(String pname: nt.getProperties().keySet()) {
- pparams.put(pname,nt.getPropertyValue(pname));
- }
- }
- return pparams;
- }
-
- private String getSubMappingNodeType(LinkedHashMap<String,Object> toscaTpl) {
- // Return substitution mappings node type
- if(toscaTpl != null) {
- return TopologyTemplate.getSubMappingNodeType(
- (LinkedHashMap<String,Object>)toscaTpl.get(TOPOLOGY_TEMPLATE));
- }
- return null;
- }
-
- private boolean _hasSubstitutionMapping() {
- // Return True if the template has valid substitution mappings
- return topologyTemplate != null &&
- topologyTemplate.getSubstitutionMappings() != null;
- }
-
- public boolean hasNestedTemplates() {
- // Return True if the tosca template has nested templates
- return nestedToscaTemplatesWithTopology != null &&
- nestedToscaTemplatesWithTopology.size() >= 1;
-
- }
-
- public ArrayList<TopologyTemplate> getNestedTemplates() {
- return nestedToscaTemplatesWithTopology;
- }
-
- @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 +
- '}';
- }
-}
-
-/*python
-
-import logging
-import os
-
-from copy import deepcopy
-from toscaparser.common.exception import ExceptionCollector.collector
-from toscaparser.common.exception import InvalidTemplateVersion
-from toscaparser.common.exception import MissingRequiredFieldError
-from toscaparser.common.exception import UnknownFieldError
-from toscaparser.common.exception import ValidationError
-from toscaparser.elements.entity_type import update_definitions
-from toscaparser.extensions.exttools import ExtTools
-import org.openecomp.sdc.toscaparser.api.imports
-from toscaparser.prereq.csar import CSAR
-from toscaparser.repositories import Repository
-from toscaparser.topology_template import TopologyTemplate
-from toscaparser.tpl_relationship_graph import ToscaGraph
-from toscaparser.utils.gettextutils import _
-import org.openecomp.sdc.toscaparser.api.utils.yamlparser
-
-
-# TOSCA template key names
-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) = \
- ('tosca_definitions_version', 'tosca_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
-SPECIAL_SECTIONS = (METADATA) = ('metadata')
-
-log = logging.getLogger("tosca.model")
-
-YAML_LOADER = toscaparser.utils.yamlparser.load_yaml
-
-
-class ToscaTemplate(object):
- exttools = ExtTools()
-
- VALID_TEMPLATE_VERSIONS = ['tosca_simple_yaml_1_0']
-
- VALID_TEMPLATE_VERSIONS.extend(exttools.get_versions())
-
- ADDITIONAL_SECTIONS = {'tosca_simple_yaml_1_0': SPECIAL_SECTIONS}
-
- ADDITIONAL_SECTIONS.update(exttools.get_sections())
-
- '''Load the template data.'''
- def __init__(self, path=None, parsed_params=None, a_file=True,
- yaml_dict_tpl=None):
-
- ExceptionCollector.collector.start()
- self.a_file = a_file
- self.input_path = None
- self.path = None
- self.tpl = None
- self.nested_tosca_tpls_with_topology = {}
- self.nested_tosca_templates_with_topology = []
- if path:
- self.input_path = path
- self.path = self._get_path(path)
- if self.path:
- self.tpl = YAML_LOADER(self.path, self.a_file)
- if yaml_dict_tpl:
- msg = (_('Both path and yaml_dict_tpl arguments were '
- 'provided. Using path and ignoring yaml_dict_tpl.'))
- log.info(msg)
- print(msg)
- else:
- if yaml_dict_tpl:
- self.tpl = yaml_dict_tpl
- else:
- ExceptionCollector.collector.appendException(
- ValueError(_('No path or yaml_dict_tpl was provided. '
- 'There is nothing to parse.')))
-
- if self.tpl:
- self.parsed_params = parsed_params
- self._validate_field()
- self.version = self._tpl_version()
- self.relationship_types = self._tpl_relationship_types()
- self.description = self._tpl_description()
- self.topology_template = self._topology_template()
- self.repositories = self._tpl_repositories()
- if self.topology_template.tpl:
- self.inputs = self._inputs()
- self.relationship_templates = self._relationship_templates()
- self.nodetemplates = self._nodetemplates()
- self.outputs = self._outputs()
- self._handle_nested_tosca_templates_with_topology()
- self.graph = ToscaGraph(self.nodetemplates)
-
- ExceptionCollector.collector.stop()
- self.verify_template()
-
- def _topology_template(self):
- return TopologyTemplate(self._tpl_topology_template(),
- self._get_all_custom_defs(),
- self.relationship_types,
- self.parsed_params,
- None)
-
- def _inputs(self):
- return self.topology_template.inputs
-
- def _nodetemplates(self):
- return self.topology_template.nodetemplates
-
- def _relationship_templates(self):
- return self.topology_template.relationship_templates
-
- def _outputs(self):
- return self.topology_template.outputs
-
- def _tpl_version(self):
- return self.tpl.get(DEFINITION_VERSION)
-
- def _tpl_description(self):
- desc = self.tpl.get(DESCRIPTION)
- if desc:
- return desc.rstrip()
-
- def _tpl_imports(self):
- return self.tpl.get(IMPORTS)
-
- def _tpl_repositories(self):
- repositories = self.tpl.get(REPOSITORIES)
- reposit = []
- if repositories:
- for name, val in repositories.items():
- reposits = Repository(name, val)
- reposit.append(reposits)
- return reposit
-
- def _tpl_relationship_types(self):
- return self._get_custom_types(RELATIONSHIP_TYPES)
-
- def _tpl_relationship_templates(self):
- topology_template = self._tpl_topology_template()
- return topology_template.get(RELATIONSHIP_TEMPLATES)
-
- def _tpl_topology_template(self):
- return self.tpl.get(TOPOLOGY_TEMPLATE)
-
- def _get_all_custom_defs(self, imports=None):
- types = [IMPORTS, NODE_TYPES, CAPABILITY_TYPES, RELATIONSHIP_TYPES,
- DATA_TYPES, INTERFACE_TYPES, POLICY_TYPES, GROUP_TYPES]
- custom_defs_final = {}
- custom_defs = self._get_custom_types(types, imports)
- if custom_defs:
- custom_defs_final.update(custom_defs)
- if custom_defs.get(IMPORTS):
- import_defs = self._get_all_custom_defs(
- custom_defs.get(IMPORTS))
- custom_defs_final.update(import_defs)
-
- # As imports are not custom_types, removing from the dict
- custom_defs_final.pop(IMPORTS, None)
- return custom_defs_final
-
- def _get_custom_types(self, type_definitions, imports=None):
- """Handle custom types defined in imported template files
-
- This method loads the custom type definitions referenced in "imports"
- section of the TOSCA YAML template.
- """
- custom_defs = {}
- type_defs = []
- if not isinstance(type_definitions, list):
- type_defs.append(type_definitions)
- else:
- type_defs = type_definitions
-
- if not imports:
- imports = self._tpl_imports()
-
- if imports:
- custom_service = toscaparser.imports.\
- ImportsLoader(imports, self.path,
- type_defs, self.tpl)
-
- nested_tosca_tpls = custom_service.get_nested_tosca_tpls()
- self._update_nested_tosca_tpls_with_topology(nested_tosca_tpls)
-
- custom_defs = custom_service.get_custom_defs()
- if not custom_defs:
- return
-
- # Handle custom types defined in current template file
- for type_def in type_defs:
- if type_def != IMPORTS:
- inner_custom_types = self.tpl.get(type_def) or {}
- if inner_custom_types:
- custom_defs.update(inner_custom_types)
- return custom_defs
-
- def _update_nested_tosca_tpls_with_topology(self, nested_tosca_tpls):
- for tpl in nested_tosca_tpls:
- filename, tosca_tpl = list(tpl.items())[0]
- if (tosca_tpl.get(TOPOLOGY_TEMPLATE) and
- filename not in list(
- self.nested_tosca_tpls_with_topology.keys())):
- self.nested_tosca_tpls_with_topology.update(tpl)
-
- def _handle_nested_tosca_templates_with_topology(self):
- for fname, tosca_tpl in self.nested_tosca_tpls_with_topology.items():
- for nodetemplate in self.nodetemplates:
- if self._is_sub_mapped_node(nodetemplate, tosca_tpl):
- parsed_params = self._get_params_for_nested_template(
- nodetemplate)
- topology_tpl = tosca_tpl.get(TOPOLOGY_TEMPLATE)
- topology_with_sub_mapping = TopologyTemplate(
- topology_tpl,
- self._get_all_custom_defs(),
- self.relationship_types,
- parsed_params,
- nodetemplate)
- if topology_with_sub_mapping.substitution_mappings:
- # Record nested topo templates in top level template
- self.nested_tosca_templates_with_topology.\
- append(topology_with_sub_mapping)
- # Set substitution mapping object for mapped node
- nodetemplate.sub_mapping_tosca_template = \
- topology_with_sub_mapping.substitution_mappings
-
- def _validate_field(self):
- version = self._tpl_version()
- if not version:
- ExceptionCollector.collector.appendException(
- MissingRequiredFieldError(what='Template',
- required=DEFINITION_VERSION))
- else:
- self._validate_version(version)
- self.version = version
-
- for name in self.tpl:
- if (name not in SECTIONS and
- name not in self.ADDITIONAL_SECTIONS.get(version, ())):
- ExceptionCollector.collector.appendException(
- UnknownFieldError(what='Template', field=name))
-
- def _validate_version(self, version):
- if version not in self.VALID_TEMPLATE_VERSIONS:
- ExceptionCollector.collector.appendException(
- InvalidTemplateVersion(
- what=version,
- valid_versions=', '. join(self.VALID_TEMPLATE_VERSIONS)))
- else:
- if version != 'tosca_simple_yaml_1_0':
- update_definitions(version)
-
- def _get_path(self, path):
- if path.lower().endswith(('.yaml','.yml')):
- return path
- elif path.lower().endswith(('.zip', '.csar')):
- # a CSAR archive
- csar = CSAR(path, self.a_file)
- if csar.validate():
- csar.decompress()
- self.a_file = True # the file has been decompressed locally
- return os.path.join(csar.temp_dir, csar.get_main_template())
- else:
- ExceptionCollector.collector.appendException(
- ValueError(_('"%(path)s" is not a valid file.')
- % {'path': path}))
-
- def verify_template(self):
- if ExceptionCollector.collector.exceptionsCaught():
- if self.input_path:
- raise ValidationError(
- message=(_('\nThe input "%(path)s" failed validation with '
- 'the following error(s): \n\n\t')
- % {'path': self.input_path}) +
- '\n\t'.join(ExceptionCollector.collector.getExceptionsReport()))
- else:
- raise ValidationError(
- message=_('\nThe pre-parsed input failed validation with '
- 'the following error(s): \n\n\t') +
- '\n\t'.join(ExceptionCollector.collector.getExceptionsReport()))
- else:
- if self.input_path:
- msg = (_('The input "%(path)s" successfully passed '
- 'validation.') % {'path': self.input_path})
- else:
- msg = _('The pre-parsed input successfully passed validation.')
-
- log.info(msg)
-
- def _is_sub_mapped_node(self, nodetemplate, tosca_tpl):
- """Return True if the nodetemple is substituted."""
- if (nodetemplate and not nodetemplate.sub_mapping_tosca_template and
- self.get_sub_mapping_node_type(tosca_tpl) == nodetemplate.type
- and len(nodetemplate.interfaces) < 1):
- return True
- else:
- return False
-
- def _get_params_for_nested_template(self, nodetemplate):
- """Return total params for nested_template."""
- parsed_params = deepcopy(self.parsed_params) \
- if self.parsed_params else {}
- if nodetemplate:
- for pname in nodetemplate.get_properties():
- parsed_params.update({pname:
- nodetemplate.get_property_value(pname)})
- return parsed_params
-
- def get_sub_mapping_node_type(self, tosca_tpl):
- """Return substitution mappings node type."""
- if tosca_tpl:
- return TopologyTemplate.get_sub_mapping_node_type(
- tosca_tpl.get(TOPOLOGY_TEMPLATE))
-
- def _has_substitution_mappings(self):
- """Return True if the template has valid substitution mappings."""
- return self.topology_template is not None and \
- self.topology_template.substitution_mappings is not None
-
- def has_nested_templates(self):
- """Return True if the tosca template has nested templates."""
- return self.nested_tosca_templates_with_topology is not None and \
- len(self.nested_tosca_templates_with_topology) >= 1
-*/ \ No newline at end of file