diff --git a/toscaparser/nodetemplate.py b/toscaparser/nodetemplate.py index 5b456b1..f93c560 100644 --- a/toscaparser/nodetemplate.py +++ b/toscaparser/nodetemplate.py @@ -54,7 +54,7 @@ class NodeTemplate(EntityTemplate): 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) @@ -206,13 +206,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 diff --git a/toscaparser/tests/test_toscatplvalidation.py b/toscaparser/tests/test_toscatplvalidation.py index 7af4f17..ecc5765 100644 --- a/toscaparser/tests/test_toscatplvalidation.py +++ b/toscaparser/tests/test_toscatplvalidation.py @@ -1707,3 +1707,54 @@ heat-translator/master/translator/tests/data/custom_types/wordpress.yaml toscaparser.utils.yamlparser.simple_parse( tpl_snippet_qualified_name)) TopologyTemplate(tpl, None) + + def test_requirements_as_list(self): + """Node template with requirements provided with or without list + + Node template requirements are required to be provided as list. + """ + + expectedmessage = _('"requirements" of template "my_webserver"' + ' must be of type "list".') + + # requirements provided as dictionary + tpl_snippet1 = ''' + node_templates: + my_webserver: + type: tosca.nodes.WebServer + requirements: + host: server + server: + type: tosca.nodes.Compute + ''' + err1 = self.assertRaises( + exception.TypeMismatchError, + lambda: self._single_node_template_content_test(tpl_snippet1)) + self.assertEqual(expectedmessage, err1.__str__()) + + # requirements provided as string + tpl_snippet2 = ''' + node_templates: + my_webserver: + type: tosca.nodes.WebServer + requirements: server + server: + type: tosca.nodes.Compute + ''' + err2 = self.assertRaises( + exception.TypeMismatchError, + lambda: self._single_node_template_content_test(tpl_snippet2)) + self.assertEqual(expectedmessage, err2.__str__()) + + # requirements provided as list + tpl_snippet3 = ''' + node_templates: + my_webserver: + type: tosca.nodes.WebServer + requirements: + - host: server + server: + type: tosca.nodes.Compute + ''' + self.assertIsNone( + self._single_node_template_content_test(tpl_snippet3)) diff --git a/toscaparser/topology_template.py b/toscaparser/topology_template.py index 463e083..763eeb9 100644 --- a/toscaparser/topology_template.py +++ b/toscaparser/topology_template.py @@ -259,7 +259,8 @@ class TopologyTemplate(object): self, node_template, value) - if node_template.requirements: + if node_template.requirements and \ + isinstance(node_template.requirements, list): for req in node_template.requirements: rel = req for req_name, req_item in req.items():