支持 YAQL 函数¶
包含您的 Launchpad 蓝图的 URL
https://blueprints.launchpad.net/heat/+spec/yaql-function
此蓝图为 heat 添加了对 YAQL 的支持。
问题描述¶
https://github.com/openstack/yaql
YAQL(Yet Another Query Language)是一种可嵌入和可扩展的查询语言,允许对任意对象执行复杂的查询。
目前 Heat 尚不具备评估复杂表达式的能力,例如
从字典列表中选择某个键的值。
过滤列表,其中一个或多个字段匹配条件。
将列表转换为字典,反之亦然。
简单的算术运算。
布尔逻辑的评估。
选择、过滤、转换和评估的任意组合。
提议的变更¶
此规范建议向 heat 添加 yaql 函数,形式如下
yaql:
expression: <expression>
data:
<var1>: <val1>
...
其中 expression 是一个有效的 yaql 表达式,将被评估,data 是一个包含变量的字典,我们可以从 expression 中引用这些变量。
引用相应的数据
outputs:
o1:
value: {yaql: {expression: $.data.foo, data: {foo: 1}}}
o1 将被评估为 1
表达式评估
parameters:
list_param:
type: comma_delimited_list
default: [1, 2, 3]
bool_param1:
type: boolean
default true
bool_param2:
type: boolean
default: false
resources:
asg:
type: OS::Heat::AutoscalingGroup
properties:
resource:
type: OS::Nova::Server
...
rg:
type: OS::Heat::ResourceGroup
properties:
count: 3
type: child.yaml
properties:
index: "%index%"
...
outputs:
o1:
yaql:
expression: $.data.bool_param1 and $.data.bool_param2
data:
bool_param1: {get_param: bool_param1}
bool_param2: {get_param: bool_param2}
o2:
yaql:
expression: $.data.list_param.select(int($)).max()
data:
list_param: {get_param: list_param}
o3:
yaql:
expression: int($.data.list_param[0]) + int($.data.list_param[1]))
data:
list_param: {get_param: list_param}
o4:
yaql:
expression: $.values().where($.status="FAILED").select($.id)
data: {get_attr: [asg, outputs, show]}
child.yaml 的内容
parameters:
nova_flavors:
type: comma_delimited_list
default: [m1.tiny, m1.small, m1.large]
index:
type: string
resources:
instance:
type: OS::Nova::Server
properties:
...
flavor:
yaql:
expression: $.data.nova_flavors[
int($.data.index) mod $.data.nova_flavors.len()]
data:
nova_flavors: {get_param: nova_flavors}
index: {get_param: index}
o1 将被评估为 false,o2 将被评估为 3,o3 将被评估为 3,o4 将包含处于失败状态的服务器 ID 列表,将创建 3 台具有 m1.tiny、m1.small 和 m1.large 规格的服务器。
添加 2 个配置选项以限制 yaql
limit_iterators 定义表达式评估时集合中最大元素数量,以及
memory_quota 定义表达式评估时最大内存大小(以字节为单位)。
备选方案¶
无。
实现¶
负责人¶
里程碑¶
newton-1
工作项¶
实现 yaql 内置函数。
添加相关的测试。
添加相应的文档。
向 heat-templates 添加用例示例。
依赖项¶
无