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

View File

@ -13,8 +13,10 @@
import logging import logging
from toscaparser.common.exception import InvalidPropertyValueError
from toscaparser.common.exception import TypeMismatchError from toscaparser.common.exception import TypeMismatchError
from toscaparser.common.exception import UnknownFieldError from toscaparser.common.exception import UnknownFieldError
from toscaparser.dataentity import DataEntity
from toscaparser.elements.interfaces import CONFIGURE from toscaparser.elements.interfaces import CONFIGURE
from toscaparser.elements.interfaces import CONFIGURE_SHORTNAME from toscaparser.elements.interfaces import CONFIGURE_SHORTNAME
from toscaparser.elements.interfaces import InterfacesDef from toscaparser.elements.interfaces import InterfacesDef
@ -180,9 +182,28 @@ class NodeTemplate(EntityTemplate):
for r1, value in req.items(): for r1, value in req.items():
if isinstance(value, dict): if isinstance(value, dict):
self._validate_requirements_keys(value) self._validate_requirements_keys(value)
self._validate_requirements_properties(value)
allowed_reqs.append(r1) 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 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): def _validate_requirements_keys(self, requirement):
for key in requirement.keys(): for key in requirement.keys():
if key not in self.REQUIREMENTS_SECTION: if key not in self.REQUIREMENTS_SECTION:

View File

@ -450,6 +450,33 @@ class ToscaTemplateValidationTest(TestCase):
exception.UnknownFieldError, exception.UnknownFieldError,
expectedmessage) 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): def test_node_template_requirements_with_multiple_wrong_keynames(self):
"""Node templates given with multiple wrong requirements keynames.""" """Node templates given with multiple wrong requirements keynames."""
tpl_snippet = ''' tpl_snippet = '''
@ -494,6 +521,98 @@ class ToscaTemplateValidationTest(TestCase):
exception.UnknownFieldError, exception.UnknownFieldError,
expectedmessage) 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): def test_node_template_capabilities(self):
tpl_snippet = ''' tpl_snippet = '''
node_templates: node_templates: