Merge "Validate template requirements as list"
This commit is contained in:
@@ -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'))
|
||||
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')
|
||||
self._common_validate_field(req, allowed_reqs,
|
||||
'requirements')
|
||||
|
||||
def _validate_requirements_properties(self, requirements):
|
||||
# TODO(anyone): Only occurrences property of the requirements is
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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():
|
||||
|
||||
Reference in New Issue
Block a user