X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=tosca2heat%2Ftosca-parser%2Ftoscaparser%2Fnodetemplate.py;h=ca855addfe6e21aed8ea2126cc97ca70cb6018d7;hb=69e33063b3703ae4529b556b63b3c4cc239c3d9a;hp=d969d51b9c0b1a872610fd11112758542e8b0db7;hpb=2fa4785aa218cf655f3405d832d2200d64fd033e;p=parser.git diff --git a/tosca2heat/tosca-parser/toscaparser/nodetemplate.py b/tosca2heat/tosca-parser/toscaparser/nodetemplate.py index d969d51..ca855ad 100644 --- a/tosca2heat/tosca-parser/toscaparser/nodetemplate.py +++ b/tosca2heat/tosca-parser/toscaparser/nodetemplate.py @@ -22,6 +22,7 @@ from toscaparser.common.exception import ValidationError from toscaparser.dataentity import DataEntity from toscaparser.elements.interfaces import CONFIGURE from toscaparser.elements.interfaces import CONFIGURE_SHORTNAME +from toscaparser.elements.interfaces import INTERFACE_DEF_RESERVED_WORDS from toscaparser.elements.interfaces import InterfacesDef from toscaparser.elements.interfaces import LIFECYCLE from toscaparser.elements.interfaces import LIFECYCLE_SHORTNAME @@ -48,12 +49,13 @@ class NodeTemplate(EntityTemplate): self.available_rel_tpls = available_rel_tpls self.available_rel_types = available_rel_types self._relationships = {} + self.substitution_mapped = None @property def relationships(self): if not self._relationships: requires = self.requirements - if requires: + if requires and isinstance(requires, list): for r in requires: for r1, value in r.items(): explicit = self._get_explicit_relationship(r, value) @@ -205,13 +207,15 @@ class NodeTemplate(EntityTemplate): TypeMismatchError( what='"requirements" of template "%s"' % self.name, type='list')) - for req in requires: - for r1, value in req.items(): - if isinstance(value, dict): - self._validate_requirements_keys(value) - self._validate_requirements_properties(value) - allowed_reqs.append(r1) - self._common_validate_field(req, allowed_reqs, 'requirements') + else: + for req in requires: + for r1, value in req.items(): + if isinstance(value, dict): + self._validate_requirements_keys(value) + self._validate_requirements_properties(value) + allowed_reqs.append(r1) + self._common_validate_field(req, allowed_reqs, + 'requirements') def _validate_requirements_properties(self, requirements): # TODO(anyone): Only occurrences property of the requirements is @@ -228,7 +232,7 @@ class NodeTemplate(EntityTemplate): for value in occurrences: DataEntity.validate_datatype('integer', value) if len(occurrences) != 2 or not (0 <= occurrences[0] <= occurrences[1]) \ - or occurrences[1] == 0: + or occurrences[1] == 0: ExceptionCollector.appendException( InvalidPropertyValueError(what=(occurrences))) @@ -244,23 +248,42 @@ class NodeTemplate(EntityTemplate): ifaces = self.type_definition.get_value(self.INTERFACES, self.entity_tpl) if ifaces: - for i in ifaces: - for name, value in ifaces.items(): - if name in (LIFECYCLE, LIFECYCLE_SHORTNAME): - self._common_validate_field( - value, InterfacesDef. - interfaces_node_lifecycle_operations, - 'interfaces') - elif name in (CONFIGURE, CONFIGURE_SHORTNAME): - self._common_validate_field( - value, InterfacesDef. - interfaces_relationship_configure_operations, - 'interfaces') - else: - ExceptionCollector.appendException( - UnknownFieldError( - what='"interfaces" of template "%s"' % - self.name, field=name)) + for name, value in ifaces.items(): + if name in (LIFECYCLE, LIFECYCLE_SHORTNAME): + self._common_validate_field( + value, InterfacesDef. + interfaces_node_lifecycle_operations, + 'interfaces') + elif name in (CONFIGURE, CONFIGURE_SHORTNAME): + self._common_validate_field( + value, InterfacesDef. + interfaces_relationship_configure_operations, + 'interfaces') + elif name in self.type_definition.interfaces.keys(): + self._common_validate_field( + value, + self._collect_custom_iface_operations(name), + 'interfaces') + else: + ExceptionCollector.appendException( + UnknownFieldError( + what='"interfaces" of template "%s"' % + self.name, field=name)) + + def _collect_custom_iface_operations(self, name): + allowed_operations = [] + nodetype_iface_def = self.type_definition.interfaces[name] + allowed_operations.extend(nodetype_iface_def.keys()) + if 'type' in nodetype_iface_def: + iface_type = nodetype_iface_def['type'] + if iface_type in self.type_definition.custom_def: + iface_type_def = self.type_definition.custom_def[iface_type] + else: + iface_type_def = self.type_definition.TOSCA_DEF[iface_type] + allowed_operations.extend(iface_type_def.keys()) + allowed_operations = [op for op in allowed_operations if + op not in INTERFACE_DEF_RESERVED_WORDS] + return allowed_operations def _validate_fields(self, nodetemplate): for name in nodetemplate.keys():