支持 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 定义表达式评估时最大内存大小(以字节为单位)。

备选方案

无。

实现

负责人

主要负责人

ochuprykov@mirantis.com

里程碑

newton-1

工作项

  1. 实现 yaql 内置函数。

  2. 添加相关的测试。

  3. 添加相应的文档。

  4. 向 heat-templates 添加用例示例。

依赖项