added _validate_capabilities_properties function & UT

added _common_validate_properties function. It
validates properties of nodes & capabilities properties

added validating capability properties values in
_validate_capabilities_properties function & UT case.

Change-Id: I8709085738e82739d2cd46e1f7c5d8d4f033e806
Partially-Implements: blueprint tosca-capabilities-scalable
This commit is contained in:
srinivas_tadepalli 2015-03-10 16:20:05 +05:30
parent c3be3aa78e
commit 8761ac5631
3 changed files with 123 additions and 13 deletions

View File

@ -13,6 +13,7 @@
from translator.toscalib.capabilities import Capability
from translator.toscalib.common.exception import MissingRequiredFieldError
from translator.toscalib.common.exception import UnknownFieldError
from translator.toscalib.common.exception import ValidationError
from translator.toscalib.elements.interfaces import InterfacesDef
from translator.toscalib.elements.nodetype import NodeType
from translator.toscalib.elements.relationshiptype import RelationshipType
@ -87,6 +88,47 @@ class EntityTemplate(object):
def _validate_properties(self, template, entitytype):
properties = entitytype.get_value(self.PROPERTIES, template)
self._common_validate_properties(entitytype, properties)
def _validate_capabilities(self):
type_capabilities = self.type_definition.capabilities
allowed_caps = []
if type_capabilities:
for tcap in type_capabilities:
allowed_caps.append(tcap.name)
capabilities = self.type_definition.get_value(self.CAPABILITIES,
self.entity_tpl)
if capabilities:
self._common_validate_field(capabilities, allowed_caps,
'Capabilities')
self._validate_capabilities_properties(capabilities)
def _validate_capabilities_properties(self, capabilities):
for cap, props in capabilities.items():
capabilitydef = self.get_capability(cap).definition
self._common_validate_properties(capabilitydef,
props[self.PROPERTIES])
#validating capability properties values
for prop in self.get_capability(cap).properties:
prop.validate()
#TODO(srinivas_tadepalli): temporary work around to validate
# default_instances until standardized in specification
if cap == "scalable" and prop.name == "default_instances":
prop_dict = props[self.PROPERTIES]
min_instances = prop_dict.get("min_instances")
max_instances = prop_dict.get("max_instances")
default_instances = prop_dict.get("default_instances")
if not (min_instances <= default_instances
<= max_instances):
err_msg = ("Properties of template %s : "
"default_instances value is not"
" between min_instances and "
"max_instances" % self.name)
raise ValidationError(message=err_msg)
def _common_validate_properties(self, entitytype, properties):
allowed_props = []
required_props = []
for p in entitytype.properties_def:
@ -111,18 +153,6 @@ class EntityTemplate(object):
what='Properties of template %s' % self.name,
required=missingprop)
def _validate_capabilities(self):
type_capabilities = self.type_definition.capabilities
allowed_caps = []
if type_capabilities:
for tcap in type_capabilities:
allowed_caps.append(tcap.name)
capabilities = self.type_definition.get_value(self.CAPABILITIES,
self.entity_tpl)
if capabilities:
self._common_validate_field(capabilities, allowed_caps,
'Capabilities')
def _validate_field(self, template):
if not isinstance(template, dict):
raise MissingRequiredFieldError(

View File

@ -93,7 +93,7 @@ node_templates:
capabilities:
search_endpoint:
properties:
search_api_port: { get_input: search_api_port }
port: { get_input: search_api_port }
kibana:
type: tosca.nodes.SoftwareComponent.Kibana
requirements:

View File

@ -426,3 +426,83 @@ class ToscaTemplateValidationTest(TestCase):
ex_err_msg = ('The template version "tosca_xyz" is invalid. '
'The valid versions are: "%s"' % valid_versions)
self.assertEqual(six.text_type(err), ex_err_msg)
def test_node_template_capabilities_properties(self):
tpl_snippet = '''
node_templates:
server:
type: tosca.nodes.Compute
properties:
# compute properties (flavor)
disk_size: 10
num_cpus: { get_input: cpus }
mem_size: 4096
capabilities:
os:
properties:
architecture: x86_64
type: Linux
distribution: Fedora
version: 18
scalable:
properties:
min_instances: 1
default_instances: 5
'''
expectedmessage = ('Properties of template server is missing '
'required field: '
'"[\'max_instances\']".')
self._single_node_template_content_test(
tpl_snippet,
exception.MissingRequiredFieldError,
expectedmessage)
# validatating capability property values
tpl_snippet = '''
node_templates:
server:
type: tosca.nodes.WebServer
capabilities:
http_endpoint:
properties:
initiator: test
'''
expectedmessage = ('initiator: test is not an valid value '
'"[source, target, peer]".')
self._single_node_template_content_test(
tpl_snippet,
exception.ValidationError,
expectedmessage)
tpl_snippet = '''
node_templates:
server:
type: tosca.nodes.Compute
properties:
# compute properties (flavor)
disk_size: 10
num_cpus: { get_input: cpus }
mem_size: 4096
capabilities:
os:
properties:
architecture: x86_64
type: Linux
distribution: Fedora
version: 18
scalable:
properties:
min_instances: 1
max_instances: 3
default_instances: 5
'''
expectedmessage = ('Properties of template server : '
'default_instances value is not between'
' min_instances and max_instances')
self._single_node_template_content_test(
tpl_snippet,
exception.ValidationError,
expectedmessage)