summaryrefslogtreecommitdiffstats
path: root/tosca2heat/tosca-parser/toscaparser/substitution_mappings.py
diff options
context:
space:
mode:
Diffstat (limited to 'tosca2heat/tosca-parser/toscaparser/substitution_mappings.py')
-rw-r--r--tosca2heat/tosca-parser/toscaparser/substitution_mappings.py58
1 files changed, 41 insertions, 17 deletions
diff --git a/tosca2heat/tosca-parser/toscaparser/substitution_mappings.py b/tosca2heat/tosca-parser/toscaparser/substitution_mappings.py
index d4653c3..dea5de7 100644
--- a/tosca2heat/tosca-parser/toscaparser/substitution_mappings.py
+++ b/tosca2heat/tosca-parser/toscaparser/substitution_mappings.py
@@ -17,7 +17,9 @@ from toscaparser.common.exception import InvalidNodeTypeError
from toscaparser.common.exception import MissingDefaultValueError
from toscaparser.common.exception import MissingRequiredFieldError
from toscaparser.common.exception import MissingRequiredInputError
+from toscaparser.common.exception import MissingRequiredOutputError
from toscaparser.common.exception import UnknownFieldError
+from toscaparser.common.exception import UnknownOutputError
from toscaparser.elements.nodetype import NodeType
from toscaparser.utils.gettextutils import _
@@ -34,6 +36,8 @@ class SubstitutionMappings(object):
SECTIONS = (NODE_TYPE, REQUIREMENTS, CAPABILITIES) = \
('node_type', 'requirements', 'capabilities')
+ OPTIONAL_OUTPUTS = ['tosca_id', 'tosca_name', 'state']
+
def __init__(self, sub_mapping_def, nodetemplates, inputs, outputs,
sub_mapped_node_template, custom_defs):
self.nodetemplates = nodetemplates
@@ -110,9 +114,9 @@ class SubstitutionMappings(object):
"""validate the inputs of substitution mappings.
The inputs defined by the topology template have to match the
- properties of the node type or the substituted node. If there are
- more inputs than the substituted node has properties, default values
- must be defined for those inputs.
+ properties of the node type or the substituted node template. If
+ there are more inputs than the substituted node has properties,
+ default values must be defined for those inputs.
"""
all_inputs = set([input.name for input in self.inputs])
@@ -136,9 +140,7 @@ class SubstitutionMappings(object):
customized_parameters = set(self.sub_mapped_node_template
.get_properties().keys()
if self.sub_mapped_node_template else [])
- all_properties = set([p.name for p in
- self.node_definition.
- get_properties_def_objects()])
+ all_properties = set(self.node_definition.get_properties_def())
for parameter in customized_parameters - all_inputs:
if parameter in all_properties:
ExceptionCollector.appendException(
@@ -191,14 +193,36 @@ class SubstitutionMappings(object):
# field=req))
def _validate_outputs(self):
- """validate the outputs of substitution mappings."""
- pass
- # The outputs in service template which defines substutition mappings
- # must be in atrributes of node template wchich be mapped.
- # outputs_names = self.sub_mapped_node_template.get_properties().
- # keys() if self.sub_mapped_node_template else None
- # for name in outputs_names:
- # if name not in [output.name for input in self.outputs]:
- # ExceptionCollector.appendException(
- # UnknownFieldError(what='SubstitutionMappings',
- # field=name))
+ """validate the outputs of substitution mappings.
+
+ The outputs defined by the topology template have to match the
+ attributes of the node type or the substituted node template,
+ and the observable attributes of the substituted node template
+ have to be defined as attributes of the node type or outputs in
+ the topology template.
+ """
+
+ # The outputs defined by the topology template have to match the
+ # attributes of the node type according to the specification, but
+ # it's reasonable that there are more inputs than the node type
+ # has properties, the specification will be amended?
+ for output in self.outputs:
+ if output.name not in self.node_definition.get_attributes_def():
+ ExceptionCollector.appendException(
+ UnknownOutputError(
+ where=_('SubstitutionMappings with node_type ')
+ + self.node_type,
+ output_name=output.name))
+
+ # The observable attributes of the substituted node template
+ # have to be defined as attributes of the node type or outputs in
+ # the topology template, the attributes in tosca.node.root are
+ # optional.
+ for attribute in self.node_definition.get_attributes_def():
+ if attribute not in [output.name for output in self.outputs] \
+ and attribute not in self.OPTIONAL_OUTPUTS:
+ ExceptionCollector.appendException(
+ MissingRequiredOutputError(
+ what=_('SubstitutionMappings with node_type ')
+ + self.node_type,
+ output_name=attribute))