Changing YAQL syntax delimeters

* Inline YAQL delimeters are changed on '<%' and '%>'

Implements blueprint yaql-delimiters

Change-Id: I31fbf5175d10684e7799e835d175517d2dadab9b
This commit is contained in:
Nikolay Mahotkin 2015-02-20 14:58:50 +03:00
parent 32d09b5aca
commit b4a7ebeb01
49 changed files with 318 additions and 307 deletions

View File

@ -76,12 +76,13 @@ class YAQLEvaluator(Evaluator):
return isinstance(s, six.string_types)
INLINE_YAQL_REGEXP = '<%.*?%>'
class InlineYAQLEvaluator(YAQLEvaluator):
# This regular expression will look for multiple occurrences of YAQL
# expressions in between curly braces (i.e. {any_symbols_except'}'})
# within a string.
regex_yaql_expr = '(\{[^\s][^}]*\})'
find_expression_pattern = re.compile(regex_yaql_expr)
# expressions in '<% %>' (i.e. <% any_symbols %>) within a string.
find_expression_pattern = re.compile(INLINE_YAQL_REGEXP)
@classmethod
def evaluate(cls, expression, data_context):
@ -94,7 +95,7 @@ class InlineYAQLEvaluator(YAQLEvaluator):
found_expressions = cls.find_inline_expressions(expression)
if found_expressions:
for expr in found_expressions:
trim_expr = expr.strip("{}")
trim_expr = expr.strip("<%>")
evaluated = super(InlineYAQLEvaluator,
cls).evaluate(trim_expr, data_context)
if len(expression) == len(expr):

View File

@ -6,16 +6,16 @@ greeting:
tags: [hello]
base: std.echo
base-input:
output: 'Hello, {$.name}'
output: 'Hello, <% $.name %>'
input:
- name
output:
string: "{$.output}"
string: <% $.output %>
farewell:
base: std.echo
base-input:
output: 'Bye!'
output:
info: "{$.output}"
info: <% $.output %>

View File

@ -4,7 +4,7 @@ Namespaces:
base-parameters:
method: GET
headers:
X-Auth-Token: "{$.auth_token}"
X-Auth-Token: <% $.auth_token %>
actions:
async-action:

View File

@ -4,7 +4,7 @@ Namespaces:
base-parameters:
method: GET
headers:
X-Auth-Token: "{$.auth_token}"
X-Auth-Token: <% $.auth_token %>
actions:
create-vm:

View File

@ -6,7 +6,7 @@ Namespaces:
base-parameters:
url: http://path_to_nova/url_for_create
output:
vm_id: "{$.base_output.server_id}"
vm_id: <% $.base_output.server_id %>
Workflow:
tasks:

View File

@ -4,12 +4,12 @@ Namespaces:
concat:
class: std.echo
base-parameters:
output: '{$.left} {$.right}'
output: '<% $.left %> <% $.right %>'
parameters:
- left
- right
output:
string: "{$.output}"
string: <% $.output %>
Workflow:
tasks:

View File

@ -4,18 +4,18 @@ Namespaces:
concat:
class: std.echo
base-parameters:
output: '{$.left} {$.right}'
output: '<% $.left %> <% $.right %>'
parameters:
- left
- right
output:
string: "{$.output}"
string: <% $.output %>
start:
class: std.echo
base-parameters:
output: 'Starting...'
output:
info: "{$.output}"
info: <% $.output %>
Workflow:
tasks:
@ -31,4 +31,4 @@ Workflow:
action: MyActions.concat
parameters:
left: Greetings
right: "{$.string}"
right: <% $.string %>

View File

@ -7,12 +7,12 @@ Namespaces:
concat:
class: std.echo
base-parameters:
output: '{$.left} {$.right}'
output: '<% $.left %> <% $.right %>'
parameters:
- left
- right
output:
string: "{$}"
string: <% $ %>
Workflow:
# context = {
@ -31,32 +31,32 @@ Workflow:
build_full_name:
action: MyService.concat
parameters:
left: "{$.person.first_name}"
right: "{$.person.last_name}"
left: <% $.person.first_name %>
right: <% $.person.last_name %>
publish:
full_name: "{$.string}"
full_name: <% $.string %>
build_greeting:
requires: [build_full_name]
action: MyService.concat
parameters:
left: Dear
right: "{$.full_name}"
right: <% $.full_name %>
publish:
greeting: "{$.string}"
greeting: <% $.string %>
build_address:
requires: [build_full_name]
action: MyService.concat
parameters:
left: To
right: "{$.full_name}"
right: <% $.full_name %>
publish:
address: "{$.string}"
address: <% $.string %>
send_greeting:
requires: [build_address, build_greeting]
action: MyService.concat
parameters:
left: '{$.address}.'
right: '{$.greeting},..'
left: '<% $.address %>.'
right: '<% $.greeting %>,..'

View File

@ -7,19 +7,19 @@ Namespaces:
build_full_name:
class: std.echo
base-parameters:
output: '{$.first_name} {$.last_name}'
output: '<% $.first_name %> <% $.last_name %>'
parameters:
- first_name
- last_name
output:
full_name: "{$}"
full_name: <% $ %>
build_greeting:
class: std.echo
base-parameters:
output: Cheers!
output:
greeting: "{$}"
greeting: <% $ %>
send_greeting:
class: std.echo
@ -29,7 +29,7 @@ Namespaces:
- f_name
- greet_msg
output:
greeting_sent: "{$}"
greeting_sent: <% $ %>
Workflow:
# context = {
@ -48,20 +48,20 @@ Workflow:
build_full_name:
action: MyService.build_full_name
parameters:
first_name: "{$.person.first_name}"
last_name: "{$.person.last_name}"
first_name: <% $.person.first_name %>
last_name: <% $.person.last_name %>
publish:
f_name: "{$.full_name}"
f_name: <% $.full_name %>
build_greeting:
requires: [build_full_name]
action: MyService.build_greeting
publish:
greet_msg: "{$.greeting}"
greet_msg: <% $.greeting %>
send_greeting:
requires: [build_full_name, build_greeting]
action: MyService.send_greeting
parameters:
f_name: "{$.f_name}"
greet_msg: "{$.greet_msg}"
f_name: <% $.f_name %>
greet_msg: <% $.greet_msg %>

View File

@ -7,21 +7,21 @@ Namespaces:
build_full_name:
class: std.echo
base-parameters:
output: '{$.first_name} {$.last_name}'
output: '<% $.first_name %> <% $.last_name %>'
parameters:
- first_name
- last_name
output:
full_name: "{$}"
full_name: <% $ %>
build_greeting:
class: std.echo
base-parameters:
output: 'Hello, {$.full_name}!'
output: 'Hello, <% $.full_name %>!'
parameters:
- full_name
output:
greeting: "{$}"
greeting: <% $ %>
send_greeting:
class: std.echo
@ -30,7 +30,7 @@ Namespaces:
parameters:
- greeting
output:
greeting_sent: "{$}"
greeting_sent: <% $ %>
Workflow:
@ -50,23 +50,23 @@ Workflow:
build_full_name:
action: MyService.build_full_name
parameters:
first_name: "{$.person.first_name}"
last_name: "{$.person.last_name}"
first_name: <% $.person.first_name %>
last_name: <% $.person.last_name %>
publish:
f_name: "{$.full_name}"
f_name: <% $.full_name %>
on-success: build_greeting
build_greeting:
action: MyService.build_greeting
parameters:
full_name: "{$.f_name}"
full_name: <% $.f_name %>
publish:
greet_msg: "{$.greeting}"
greet_msg: <% $.greeting %>
on-success: send_greeting
send_greeting:
action: MyService.send_greeting
parameters:
greeting: "{$.task.build_greeting.greeting}"
greeting: <% $.task.build_greeting.greeting %>
publish:
sent: "{$.greeting_sent}"
sent: <% $.greeting_sent %>

View File

@ -7,21 +7,21 @@ Namespaces:
build_full_name:
class: std.echo
base-parameters:
output: '{$.first_name} {$.last_name}'
output: '<% $.first_name %> <% $.last_name %>'
parameters:
- first_name
- last_name
output:
full_name: "{$}"
full_name: <% $ %>
build_greeting:
class: std.echo
base-parameters:
output: 'Hello, {$.full_name}!'
output: 'Hello, <% $.full_name %>!'
parameters:
- full_name
output:
greeting: "{$}"
greeting: <% $ %>
Workflow:
@ -41,13 +41,13 @@ Workflow:
build_full_name:
action: MyService.build_full_name
parameters:
first_name: "{$.person.first_name}"
last_name: "{$.person.last_name}"
first_name: <% $.person.first_name %>
last_name: <% $.person.last_name %>
publish:
f_name: "{$.full_name}"
f_name: <% $.full_name %>
build_greeting:
requires: [build_full_name]
action: MyService.build_greeting
parameters:
full_name: "{$.f_name}"
full_name: <% $.f_name %>

View File

@ -7,22 +7,22 @@ Namespaces:
build_full_name:
class: std.echo
base-parameters:
output: '{$.first_name} {$.last_name}'
output: '<% $.first_name %> <% $.last_name %>'
parameters:
- first_name
- last_name
output:
full_name: "{$}"
full_name: <% $ %>
build_greeting:
class: std.echo
base-parameters:
output: 'Hello, {$.full_name}!'
output: 'Hello, <% $.full_name %>!'
parameters:
- full_name
output:
greeting:
greet_message: "{$}"
greet_message: <% $ %>
Workflow:
@ -42,15 +42,15 @@ Workflow:
build_full_name:
action: MyService.build_full_name
parameters:
first_name: "{$.person.first_name}"
last_name: "{$.person.last_name}"
first_name: <% $.person.first_name %>
last_name: <% $.person.last_name %>
publish:
f_name: "{$.full_name}"
f_name: <% $.full_name %>
on-success: build_greeting
build_greeting:
action: MyService.build_greeting
parameters:
full_name: "{$.f_name}"
full_name: <% $.f_name %>
publish:
greet_msg: "{$.greeting}"
greet_msg: <% $.greeting %>

View File

@ -9,7 +9,7 @@ workflows:
catalog:
action: keystone.service_catalog_get_data
publish:
result: "{$.catalog}"
result: <% $.catalog %>
nova:
type: direct
@ -17,7 +17,7 @@ workflows:
networks_list:
action: nova.networks_list
publish:
result: "{$.networks_list}"
result: <% $.networks_list %>
glance:
type: direct
@ -25,7 +25,7 @@ workflows:
images_list:
action: glance.images_list
publish:
result: "{$.images_list}"
result: <% $.images_list %>
heat:
type: direct
@ -33,7 +33,7 @@ workflows:
stacks_list:
action: heat.stacks_list
publish:
result: "{$.stacks_list}"
result: <% $.stacks_list %>
neutron:
type: direct
@ -41,7 +41,7 @@ workflows:
list_subnets:
action: neutron.list_subnets
publish:
result: "{$.list_subnets}"
result: <% $.list_subnets %>
cinder:
type: direct
@ -49,5 +49,5 @@ workflows:
volumes_list:
action: cinder.volumes_list
publish:
result: "{$.volumes_list}"
result: <% $.volumes_list %>

View File

@ -3,13 +3,13 @@ Workflow:
image_list:
action: glance.images_list
publish:
image_id: "{$[0].id}"
image_id: <% $[0].id %>
on-success: image_get
image_get:
action: glance.images_get
parameters:
image_id: "{$.image_id}"
image_id: <% $.image_id %>
publish:
image_id: "{$.id}"
image_name: "{$.name}"
image_id: <% $.id %>
image_name: <% $.name %>

View File

@ -3,4 +3,4 @@ Workflow:
get_some_endpoint:
action: keystone.service_catalog_get_data
publish:
endpoint_url: "{$[0].endpoints[0].url}"
endpoint_url: <% $[0].endpoints[0].url %>

View File

@ -3,17 +3,17 @@ Workflow:
server_create:
action: nova.servers_create
parameters:
name: "{$.server_name}"
image: "{$.image_ref}"
flavor: "{$.flavor_ref}"
name: <% $.server_name %>
image: <% $.image_ref %>
flavor: <% $.flavor_ref %>
publish:
server_id: "{$.id}"
server_id: <% $.id %>
on-success: check_server_exists
check_server_exists:
action: nova.servers_get
parameters:
server: "{$.server_id}"
server: <% $.server_id %>
publish:
server_exists: True
on-success:
@ -25,7 +25,7 @@ Workflow:
delay: 5
count: 15
parameters:
id: "{$.server_id}"
id: <% $.server_id %>
status: 'ACTIVE'
publish:
instance_id: "{$.id}"
instance_id: <% $.id %>

View File

@ -7,7 +7,7 @@ Namespaces:
url: http://path_to_service/action_url
method: GET
output:
output: "{$}"
output: <% $ %>
Workflow:
tasks:

View File

@ -7,7 +7,7 @@ Namespaces:
url: http://path_to_service/action_url
method: GET
output:
output: "{$}"
output: <% $ %>
Workflow:
tasks:
@ -16,4 +16,4 @@ Workflow:
retry:
count: 5
publish:
rt_output: "{$.output}"
rt_output: <% $.output %>

View File

@ -6,7 +6,7 @@ Namespaces:
base-parameters:
output: Cheers!
output:
greeting: "{$}"
greeting: <% $ %>
Workflow:
tasks:
@ -15,4 +15,4 @@ Workflow:
retry:
count: 5
publish:
st_output: "{$.greeting}"
st_output: <% $.greeting %>

View File

@ -7,14 +7,14 @@ Namespaces:
url: http://path_to_service/action_url
method: GET
output:
output: "{$}"
output: <% $ %>
Workflow:
tasks:
no_retry_task:
action: MyService.some-action
publish:
n_rt_output: "{$.output}"
n_rt_output: <% $.output %>
on-success: delay_retry_task
delay_retry_task:

View File

@ -4,7 +4,7 @@ Namespaces:
base-parameters:
method: GET
headers:
X-Auth-Token: "{$.auth_token}"
X-Auth-Token: <% $.auth_token %>
actions:
create-vm:
@ -21,12 +21,12 @@ Namespaces:
concat:
class: std.echo
base-parameters:
output: '{$.left} {$.right}'
output: '<% $.left %> <% $.right %>'
parameters:
- left
- right
output:
string: "{$}"
string: <% $ %>
Workflow:
tasks:
@ -43,7 +43,7 @@ Workflow:
left: workflow
right: is
publish:
result2: "{$.string}"
result2: <% $.string %>
on-finish: task3
task3:
@ -56,8 +56,8 @@ Workflow:
task4:
action: Echo.concat
parameters:
left: "{$.result2}"
left: <% $.result2 %>
right: complete!
publish:
result4: "{$.string}"
result4: <% $.string %>

View File

@ -4,12 +4,12 @@ Namespaces:
concat:
class: std.echo
base-parameters:
output: '{$.left} {$.right}'
output: '<% $.left %> <% $.right %>'
parameters:
- left
- right
output:
string: "{$}"
string: <% $ %>
Workflow:
tasks:
@ -19,22 +19,22 @@ Workflow:
left: workflow
right: is
publish:
result1: "{$.string}"
result1: <% $.string %>
task2:
requires: [task1]
action: MyService.concat
parameters:
left: "{$.result1}"
left: <% $.result1 %>
right: complete
publish:
result2: "{$.string}"
result2: <% $.string %>
on-success: task3
task3:
action: MyService.concat
parameters:
left: "{$.result2}"
left: <% $.result2 %>
right: '!'
publish:
result3: "{$.string}"
result3: <% $.string %>

View File

@ -10,4 +10,4 @@ workflows:
hello:
action: std.echo output="Hello"
publish:
result: "{$.hello}"
result: <% $.hello %>

View File

@ -10,7 +10,7 @@ wf:
policies:
wait-before: 1
publish:
result: "{$.hello}"
result: <% $.hello %>
wf1:
type: reverse
@ -21,9 +21,9 @@ wf1:
addressee:
action: std.echo output="John"
publish:
name: "{$.adressee}"
name: <% $.adressee %>
goodbye:
action: std.echo output="{$.farewell}, {$.name}"
action: std.echo output="<% $.farewell %>, <% $.name %>"
requires: [addressee]

View File

@ -64,11 +64,11 @@ DB_TASK_ADHOC = {
'namespace': 'my_namespace',
'class': 'std.echo',
'base-parameters': {
'output': '{$.first} and {$.second}'
'output': '<% $.first %> and <% $.second %>'
},
'parameters': ['first', 'second'],
'output': {
'res': '{$}'
'res': '<% $ %>'
}
},
'name': 'my_task',

View File

@ -46,11 +46,11 @@ TASK = {
'action': 'std.echo',
'parameters': {
'p1': 'My string',
'p2': '{$.param3.param32}',
'p2': '<% $.param3.param32 %>',
'p3': ''
},
'publish': {
'new_key11': '{$.new_key1}'
'new_key11': '<% $.new_key1 %>'
}
},
'in_context': CONTEXT
@ -66,7 +66,7 @@ WORKBOOK = {
'thing': {
'class': 'std.echo',
'base-parameters': {
'output': '{$.p1} {$.p2}'
'output': '<% $.p1 %> <% $.p2 %>'
}
}
}

View File

@ -46,7 +46,7 @@ workflows:
input:
url: https://wiki.openstack.org/wiki/mistral
publish:
result: $
result: <% $ %>
"""

View File

@ -52,7 +52,7 @@ wf1:
task1:
action: std.http url="https://api.library.org/books"
publish:
result: "{$}"
result: <% $ %>
"""
WORKFLOW2 = """
@ -64,7 +64,7 @@ wf2:
task1:
action: std.http url="https://api.library.org/books" timeout=60
publish:
result: "{$}"
result: <% $ %>
"""
WORKFLOW1_WITH_ITEMS = """
@ -76,10 +76,10 @@ wf1_with_items:
- links
tasks:
task1:
with-items: link in {$.links}
action: std.http url={$.link}
with-items: link in <% $.links %>
action: std.http url=<% $.link %>
publish:
result: "{$}"
result: <% $ %>
"""
WORKFLOW2_WITH_ITEMS = """
@ -91,10 +91,10 @@ wf2_with_items:
- links
tasks:
task1:
with-items: link in {$.links}
action: std.http url={$.link} timeout=60
with-items: link in <% $.links %>
action: std.http url=<% $.link %> timeout=60
publish:
result: "{$}"
result: <% $ %>
"""

View File

@ -36,11 +36,11 @@ actions:
concat_twice:
base: std.echo
base-input:
output: "{$.s1}+{$.s2}"
output: "<% $.s1 %>+<% $.s2 %>"
input:
- s1
- s2
output: "{$} and {$}"
output: "<% $ %> and <% $ %>"
workflows:
wf1:
@ -49,14 +49,14 @@ workflows:
- str1
- str2
output:
workflow_result: "{$.result}" # Access to execution context variables
concat_task_result: "{$.concat}" # Access to the same but via task name
workflow_result: <% $.result %> # Access to execution context variables
concat_task_result: <% $.concat %> # Access to the same but via task name
tasks:
concat:
action: concat_twice s1={$.str1} s2={$.str2}
action: concat_twice s1=<% $.str1 %> s2=<% $.str2 %>
publish:
result: "{$.concat}"
result: <% $.concat %>
"""

View File

@ -43,9 +43,9 @@ workflows:
task1:
action: std.echo output='1'
on-complete:
- fail: "{$.my_var = 1}"
- succeed: "{$.my_var = 2}"
- pause: "{$.my_var = 3}"
- fail: <% $.my_var = 1 %>
- succeed: <% $.my_var = 2 %>
- pause: <% $.my_var = 3 %>
- task2
task2:
@ -116,11 +116,11 @@ workflows:
task-defaults:
on-complete:
- fail: "{$.my_var = 1}"
- succeed: "{$.my_var = 2}"
- pause: "{$.my_var = 3}"
- rollback: "{$.my_var = 3}"
- task2: "{$.my_var = 4}" # (Never happens in this test)
- fail: <% $.my_var = 1 %>
- succeed: <% $.my_var = 2 %>
- pause: <% $.my_var = 3 %>
- rollback: <% $.my_var = 3 %>
- task2: <% $.my_var = 4 %> # (Never happens in this test)
tasks:
task1:

View File

@ -42,20 +42,20 @@ wf:
task1:
action: std.echo output="Hi"
publish:
hi: "{$.task1}"
hi: <% $.task1 %>
on-success:
- task2
task2:
action: std.echo output="Morpheus"
publish:
to: "{$.task2}"
to: <% $.task2 %>
on-success:
- task3
task3:
publish:
result: "{$.hi}, {$.to}! Sincerely, your {$.__env.from}."
result: "<% $.hi %>, <% $.to %>! Sincerely, your <% $.__env.from %>."
"""
PARALLEL_TASKS_WF = """
@ -69,12 +69,12 @@ wf:
task1:
action: std.echo output=1
publish:
var1: "{$.task1}"
var1: <% $.task1 %>
task2:
action: std.echo output=2
publish:
var2: "{$.task2}"
var2: <% $.task2 %>
"""
PARALLEL_TASKS_COMPLEX_WF = """
@ -136,27 +136,27 @@ wf:
task1:
action: std.echo output="Hi"
publish:
greeting: "{$.task1}"
greeting: <% $.task1 %>
on-success:
- task2
task2:
action: std.echo output="Yo"
publish:
greeting: "{$.task2}"
greeting: <% $.task2 %>
on-success:
- task3
task3:
action: std.echo output="Morpheus"
publish:
to: "{$.task3}"
to: <% $.task3 %>
on-success:
- task4
task4:
publish:
result: "{$.greeting}, {$.to}! Sincerely, your {$.__env.from}."
result: "<% $.greeting %>, <% $.to %>! Your <% $.__env.from %>."
"""
@ -294,7 +294,7 @@ class DataFlowEngineTest(engine_test_base.EngineTestCase):
self.assertDictEqual({'greeting': 'Yo'}, task2.result)
self.assertDictEqual({'to': 'Morpheus'}, task3.result)
self.assertDictEqual(
{'result': 'Yo, Morpheus! Sincerely, your Neo.'},
{'result': 'Yo, Morpheus! Your Neo.'},
task4.result
)
@ -340,9 +340,9 @@ class DataFlowTest(test_base.BaseTest):
action_output = {'akey': 'adata'}
publish = {
'v': '{$.var}',
'e': '{$.__env.ekey}',
'a': '{$.task1.akey}'
'v': '<% $.var %>',
'e': '<% $.__env.ekey %>',
'a': '<% $.task1.akey %>'
}
task_db = models.Task(name='task1')
@ -375,7 +375,7 @@ class DataFlowTest(test_base.BaseTest):
Expected to get action error.
"""
publish = {'foo': '{$.akey}'}
publish = {'foo': '<% $.akey %>'}
action_output = 'error data'
task_db = models.Task(name='task1')

View File

@ -52,12 +52,12 @@ workflows:
tasks:
task1:
action: std.echo output="{$.param1}"
action: std.echo output=<% $.param1 %>
publish:
result: "{$.task1}"
result: <% $.task1 %>
task2:
action: std.echo output="{$.param2}"
action: std.echo output=<% $.param2 %>
requires: [task1]
"""
@ -137,7 +137,10 @@ class DefaultEngineTest(base.DbTestCase):
self.assertDictEqual({'output': 'Hey'}, task_db.input)
def test_start_workflow_with_adhoc_env(self):
wf_input = {'param1': '{$.__env.key1}', 'param2': '{$.__env.key2}'}
wf_input = {
'param1': '<% $.__env.key1 %>',
'param2': '<% $.__env.key2 %>'
}
env = ENVIRONMENT['variables']
# Start workflow.
@ -155,7 +158,10 @@ class DefaultEngineTest(base.DbTestCase):
@mock.patch.object(db_api, "get_environment", MOCK_ENVIRONMENT)
def test_start_workflow_with_saved_env(self):
wf_input = {'param1': '{$.__env.key1}', 'param2': '{$.__env.key2}'}
wf_input = {
'param1': '<% $.__env.key1 %>',
'param2': '<% $.__env.key2 %>'
}
env = ENVIRONMENT['variables']
# Start workflow.
@ -176,7 +182,7 @@ class DefaultEngineTest(base.DbTestCase):
self.assertRaises(exc.NotFoundException,
self.engine.start_workflow,
'wb.wf1',
{'param1': '{$.__env.key1}'},
{'param1': '<% $.__env.key1 %>'},
env='foo',
task_name='task2')
@ -184,7 +190,7 @@ class DefaultEngineTest(base.DbTestCase):
self.assertRaises(ValueError,
self.engine.start_workflow,
'wb.wf1',
{'param1': '{$.__env.key1}'},
{'param1': '<% $.__env.key1 %>'},
env=True,
task_name='task2')

View File

@ -203,12 +203,12 @@ class DirectWorkflowEngineTest(base.EngineTestCase):
tasks:
task1:
action: std.echo output="Echo"
# publish: {wrong yaql}
# publish: <% wrong yaql %>
on-complete:
- task2
task2:
action: std.echo output="{wrong yaql}"
action: std.echo output=<% wrong yaql %>
"""
exec_db = self._run_workflow(WORKFLOW_MESSED_YAQL)
@ -222,7 +222,7 @@ class DirectWorkflowEngineTest(base.EngineTestCase):
type: direct
tasks:
task1:
action: std.echo output="{wrong(yaql)}"
action: std.echo output=<% wrong(yaql) %>
"""
wf_service.create_workflows(WORKFLOW_MESSED_YAQL_IN_FIRST_TASK)

View File

@ -46,37 +46,37 @@ workflows:
- param2
output:
final_result: "{$.final_result}"
final_result: <% $.final_result %>
tasks:
task1:
action: std.echo output='{$.param1}'
target: "{$.__env.var1}"
action: std.echo output=<% $.param1 %>
target: <% $.__env.var1 %>
publish:
result1: "{$.task1}"
result1: <% $.task1 %>
task2:
requires: [task1]
action: std.echo output="'{$.result1} & {$.param2}'"
target: "{$.__env.var1}"
action: std.echo output="'<% $.result1 %> & <% $.param2 %>'"
target: <% $.__env.var1 %>
publish:
final_result: "{$.task2}"
final_result: <% $.task2 %>
wf2:
type: direct
output:
slogan: "{$.slogan}"
slogan: <% $.slogan %>
tasks:
task1:
workflow: wf1
input:
param1: "{$.__env.var2}"
param2: "{$.__env.var3}"
param1: <% $.__env.var2 %>
param2: <% $.__env.var3 %>
task_name: task2
publish:
slogan: "{$.task1.final_result} is a cool {$.__env.var4}!"
slogan: "<% $.task1.final_result %> is a cool <% $.__env.var4 %>!"
"""
@ -187,7 +187,7 @@ class SubworkflowsTest(base.EngineTestCase):
env = {
'var1': TARGET,
'var2': 'Bonnie',
'var3': '{$.__env.var5}',
'var3': '<% $.__env.var5 %>',
'var4': 'movie',
'var5': 'Clyde'
}

View File

@ -53,10 +53,10 @@ workflows:
# Skip this '$' sign until bug
# https://bugs.launchpad.net/mistral/+bug/1415886 is resolved.
# return $['num'] * 10
context: "{$}"
context: <% $ %>
publish:
result: "{$.task1}"
result: <% $.task1 %>
"""

View File

@ -33,28 +33,28 @@ wf:
type: direct
output:
result: "{$.result3}"
result: <% $.result3 %>
tasks:
task1:
action: std.echo output=1
publish:
result1: "{$.task1}"
result1: <% $.task1 %>
on-complete:
- task3
task2:
action: std.echo output=2
publish:
result2: "{$.task2}"
result2: <% $.task2 %>
on-complete:
- task3
task3:
join: all
action: std.echo output="{$.result1},{$.result2}"
action: std.echo output="<% $.result1 %>,<% $.result2 %>"
publish:
result3: "{$.task3}"
result3: <% $.task3 %>
"""
@ -66,13 +66,13 @@ wf:
type: direct
output:
result: "{$.result3}"
result: <% $.result3 %>
tasks:
task1:
action: std.echo output=1
publish:
result1: "{$.task1}"
result1: <% $.task1 %>
on-complete:
- task3
@ -83,9 +83,9 @@ wf:
task3:
join: all
action: std.echo output="{$.result1}-{$.result1}"
action: std.echo output="<% $.result1 %>-<% $.result1 %>"
publish:
result3: "{$.task3}"
result3: <% $.task3 %>
"""
WF_FULL_JOIN_WITH_CONDITIONS = """
@ -96,34 +96,34 @@ wf:
type: direct
output:
result: "{$.result4}"
result: <% $.result4 %>
tasks:
task1:
action: std.echo output=1
publish:
result1: "{$.task1}"
result1: <% $.task1 %>
on-complete:
- task3
task2:
action: std.echo output=2
publish:
result2: "{$.task2}"
result2: <% $.task2 %>
on-complete:
- task3: "{$.result2 = 11111}"
- task4: "{$.result2 = 2}"
- task3: <% $.result2 = 11111 %>
- task4: <% $.result2 = 2 %>
task3:
join: all
action: std.echo output="{$.result1}-{$.result1}"
action: std.echo output="<% $.result1 %>-<% $.result1 %>"
publish:
result3: "{$.task3}"
result3: <% $.task3 %>
task4:
action: std.echo output=4
publish:
result4: "{$.task4}"
result4: <% $.task4 %>
"""
WF_PARTIAL_JOIN = """
@ -134,20 +134,20 @@ wf:
type: direct
output:
result: "{$.result4}"
result: <% $.result4 %>
tasks:
task1:
action: std.echo output=1
publish:
result1: "{$.task1}"
result1: <% $.task1 %>
on-complete:
- task4
task2:
action: std.echo output=2
publish:
result2: "{$.task2}"
result2: <% $.task2 %>
on-complete:
- task4
@ -165,9 +165,9 @@ wf:
task4:
join: 2
action: std.echo output="{$.result1},{$.result2}"
action: std.echo output="<% $.result1 %>,<% $.result2 %>"
publish:
result4: "{$.task4}"
result4: <% $.task4 %>
"""
WF_PARTIAL_JOIN_TRIGGERS_ONCE = """
@ -178,7 +178,7 @@ wf:
type: direct
output:
result: "{$.result4}"
result: <% $.result4 %>
tasks:
task1:
@ -211,9 +211,11 @@ wf:
task5:
join: 2
action: std.echo output="{$.result1},{$.result2},{$.result3},{$.result4}"
action: std.echo
input:
output: <% $.result1 %>,<% $.result2 %>,<% $.result3 %>,<% $.result4 %>
publish:
result5: "{$.task5}"
result5: <% $.task5 %>
"""
WF_DISCRIMINATOR = """
@ -224,7 +226,7 @@ wf:
type: direct
output:
result: "{$.result4}"
result: <% $.result4 %>
tasks:
task1:
@ -250,9 +252,9 @@ wf:
task4:
join: one
action: std.echo output="{$.result1},{$.result2},{$.result3}"
action: std.echo output="<% $.result1 %>,<% $.result2 %>,<% $.result3 %>"
publish:
result4: "{$.task4}"
result4: <% $.task4 %>
"""

View File

@ -37,20 +37,20 @@ wf:
- num2
output:
result: "{$.result4},{$.result5}"
result: "<% $.result4 %>,<% $.result5 %>"
tasks:
task1:
action: std.echo output={$.num1}
action: std.echo output=<% $.num1 %>
publish:
result1: "{$.task1}"
result1: <% $.task1 %>
on-complete:
- task3
task2:
action: std.echo output={$.num2}
action: std.echo output=<% $.num2 %>
publish:
result2: "{$.task2}"
result2: <% $.task2 %>
on-complete:
- task3
@ -60,18 +60,18 @@ wf:
task and serves just a decision point in the workflow.
join: all
on-complete:
- task4: "{$.num1 + $.num2 = 2}"
- task5: "{$.num1 + $.num2 = 3}"
- task4: <% $.num1 + $.num2 = 2 %>
- task5: <% $.num1 + $.num2 = 3 %>
task4:
action: std.echo output=4
publish:
result4: "{$.task4}"
result4: <% $.task4 %>
task5:
action: std.echo output=5
publish:
result5: "{$.task5}"
result5: <% $.task5 %>
"""

View File

@ -48,7 +48,7 @@ workflows:
retry:
count: 5
delay: 10
break-on: "{$.my_val = 10}"
break-on: <% $.my_val = 10 %>
"""
@ -133,7 +133,7 @@ workflows:
retry:
count: 3
delay: 1
break-on: "{$.my_val = 10}"
break-on: <% $.my_val = 10 %>
"""
@ -248,7 +248,7 @@ class PoliciesTest(base.EngineTestCase):
self.assertIsInstance(p, policies.RetryPolicy)
self.assertEqual(5, p.count)
self.assertEqual('{$.my_val = 10}', p.break_on)
self.assertEqual('<% $.my_val = 10 %>', p.break_on)
p = self._assert_single_item(arr, delay=7)

View File

@ -43,13 +43,13 @@ wf:
method. And we need to check that engine handles this situation.
output:
result: "{$.result}"
result: <% $.result %>
tasks:
task1:
action: std.block
publish:
result: "{$.task1}"
result: <% $.task1 %>
"""
WF_SHORT_ACTION = """
@ -73,13 +73,13 @@ wf:
methods ends.
output:
result: "{$.result}"
result: <% $.result %>
tasks:
task1:
action: std.echo output=1
publish:
result1: "{$.task1}"
result1: <% $.task1 %>
task2:
action: std.block

View File

@ -42,14 +42,14 @@ workflows:
tasks:
task1:
action: std.echo output='{$.param1}'
action: std.echo output=<% $.param1 %>
publish:
result1: "{$.task1}"
result1: <% $.task1 %>
task2:
action: std.echo output="{$.result1} & {$.param2}"
action: std.echo output="<% $.result1 %> & <% $.param2 %>"
publish:
result2: "{$.task2}"
result2: <% $.task2 %>
requires: [task1]
"""

View File

@ -44,30 +44,30 @@ workflows:
- param1
- param2
output:
final_result: "{$.final_result}"
final_result: <% $.final_result %>
tasks:
task1:
action: std.echo output='{$.param1}'
action: std.echo output=<% $.param1 %>
publish:
result1: "{$.task1}"
result1: <% $.task1 %>
task2:
action: std.echo output="'{$.param1} & {$.param2}'"
action: std.echo output="'<% $.param1 %> & <% $.param2 %>'"
publish:
final_result: "{$.task2}"
final_result: <% $.task2 %>
requires: [task1]
wf2:
type: direct
output:
slogan: "{$.slogan}"
slogan: <% $.slogan %>
tasks:
task1:
workflow: wf1 param1='Bonnie' param2='Clyde' task_name='task2'
publish:
slogan: "{$.task1.final_result} is a cool movie!"
slogan: "<% $.task1.final_result %> is a cool movie!"
"""

View File

@ -45,10 +45,10 @@ workflows:
tasks:
task1:
with-items: name_info in {$.names_info}
action: std.echo output={$.name_info.name}
with-items: name_info in <% $.names_info %>
action: std.echo output=<% $.name_info.name %>
publish:
result: "{$.task1}"
result: <% $.task1 %>
"""
@ -68,10 +68,10 @@ workflows:
tasks:
task1:
with-items: name_info in {$.names_info}
action: std.echo output="{$.greeting}, {$.name_info.name}!"
with-items: name_info in <% $.names_info %>
action: std.echo output="<% $.greeting %>, <% $.name_info.name %>!"
publish:
result: "{$.task1}"
result: <% $.task1 %>
"""
@ -92,11 +92,11 @@ workflows:
tasks:
task1:
with-items:
- itemX in {$.arrayI}
- itemY in {$.arrayJ}
action: std.echo output="{$.itemX} {$.itemY}"
- itemX in <% $.arrayI %>
- itemY in <% $.arrayJ %>
action: std.echo output="<% $.itemX %> <% $.itemY %>"
publish:
result: "{$.task1}"
result: <% $.task1 %>
"""
@ -113,10 +113,10 @@ workflows:
- links
tasks:
task1:
with-items: link in {$.links}
action: std.mistral_http url={$.link}
with-items: link in <% $.links %>
action: std.mistral_http url=<% $.link %>
publish:
result: "{$.task1}"
result: <% $.task1 %>
"""

View File

@ -117,11 +117,11 @@ class InlineYAQLEvaluatorTest(base.BaseTest):
def test_multiple_placeholders(self):
expr_str = """
Statistics for tenant "{$.project_id}"
Statistics for tenant "<% $.project_id %>"
Number of virtual machines: {$.vm_count}
Number of active virtual machines: {$.active_vm_count}
Number of networks: {$.net_count}
Number of virtual machines: <% $.vm_count %>
Number of active virtual machines: <% $.active_vm_count %>
Number of networks: <% $.net_count %>
-- Sincerely, Mistral Team.
"""
@ -168,19 +168,19 @@ class ExpressionsTest(base.BaseTest):
}
test_cases = [
('{$.a + $.b * $.c}', 7),
('{($.a + $.b) * $.c}', 9),
('{$.d and $.e}', False),
('{$.f > $.g}', True),
('{$.h.length() >= 5}', True),
('{$.h.length() >= $.b + $.c}', True),
('{100 in $.h}', False),
('{$.a in $.h}', True),
('{''OpenStack'' in $.i}', True),
('Hello, {$.j}!', 'Hello, World!'),
('{$.k} is {$.l}!', 'Mistral is awesome!'),
('This is {$.m}.', 'This is the way we roll.'),
('{1 + 1 = 3}', False)
('<% $.a + $.b * $.c %>', 7),
('<%($.a + $.b) * $.c %>', 9),
('<% $.d and $.e %>', False),
('<% $.f > $.g %>', True),
('<% $.h.length() >= 5 %>', True),
('<% $.h.length() >= $.b + $.c %>', True),
('<% 100 in $.h %>', False),
('<% $.a in $.h%>', True),
('<% ''OpenStack'' in $.i %>', True),
('Hello, <% $.j %>!', 'Hello, World!'),
('<% $.k %> is <% $.l %>!', 'Mistral is awesome!'),
('This is <% $.m %>.', 'This is the way we roll.'),
('<% 1 + 1 = 3 %>', False)
]
for expression, expected in test_cases:
@ -192,7 +192,7 @@ class ExpressionsTest(base.BaseTest):
task_spec_dict = {
'parameters': {
'p1': 'My string',
'p2': '{$.param2}',
'p2': '<% $.param2 %>',
'p3': ''
},
'publish': {
@ -228,16 +228,16 @@ class ExpressionsTest(base.BaseTest):
data = {
"parameters": {
"parameter1": {
"name1": "{$.auth_token}",
"name1": "<% $.auth_token %>",
"name2": "val_name2"
},
"param2": [
"var1",
"var2",
"/servers/{$.project_id}/bla"
"/servers/<% $.project_id %>/bla"
]
},
"token": "{$.auth_token}"
"token": "<% $.auth_token %>"
}
applied = expr.evaluate_recursively(data, context)
@ -264,7 +264,8 @@ class ExpressionsTest(base.BaseTest):
'verbose': True,
'__actions': {
'std.sql': {
'conn': 'mysql://admin:secrete@{$.__env.host}/{$.__env.db}'
'conn': 'mysql://admin:secrete@<% $.__env.host %>'
'/<% $.__env.db %>'
}
}
}

View File

@ -33,14 +33,14 @@ actions:
tags: [test, v2]
base: std.echo
base-input:
output: Hello {$.name}!
output: "{$}"
output: Hello <% $.name %>!
output: <% $ %>
action2:
description: This is a test ad-hoc action with base params
tags: [test, v2]
base: std.echo output="Echo output"
output: "{$}"
output: <% $ %>
workflows:
wf1:
@ -54,19 +54,19 @@ workflows:
tasks:
task1:
description: This is a test task
action: action1 name="{$.name}"
action: action1 name=<% $.name %>
policies:
wait-before: 2
wait-after: 5
retry:
count: 10
delay: 30
break-on: "{$.my_val = 10}"
break-on: <% $.my_val = 10 %>
concurrency: 3
task2:
requires: [task1]
action: std.echo output="Thanks {$.name}!"
action: std.echo output="Thanks <% $.name %>!"
wf2:
tags: [test, v2]
@ -77,9 +77,9 @@ workflows:
retry:
count: 10
delay: 30
break-on: "{$.my_val = 10}"
break-on: <% $.my_val = 10 %>
on-error:
- fail: "{$.my_val = 0}"
- fail: <% $.my_val = 0 %>
on-success:
- pause
on-complete:
@ -89,11 +89,11 @@ workflows:
task3:
workflow: wf1 name="John Doe" age=32 param1=null param2=false
on-error:
- task4: "{$.my_val = 1}"
- task4: <% $.my_val = 1 %>
on-success:
- task5: "{$.my_val = 2}"
- task5: <% $.my_val = 2 %>
on-complete:
- task6: "{$.my_val = 3}"
- task6: <% $.my_val = 3 %>
task4:
action: std.echo output="Task 4 echo"
@ -105,7 +105,7 @@ workflows:
action: std.echo output="Task 6 echo"
task7:
with-items: vm_info in {$.vms}
with-items: vm_info in <% $.vms %>
workflow: wf2 is_true=true object_list=[1, null, "str"] is_string="50"
on-complete:
- task9
@ -113,9 +113,9 @@ workflows:
task8:
with-items:
- itemX in {$.arrayI}
- itemY in {$.arrayJ}
workflow: wf2 expr_list=["{$.value}", "{$.key}"] expr={$.value}
- itemX in <% $.arrayI %>
- itemY in <% $.arrayJ %>
workflow: wf2 expr_list=["<% $.v %>", "<% $.k %>"] expr=<% $.value %>
target: nova
on-complete:
- task9
@ -134,7 +134,7 @@ workflows:
action: std.echo output="Task 11 echo"
task12:
action: std.http url="http://site.com?q={$.query}" params=""
action: std.http url="http://site.com?q=<% $.query %>" params=""
task13:
description: No-op task
@ -269,11 +269,11 @@ class DSLv2ModelTest(base.BaseTest):
self.assertListEqual(['test', 'v2'], action_spec.get_tags())
self.assertEqual('std.echo', action_spec.get_base())
self.assertDictEqual(
{'output': 'Hello {$.name}!'},
{'output': 'Hello <% $.name %>!'},
action_spec.get_base_input()
)
self.assertListEqual([], action_spec.get_input())
self.assertEqual('{$}', action_spec.get_output())
self.assertEqual('<% $ %>', action_spec.get_output())
# Workflows.
@ -300,7 +300,7 @@ class DSLv2ModelTest(base.BaseTest):
self.assertEqual('task1', task1_spec.get_name())
self.assertEqual('This is a test task', task1_spec.get_description())
self.assertEqual('action1', task1_spec.get_action_name())
self.assertEqual({'name': '{$.name}'}, task1_spec.get_input())
self.assertEqual({'name': '<% $.name %>'}, task1_spec.get_input())
policies = task1_spec.get_policies()
@ -312,7 +312,7 @@ class DSLv2ModelTest(base.BaseTest):
self.assertEqual(10, retry_spec.get_count())
self.assertEqual(30, retry_spec.get_delay())
self.assertEqual('{$.my_val = 10}', retry_spec.get_break_on())
self.assertEqual('<% $.my_val = 10 %>', retry_spec.get_break_on())
task2_spec = wf1_spec.get_tasks().get('task2')
@ -322,7 +322,7 @@ class DSLv2ModelTest(base.BaseTest):
self.assertEqual('std.echo', task2_spec.get_action_name())
self.assertIsNone(task2_spec.get_workflow_name())
self.assertEqual(
{'output': 'Thanks {$.name}!'},
{'output': 'Thanks <% $.name %>!'},
task2_spec.get_input()
)
@ -337,7 +337,7 @@ class DSLv2ModelTest(base.BaseTest):
task_defaults_spec = wf2_spec.get_task_defaults()
self.assertListEqual(
[('fail', '{$.my_val = 0}')],
[('fail', '<% $.my_val = 0 %>')],
task_defaults_spec.get_on_error()
)
self.assertListEqual(
@ -366,15 +366,15 @@ class DSLv2ModelTest(base.BaseTest):
task3_spec.get_input()
)
self.assertListEqual(
[('task4', '{$.my_val = 1}')],
[('task4', '<% $.my_val = 1 %>')],
task3_spec.get_on_error()
)
self.assertListEqual(
[('task5', '{$.my_val = 2}')],
[('task5', '<% $.my_val = 2 %>')],
task3_spec.get_on_success()
)
self.assertListEqual(
[('task6', '{$.my_val = 3}')],
[('task6', '<% $.my_val = 3 %>')],
task3_spec.get_on_complete()
)
@ -390,21 +390,21 @@ class DSLv2ModelTest(base.BaseTest):
)
self.assertEqual(
{'vm_info': '{$.vms}'},
{'vm_info': '<% $.vms %>'},
task7_spec.get_with_items()
)
task8_spec = wf2_spec.get_tasks().get('task8')
self.assertEqual(
{"itemX": '{$.arrayI}', "itemY": '{$.arrayJ}'},
{"itemX": '<% $.arrayI %>', "itemY": '<% $.arrayJ %>'},
task8_spec.get_with_items()
)
self.assertEqual(
{
'expr_list': ['{$.value}', '{$.key}'],
'expr': '{$.value}',
'expr_list': ['<% $.v %>', '<% $.k %>'],
'expr': '<% $.value %>',
},
task8_spec.get_input()
)
@ -426,7 +426,7 @@ class DSLv2ModelTest(base.BaseTest):
task12_spec = wf2_spec.get_tasks().get('task12')
self.assertDictEqual(
{'url': 'http://site.com?q={$.query}', 'params': ''},
{'url': 'http://site.com?q=<% $.query %>', 'params': ''},
task12_spec.get_input()
)

View File

@ -38,10 +38,10 @@ workflows:
task1:
action: std.echo output="Hey"
publish:
res1: "{$.task1}"
res1: <% $.task1 %>
on-complete:
- task2: "{$.res1 = 'Hey'}"
- task3: "{$.res1 = 'Not Hey'}"
- task2: <% $.res1 = 'Hey' %>
- task3: <% $.res1 = 'Not Hey' %>
task2:
action: std.echo output="Hi"

View File

@ -27,10 +27,10 @@ TASK_DICT = {
'version': '2.0',
'action': 'std.echo',
'with-items': [
'item in {$.array}'
'item in <% $.array %>'
],
'input': {
'array': '{$.my_array}'
'array': '<% $.my_array %>'
}
}
@ -45,7 +45,7 @@ TASK_DB = models.Task(
class WithItemsCalculationsTest(base.BaseTest):
def test_calculate_output_with_key(self):
task_dict = TASK_DICT.copy()
task_dict['publish'] = {'result': '{$.task1}'}
task_dict['publish'] = {'result': '<% $.task1 %>'}
task_spec = tasks.TaskSpec(task_dict)

View File

@ -18,11 +18,12 @@ import re
import six
from mistral import exceptions as exc
from mistral import expressions as expr
CMD_PTRN = re.compile("^[\w\.]+[^=\s\"]*")
ALL_IN_BRACES = "\{[^}]*\}\s*"
INLINE_YAQL = expr.INLINE_YAQL_REGEXP
_ALL_IN_BRACKETS = "\[.*\]\s*"
_ALL_IN_QUOTES = "\"[^\"]*\"\s*"
_ALL_IN_APOSTROPHES = "'[^']*'\s*"
@ -32,7 +33,7 @@ _FALSE = "false"
_NULL = "null"
ALL = (
_ALL_IN_QUOTES, _ALL_IN_APOSTROPHES, ALL_IN_BRACES,
_ALL_IN_QUOTES, _ALL_IN_APOSTROPHES, INLINE_YAQL,
_ALL_IN_BRACKETS, _TRUE, _FALSE, _NULL, _DIGITS
)

View File

@ -23,7 +23,7 @@ from mistral.workbook.v2 import task_policies
WITH_ITEMS_PTRN = re.compile(
"\s*([\w\d_\-]+)\s*in\s*(\[.+\]|%s)" % base.ALL_IN_BRACES
"\s*([\w\d_\-]+)\s*in\s*(\[.+\]|%s)" % base.INLINE_YAQL
)
@ -95,7 +95,7 @@ class TaskSpec(base.BaseSpec):
if not match:
msg = ("Wrong format of 'with-items' property. Please use "
"format 'var in {[some, list] | {$.array} }: "
"format 'var in {[some, list] | <%% $.array %%> }: "
"%s" % self._data)
raise exc.InvalidModelException(msg)

View File

@ -151,8 +151,8 @@ def calc_input(with_items_input):
Example:
DSL:
with_items:
- itemX in {$.arrayI}
- itemY in {$.arrayJ}
- itemX in <% $.arrayI %>
- itemY in <% $.arrayJ %>
Assume arrayI = [1, 2], arrayJ = ['a', 'b'].
with_items_input = {