改进“repeat”函数¶
https://blueprints.launchpad.net/heat/+spec/improve-repeat-function
此规范改进了“repeat”内置函数。
问题描述¶
现在,“repeat”函数仅在 for_each 部分包含多个键/值对时,才支持迭代给定列表中所有元素的排列。类似于大多数编程语言中嵌套循环的工作方式。
有些用户在使用“repeat”函数时,并不希望进行嵌套循环。例如,存在一些列表参数:网络、子网和 IP 地址
parameters:
networks:
type: comma_delimited_list
default: "net1, net2, net3, ..., netn"
subnets:
type: comma_delimited_list
default: "sub1, sub2, sub3, ..., subn"
ips:
type: comma_delimited_list
default: "ip1, ip2, ip3, ..., ipn"
用户希望使用多个网卡创建服务器
resources:
my_server:
type: OS::Nova::Server
properties:
..... //some properties
networks:
- network: net1
subnet: sub1
fixed_ip: ip1
- network: net2
subnet: sub2
fixed_ip: ip2
- network: net3
subnet: sub3
fixed_ip: ip3
- ...
...
“repeat”函数非常适合这种情况。但现在,“repeat”函数将执行嵌套循环来迭代给定列表中所有元素的排列:[[net1, net2, net3, …],[sub1, sub2, sub3, …], [ip1, ip2, ip3, …]] 以每个列表包含两个项目为例
...
networks:
repeat:
for_each:
%net%: [net1, net2]
%sub%: [sub1, sub2]
%ip%: [ip1, ip2]
template:
network: %net%
subnet: %sub%
fixed_ip: %ip%
在解析函数后,我们将得到以下结果
[{'fixed_ip': 'ip1', 'network': 'net1', 'subnet': 'sub1'},
{'fixed_ip': 'ip2', 'network': 'net1', 'subnet': 'sub1'},
{'fixed_ip': 'ip1', 'network': 'net1', 'subnet': 'sub2'},
{'fixed_ip': 'ip2', 'network': 'net1', 'subnet': 'sub2'},
{'fixed_ip': 'ip1', 'network': 'net2', 'subnet': 'sub1'},
{'fixed_ip': 'ip2', 'network': 'net2', 'subnet': 'sub1'},
{'fixed_ip': 'ip1', 'network': 'net2', 'subnet': 'sub2'},
{'fixed_ip': 'ip2', 'network': 'net2', 'subnet': 'sub2']
但用户想要的是两个网卡
[{'fixed_ip': 'ip1', 'network': 'net1', 'subnet': 'sub1'},
{'fixed_ip': 'ip2', 'network': 'net2', 'subnet': 'sub2']
提议的变更¶
此提案改进了“repeat”函数,以支持上述用户场景。为“repeat”添加一个布尔标志部分“permutations”,默认值为“True”,以确保兼容性。然后,“repeat”函数的使用方式如下
resources:
my_server:
type: OS::Nova::Server
properties:
(...other properties)
networks:
repeat:
permutations: False
for_each:
%net%: { get_param: nets }
%sub%: { get_param: subnets }
%ip%: {get_param: ips}
template:
network: %net%
subnet: %sub%
fixed_ip: %ip%
如上所示,将“permutations”部分设置为 False,则函数的结果将满足用户的需求。
- 注意事项
对此有一个约束:列表的长度应相等。
备选方案¶
无
实现¶
负责人¶
里程碑¶
- 完成目标里程碑
Pike-1
工作项¶
为
repeat函数添加“permutations”部分,并实现新的替换方法。文档。
添加相关的测试。
添加模板示例。
依赖项¶
无