HOT 模板的“repeat”函数

https://blueprints.launchpad.net/heat/+spec/repeat-function

本规范为 HOT 模板引入了一个“repeat”控制结构。

问题描述

类型为“comma_delimited_list”的参数对于定义项目列表很有用,但 HOT 模板语法并未提供任何映射或转换这些项目的方法。

例如,考虑使用一个参数来指定要包含在安全组中的端口列表

parameters:
  ports:
    type: comma_delimited_list
    label: ports
    default: "80,443,8080"

期望的结果,目前无法实现,是上述参数可以用来构造如下资源

resources:
  security_group:
    type: OS::Neutron::SecurityGroup
    properties:
      name: web_server_security_group
      rules:
        - protocol: tcp
          port_range_min: 80
          port_range_max: 80
        - protocol: tcp
          port_range_min: 443
          port_range_max: 443
        - protocol: tcp
          port_range_min: 8080
          port_range_max: 8080

提议的变更

本提案引入了一个名为 repeat 的新函数,它遍历列表的元素,并将每个项目替换到给定的模板中。

以下面安全组示例为例,repeat 函数将如下使用

resources:
  security_group:
    type: OS::Neutron::SecurityGroup
    properties:
      name: web_server_security_group
      rules:
        repeat:
          for_each:
            <%port%>: { get_param: ports }
          template:
            protocol: tcp
            port_range_min: <%port%>
            port_range_max: <%port%>

以下是另一个示例,该函数实现了当前无法实现的解决方案

resources:
  my_server:
    type: OS::Nova::Server
    properties:
      networks:
        repeat:
          for_each:
            <%net_name%>: { get_param: networks }
          template:
            network: <%net_name%>

在此示例中,实例需要连接的网络列表作为参数中的列表给出。

另一个有趣的可能是生成两个或多个列表的排列。例如,可以将上面的安全组示例扩展为也支持参数化协议,如下所示

resources:
  security_group:
    type: OS::Neutron::SecurityGroup
    properties:
      name: web_server_security_group
      rules:
        repeat:
          for_each:
            <%port%>: { get_param: ports }
            <%protocol%>: { get_param: protocols }
          template:
            protocol: <%protocol%>
            port_range_min: <%port%>

for_each 参数指定循环变量和要迭代的列表,作为键值对。循环变量必须仔细选择,因为每次迭代中,任何出现都会被列表中的每个项目替换。

如果在 for_each 部分包含多个键/值对,则迭代将对给定列表中元素的所有排列进行,类似于大多数编程语言中嵌套循环的工作方式。

repeat 函数的结果是一个新列表,其元素设置为每个循环迭代中生成的数据。当给定单个列表时,结果列表的大小等于输入列表的大小。当输入多个列表时,结果列表的大小将等于所有输入列表的大小相乘。

备选方案

另一种探索的方法是扩展 str_replace 函数以适应此功能,但最终一致认为两者用法存在显着差异。

实现

负责人

主要负责人

miguelgrinberg

里程碑

完成目标里程碑

Kilo-3

工作项

  • 编写 repeat 函数。

  • 文档。

  • 单元测试。

依赖项