用于分割字符串的内置函数¶
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 规范作为上述提交的一部分。
依赖项¶
无