Added occurrences of requirements validation

Added validation check for occurrences property value of requirements.
Included unit testcases

Change-Id: I6e4fc6769464a3973db5b778d0d318ab7525510e
Partially Implements: blueprint tosca-requirement-changes
This commit is contained in:
Meena 2015-09-01 15:40:07 +05:30
parent bc5705240e
commit a2cee0260d
2 changed files with 140 additions and 0 deletions

@ -13,8 +13,10 @@
import logging
from toscaparser.common.exception import InvalidPropertyValueError
from toscaparser.common.exception import TypeMismatchError
from toscaparser.common.exception import UnknownFieldError
from toscaparser.dataentity import DataEntity
from toscaparser.elements.interfaces import CONFIGURE
from toscaparser.elements.interfaces import CONFIGURE_SHORTNAME
from toscaparser.elements.interfaces import InterfacesDef
@ -180,9 +182,28 @@ class NodeTemplate(EntityTemplate):
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 occurences property of the requirements is
# validated here. Validation of other requirement properties are being
# validated in different files. Better to keep all the requirements
# properties validation here.
for key, value in requirements.items():
if key == 'occurrences':
self._validate_occurrences(value)
break
def _validate_occurrences(self, occurrences):
DataEntity.validate_datatype('list', occurrences)
for value in occurrences:
DataEntity.validate_datatype('integer', value)
if len(occurrences) != 2 or not (0 <= occurrences[0] <= occurrences[1]) \
or occurrences[1] == 0:
raise InvalidPropertyValueError(what=(occurrences))
def _validate_requirements_keys(self, requirement):
for key in requirement.keys():
if key not in self.REQUIREMENTS_SECTION:

@ -450,6 +450,33 @@ class ToscaTemplateValidationTest(TestCase):
exception.UnknownFieldError,
expectedmessage)
def test_node_template_requirements_with_wrong_occurrences_keyname(self):
"""Incorrect node template requirements keyname
Node template requirements keyname 'occurrences' given as
'occurences'.
"""
tpl_snippet = '''
node_templates:
mysql_database:
type: tosca.nodes.Database
requirements:
- host:
node: mysql_dbms
- log_endpoint:
node: logstash
capability: log_endpoint
relationship:
type: tosca.relationships.ConnectsTo
occurences: [0, UNBOUNDED]
'''
expectedmessage = ('Requirements of template mysql_database '
'contain(s) unknown field: "occurences", refer'
' to the definition to verify valid values.')
self._single_node_template_content_test(tpl_snippet,
exception.UnknownFieldError,
expectedmessage)
def test_node_template_requirements_with_multiple_wrong_keynames(self):
"""Node templates given with multiple wrong requirements keynames."""
tpl_snippet = '''
@ -494,6 +521,98 @@ class ToscaTemplateValidationTest(TestCase):
exception.UnknownFieldError,
expectedmessage)
def test_node_template_requirements_invalid_occurrences(self):
tpl_snippet = '''
node_templates:
server:
type: tosca.nodes.Compute
requirements:
- log_endpoint:
capability: log_endpoint
occurrences: [0, -1]
'''
expectedmessage = ('Value of property "[0, -1]" is invalid.')
self._single_node_template_content_test(
tpl_snippet,
exception.InvalidPropertyValueError,
expectedmessage)
tpl_snippet = '''
node_templates:
server:
type: tosca.nodes.Compute
requirements:
- log_endpoint:
capability: log_endpoint
occurrences: [a, w]
'''
expectedmessage = ('"a" is not an integer')
self._single_node_template_content_test(
tpl_snippet,
ValueError,
expectedmessage)
tpl_snippet = '''
node_templates:
server:
type: tosca.nodes.Compute
requirements:
- log_endpoint:
capability: log_endpoint
occurrences: -1
'''
expectedmessage = ('"-1" is not a list')
self._single_node_template_content_test(
tpl_snippet,
ValueError,
expectedmessage)
tpl_snippet = '''
node_templates:
server:
type: tosca.nodes.Compute
requirements:
- log_endpoint:
capability: log_endpoint
occurrences: [5, 1]
'''
expectedmessage = ('Value of property "[5, 1]" is invalid.')
self._single_node_template_content_test(
tpl_snippet,
exception.InvalidPropertyValueError,
expectedmessage)
tpl_snippet = '''
node_templates:
server:
type: tosca.nodes.Compute
requirements:
- log_endpoint:
capability: log_endpoint
occurrences: [0, 0]
'''
expectedmessage = ('Value of property "[0, 0]" is invalid.')
self._single_node_template_content_test(
tpl_snippet,
exception.InvalidPropertyValueError,
expectedmessage)
def test_node_template_requirements_valid_occurrences(self):
tpl_snippet = '''
node_templates:
server:
type: tosca.nodes.Compute
requirements:
- log_endpoint:
capability: log_endpoint
occurrences: [2, 2]
'''
expectedmessage = ''
self._single_node_template_content_test(
tpl_snippet,
None,
expectedmessage)
def test_node_template_capabilities(self):
tpl_snippet = '''
node_templates: