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.py77
1 files changed, 44 insertions, 33 deletions
diff --git a/tosca2heat/tosca-parser/toscaparser/substitution_mappings.py b/tosca2heat/tosca-parser/toscaparser/substitution_mappings.py
index 35ffdf3..d4653c3 100644
--- a/tosca2heat/tosca-parser/toscaparser/substitution_mappings.py
+++ b/tosca2heat/tosca-parser/toscaparser/substitution_mappings.py
@@ -14,9 +14,9 @@ import logging
from toscaparser.common.exception import ExceptionCollector
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 MissingRequiredParameterError
from toscaparser.common.exception import UnknownFieldError
from toscaparser.elements.nodetype import NodeType
from toscaparser.utils.gettextutils import _
@@ -27,7 +27,7 @@ log = logging.getLogger('tosca')
class SubstitutionMappings(object):
'''SubstitutionMappings class declaration
- Substitution_mappings exports the topology template as an
+ SubstitutionMappings exports the topology template as an
implementation of a Node type.
'''
@@ -74,7 +74,7 @@ class SubstitutionMappings(object):
return NodeType(self.node_type, self.custom_defs)
def _validate(self):
- # basic valiation
+ # Basic validation
self._validate_keys()
self._validate_type()
@@ -104,48 +104,59 @@ class SubstitutionMappings(object):
node_type_def = self.custom_defs.get(node_type)
if not node_type_def:
ExceptionCollector.appendException(
- InvalidNodeTypeError(what=node_type_def))
+ InvalidNodeTypeError(what=node_type))
def _validate_inputs(self):
"""validate the inputs of substitution mappings.
- The inputs in service template which provides substutition mappings
- must be in properties of node template which is mapped or provide
- defualt value. Currently the input.name is not restrict to be the
- same as property name in specification, but they should be equal
- for current implementation.
+ 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.
"""
- # Must provide parameters for required properties of node_type
- # This checking is internal(inside SubstitutionMappings)
- for propery in self.node_definition.get_properties_def_objects():
+ all_inputs = set([input.name for input in self.inputs])
+ required_properties = set([p.name for p in
+ self.node_definition.
+ get_properties_def_objects()
+ if p.required and p.default is None])
+ # Must provide inputs for required properties of node type.
+ for property in required_properties:
# Check property which is 'required' and has no 'default' value
- if propery.required and propery.default is None and \
- propery.name not in [input.name for input in self.inputs]:
+ if property not in all_inputs:
ExceptionCollector.appendException(
MissingRequiredInputError(
- what=_('SubstitutionMappings with node_type:')
+ what=_('SubstitutionMappings with node_type ')
+ self.node_type,
- input_name=propery.name))
-
- # Get property names from substituted node tempalte
- property_names = list(self.sub_mapped_node_template
- .get_properties().keys()
- if self.sub_mapped_node_template else [])
- # Sub_mapped_node_template is None(deploy standaolone), will check
- # according to node_type
- if 0 == len(property_names):
- property_names = list(self.node_definition
- .get_properties_def().keys())
- # Provide default value for parameter which is not property of
- # node with the type node_type, this may not be mandatory for
- # current implematation, but the specification express it mandatory.
- # This checking is external(outside SubstitutionMappings)
+ input_name=property))
+
+ # If the optional properties of node type need to be customized by
+ # substituted node, it also is necessary to define inputs for them,
+ # otherwise they are not mandatory to be defined.
+ 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()])
+ for parameter in customized_parameters - all_inputs:
+ if parameter in all_properties:
+ ExceptionCollector.appendException(
+ MissingRequiredInputError(
+ what=_('SubstitutionMappings with node_type ')
+ + self.node_type,
+ input_name=parameter))
+
+ # Additional inputs are not in the properties of node type must
+ # provide default values. Currently the scenario may not happen
+ # because of parameters validation in nodetemplate, here is a
+ # guarantee.
for input in self.inputs:
- if input.name not in property_names and input.default is None:
+ if input.name in all_inputs - all_properties \
+ and input.default is None:
ExceptionCollector.appendException(
- MissingRequiredParameterError(
- what=_('SubstitutionMappings with node_type:')
+ MissingDefaultValueError(
+ what=_('SubstitutionMappings with node_type ')
+ self.node_type,
input_name=input.name))