Create concat function and provide validation

Create concat function to validat the concat function specified in the
template.

Change-Id: I25385f6c7555755b5a0cc6913b9fcedaf2559492
Partially-Implements: tosca-intrinsic-functions
This commit is contained in:
Sahdev Zala
2016-03-14 20:57:57 -07:00
parent 3890832640
commit c5151ed2f6
4 changed files with 93 additions and 1 deletions

View File

@@ -26,6 +26,7 @@ from toscaparser.utils.gettextutils import _
GET_PROPERTY = 'get_property'
GET_ATTRIBUTE = 'get_attribute'
GET_INPUT = 'get_input'
CONCAT = 'concat'
SELF = 'SELF'
HOST = 'HOST'
@@ -522,10 +523,39 @@ class GetProperty(Function):
return None
class Concat(Function):
"""Validate the function and provide an instance of the function
Concatenation of values are supposed to be produced at runtime and
therefore its the responsibility of the TOSCA engine to implement the
evaluation of Concat functions.
Arguments:
* List of strings that needs to be concatenated
Example:
[ 'http://',
get_attribute: [ server, public_address ],
':' ,
get_attribute: [ server, port ] ]
"""
def validate(self):
if len(self.args) < 1:
ExceptionCollector.appendException(
ValueError(_('Invalid arguments for function "{0}". Expected '
'at least one arguments.').format(CONCAT)))
def result(self):
return self
function_mappings = {
GET_PROPERTY: GetProperty,
GET_INPUT: GetInput,
GET_ATTRIBUTE: GetAttribute
GET_ATTRIBUTE: GetAttribute,
CONCAT: Concat
}

View File

@@ -0,0 +1,30 @@
tosca_definitions_version: tosca_simple_yaml_1_0
description: Template for deploying a single server with concat function.
topology_template:
node_templates:
server:
type: tosca.nodes.Compute
capabilities:
# Host container properties
host:
properties:
num_cpus: 2
disk_size: 10 GB
mem_size: 512 MB
# Guest Operating System properties
os:
properties:
# host Operating System image properties
architecture: x86_64
type: Linux
distribution: RHEL
version: 6.5
outputs:
url:
description: Concatenate the URL for a server from template values.
value: { concat: [ 'http://',
get_attribute: [ server, public_address ],
':' ,
get_attribute: [ server, port ] ] }

View File

@@ -0,0 +1,9 @@
tosca_definitions_version: tosca_simple_yaml_1_0
description: Template for deploying a single server with invalid concat function.
topology_template:
outputs:
invalid_concat_syntax:
description: test concat with invalid syntax.
value: { concat: []}

View File

@@ -299,3 +299,26 @@ class GetAttributeTest(TestCase):
self.assertTrue(isinstance(target_test, functions.GetAttribute))
source_port = operation.inputs['source_port']
self.assertTrue(isinstance(source_port, functions.GetAttribute))
class ConcatTest(TestCase):
def _load_template(self, filename):
return ToscaTemplate(os.path.join(
os.path.dirname(os.path.abspath(__file__)),
filename))
def test_validate_concat(self):
tosca = self._load_template("data/functions/test_concat.yaml")
server_url_output = [
output for output in tosca.outputs if output.name == 'url'][0]
func = functions.get_function(self, tosca.outputs,
server_url_output.value)
self.assertIsInstance(func, functions.Concat)
self.assertRaises(exception.ValidationError, self._load_template,
'data/functions/test_concat_invalid.yaml')
exception.ExceptionCollector.assertExceptionMessage(
ValueError,
_('Invalid arguments for function "concat". Expected at least '
'one arguments.'))