Merge "Add Token class to manage token function"
This commit is contained in:
@@ -29,6 +29,7 @@ GET_PROPERTY = 'get_property'
|
|||||||
GET_ATTRIBUTE = 'get_attribute'
|
GET_ATTRIBUTE = 'get_attribute'
|
||||||
GET_INPUT = 'get_input'
|
GET_INPUT = 'get_input'
|
||||||
CONCAT = 'concat'
|
CONCAT = 'concat'
|
||||||
|
TOKEN = 'token'
|
||||||
|
|
||||||
SELF = 'SELF'
|
SELF = 'SELF'
|
||||||
HOST = 'HOST'
|
HOST = 'HOST'
|
||||||
@@ -636,11 +637,58 @@ class Concat(Function):
|
|||||||
def result(self):
|
def result(self):
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
|
||||||
|
class Token(Function):
|
||||||
|
"""Validate the function and provide an instance of the function
|
||||||
|
|
||||||
|
The token function is used within a TOSCA service template on a string to
|
||||||
|
parse out (tokenize) substrings separated by one or more token characters
|
||||||
|
within a larger string.
|
||||||
|
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
|
||||||
|
* The composite string that contains one or more substrings separated by
|
||||||
|
token characters.
|
||||||
|
* The string that contains one or more token characters that separate
|
||||||
|
substrings within the composite string.
|
||||||
|
* The integer indicates the index of the substring to return from the
|
||||||
|
composite string. Note that the first substring is denoted by using
|
||||||
|
the '0' (zero) integer value.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
[ get_attribute: [ my_server, data_endpoint, ip_address ], ':', 1 ]
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def validate(self):
|
||||||
|
if len(self.args) < 3:
|
||||||
|
ExceptionCollector.appendException(
|
||||||
|
ValueError(_('Invalid arguments for function "{0}". Expected '
|
||||||
|
'at least three arguments.').format(TOKEN)))
|
||||||
|
else:
|
||||||
|
if not isinstance(self.args[1], str) or len(self.args[1]) != 1:
|
||||||
|
ExceptionCollector.appendException(
|
||||||
|
ValueError(_('Invalid arguments for function "{0}". '
|
||||||
|
'Expected single char value as second '
|
||||||
|
'argument.').format(TOKEN)))
|
||||||
|
|
||||||
|
if not isinstance(self.args[2], int):
|
||||||
|
ExceptionCollector.appendException(
|
||||||
|
ValueError(_('Invalid arguments for function "{0}". '
|
||||||
|
'Expected integer value as third '
|
||||||
|
'argument.').format(TOKEN)))
|
||||||
|
|
||||||
|
def result(self):
|
||||||
|
return self
|
||||||
|
|
||||||
function_mappings = {
|
function_mappings = {
|
||||||
GET_PROPERTY: GetProperty,
|
GET_PROPERTY: GetProperty,
|
||||||
GET_INPUT: GetInput,
|
GET_INPUT: GetInput,
|
||||||
GET_ATTRIBUTE: GetAttribute,
|
GET_ATTRIBUTE: GetAttribute,
|
||||||
CONCAT: Concat
|
CONCAT: Concat,
|
||||||
|
TOKEN: Token
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
15
toscaparser/tests/data/functions/test_token.yaml
Normal file
15
toscaparser/tests/data/functions/test_token.yaml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
tosca_definitions_version: tosca_simple_yaml_1_0
|
||||||
|
|
||||||
|
description: Template for deploying a single server with token function.
|
||||||
|
|
||||||
|
topology_template:
|
||||||
|
node_templates:
|
||||||
|
server:
|
||||||
|
type: tosca.nodes.Compute
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
url:
|
||||||
|
description: Get the first part of the ip
|
||||||
|
value: { token: [ get_attribute: [ server, public_address ],
|
||||||
|
'.' ,
|
||||||
|
0 ] }
|
||||||
17
toscaparser/tests/data/functions/test_token_invalid.yaml
Normal file
17
toscaparser/tests/data/functions/test_token_invalid.yaml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
tosca_definitions_version: tosca_simple_yaml_1_0
|
||||||
|
|
||||||
|
description: Template for deploying a single server with invalid token function.
|
||||||
|
|
||||||
|
topology_template:
|
||||||
|
outputs:
|
||||||
|
invalid_token_syntax_1:
|
||||||
|
description: test token with only two paremeters.
|
||||||
|
value: { token: ["some_string", "_"]}
|
||||||
|
|
||||||
|
invalid_token_syntax_2:
|
||||||
|
description: test token with invalid string as third argument.
|
||||||
|
value: { token: ["some_string", "_", "1"]}
|
||||||
|
|
||||||
|
invalid_token_syntax_3:
|
||||||
|
description: test token with invalid string as second argument.
|
||||||
|
value: { token: ["some_string", "aa", "1"]}
|
||||||
@@ -323,3 +323,34 @@ class ConcatTest(TestCase):
|
|||||||
ValueError,
|
ValueError,
|
||||||
_('Invalid arguments for function "concat". Expected at least '
|
_('Invalid arguments for function "concat". Expected at least '
|
||||||
'one arguments.'))
|
'one arguments.'))
|
||||||
|
|
||||||
|
|
||||||
|
class TokenTest(TestCase):
|
||||||
|
|
||||||
|
def _load_template(self, filename):
|
||||||
|
return ToscaTemplate(os.path.join(
|
||||||
|
os.path.dirname(os.path.abspath(__file__)),
|
||||||
|
filename))
|
||||||
|
|
||||||
|
def test_validate_token(self):
|
||||||
|
tosca = self._load_template("data/functions/test_token.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.Token)
|
||||||
|
|
||||||
|
self.assertRaises(exception.ValidationError, self._load_template,
|
||||||
|
'data/functions/test_token_invalid.yaml')
|
||||||
|
exception.ExceptionCollector.assertExceptionMessage(
|
||||||
|
ValueError,
|
||||||
|
_('Invalid arguments for function "token". Expected at least '
|
||||||
|
'three arguments.'))
|
||||||
|
exception.ExceptionCollector.assertExceptionMessage(
|
||||||
|
ValueError,
|
||||||
|
_('Invalid arguments for function "token". Expected '
|
||||||
|
'integer value as third argument.'))
|
||||||
|
exception.ExceptionCollector.assertExceptionMessage(
|
||||||
|
ValueError,
|
||||||
|
_('Invalid arguments for function "token". Expected '
|
||||||
|
'single char value as second argument.'))
|
||||||
|
|||||||
Reference in New Issue
Block a user