1 Mistral + YAQL
YAQL是很典型地用于简单条件验证和在Mistral工作流中进行数据转换。
在你没有制作出动作但是有需求需要根据动作结果来判定是否继续地场景会有很多,
或者有一个将结果转换为另一个值或者结构化用于工作流重下一次动作地需求存在。
下面是YAQL在Mistral工作流重的使用场景:
1) 定义传递给任务的输入值
2) 定义任务和工作流发布的输出值
3) 定义条件用来决定任务的转换
知道YAQL可以在Mistral工作流中哪里被使用,下面是一些YAQL可以做的很酷的事情:
1) 从一个字典列表重选择键值对
2) 当一个或多个字段满足条件时来过滤列表
3) 将一个列表转换未字典或者反过来
4) 简单的算法
5) 布尔逻辑的验证
6) 任何select, filter, transform和evaluate的组合
2 Basics
下面是工作流和任务定义中可接受YAQL的的声明:
task action input
task concurrency
task on-complete
task on-error
task on-success
task pause-before
task publish
task retry break-on
task retry continue-on
task retry count
task retry delay
task timeout
task wait-before
task wait-after
task with-items
workflow output
每一个声明可以接受一个携带有一个或多个YAQL表达式的字符串。
字符串重每个表达式应该用 <% %> 包裹。
当校验一个YAQL的表达式,Mistral也可以传入一个JSON字典到YAQL引擎。
上下文重包含了所有工作流的输入,发布的变量,工作流任务完成的结果,
包含当前的任务。YAQL表达式可以引用一个或多个变量到上下文重。
保留的符号$被用于引用上下文。例如,给丁的上下文
{"ip": "127.0.0.1", "port": 8080}
这个字符串 https://<% $.ip %>:<% $.port %>/api
会返回 https://127.0.0.1:8080/api 。
下面是一个在工作里重使用的相同的例子:
version: '2.0'
examples.yaql-basic:
type: direct
input:
- ip
- port
tasks:
task1:
action: examples.call-api
input:
endpoint: https://<% $.ip %>:<% $.port %>/api
Mistral重已经确定的声明例如: on-success和on-error可以验证布尔逻辑。
而on-condition相关的声明被用于一个任务到另一个任务的转换。如果一个布尔逻辑在这些
声明重被定义了,它可以被用于校验转换是否应该继续。服务的布尔逻辑使用了
not, and, or的组合,圆括号也是有可能的。以下面的工作流为例:
工作流重某个分支的执行依赖于 $.path 的值。如果 $.path = a, 接着任务
a会被执行。如果$.path =b, 接着任务b回被执行。如果上述都不符合,
最终任务c会被执行。
version: '2.0'
examples.mistral-branching:
description: >
A sample workflow that demonstrates how to use conditions
to determine which path in the workflow to take.
type: direct
input:
- which
tasks:
t1:
action: core.lo