改进“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,则函数的结果将满足用户的需求。

注意事项

对此有一个约束:列表的长度应相等。

备选方案

实现

负责人

主要负责人

huangtianhua@huawei.com

里程碑

完成目标里程碑

Pike-1

工作项

  • repeat 函数添加“permutations”部分,并实现新的替换方法。

  • 文档。

  • 添加相关的测试。

  • 添加模板示例。

依赖项