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函数。文档。
单元测试。
依赖项¶
无