Merge "Validate template requirements as list"

This commit is contained in:
Jenkins
2016-11-23 14:34:35 +00:00
committed by Gerrit Code Review
3 changed files with 63 additions and 9 deletions

View File

@@ -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

View File

@@ -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))

View File

@@ -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():