diff options
Diffstat (limited to 'tosca2heat/tosca-parser/toscaparser/substitution_mappings.py')
-rw-r--r-- | tosca2heat/tosca-parser/toscaparser/substitution_mappings.py | 58 |
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)) |