用于分割字符串的内置函数

https://blueprints.launchpad.net/heat/+spec/str-split

从 HOT 2014-10-16 开始,我们不再支持 HOT 模板中的 AWS 兼容的 Fn::Split 内置函数,这意味着无法通过分隔符将字符串分割成组件列表。

问题描述

当前用例是为了避免在 TripleO 模板中执行此操作,但它可能是一个普遍有用的补充

ip_subnet:
  # FIXME: this assumes a 2 digit subnet CIDR (need more heat functions?)
  description: IP/Subnet CIDR for the storage network IP
  value:
        list_join:
          - ''
          - - {get_attr: [StoragePort, fixed_ips, 0, ip_address]}
            - '/'
            - {get_attr: [StoragePort, subnets, 0, cidr, -2]}
            - {get_attr: [StoragePort, subnets, 0, cidr, -1]}

这既脆弱又繁琐,最好能够轻松地以“/”分隔符进行分割。

第二个用例是启用将两个(或多个)列表连接在一起

parameters:
  ExtraConfig:
    type: json
    default: []

resources:
  type: OS::Heat::StructuredConfig
  properties:
    group: os-apply-config
    config:
      hiera:
        hierarchy:
          - controller
          - object
          - ceph
          - common
          - {get_param: ExtraConfig}

这里,期望的行为是合并/追加 ExtraConfig 参数的内容,该参数可以是 json 或 comma_delimited_list 类型,使得“hierarchy”列表包含硬编码项和通过 ExtraConfig 提供的任何列表。

提议的变更

添加一个 str_split 内置函数,使得第一个示例变为

list_join:
- ''
- - {get_attr: [StoragePort, fixed_ips, 0, ip_address]}
  - '/'
  - {str_split: ['/', {get_attr: [StoragePort, subnets, 0, cidr]}, 1]}

这意味着我们可以去除 CIDR 中的子网掩码,而无需对它总是为 2 位数字做出硬编码假设 - 将支持基于路径的索引查找,例如与 get_attr 和 get_param 相同的语法,因此,如果指定了索引,则返回该索引处的列表项,否则返回整个列表。这与当前的 get_attr 行为一致,并避免强制用户使用 Fn::Select 来提取列表项。

为了实现第二个用例,我们可以使用新的 str_split 函数,以及增强版本的 list_join,它可以选择性地接受列表的列表,例如,它能够以分隔符连接多个列表

config:
  hiera:
    hierarchy:
      str_split:
      - ','
      - list_join:
        - ','
        - - controller
          - object
          - ceph
          - common
        - {get_param: ExtraConfig}

备选方案

对于列表合并,我考虑使用 YAML << merge 指令,但一些实验表明它只能合并映射,而不能合并本例中所需的列表。

实现

负责人

主要负责人

shardy

里程碑

完成目标里程碑

liberty-1

工作项

对引擎的更改:- 提升 Liberty 的 HOT 模板版本 - 增强 list_join 以支持选择性地连接列表的列表。- 添加一个新的 str_split 函数及其相关的测试。

文档变更

  • 更新 HOT 规范作为上述提交的一部分。

依赖项