fix package init name for nfv-toscaparser
[parser.git] / tosca2heat / tosca-parser / toscaparser / substitution_mappings.py
index d4653c3..dea5de7 100644 (file)
@@ -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))