支持 map_replace 函数

包含您的 Launchpad 蓝图的 URL

https://blueprints.launchpad.net/heat/+spec/map-replace-function

此蓝图添加了对新的 map_replace 函数的支持。

问题描述

目前,对映射(例如 json 参数)执行键/值替换比较困难。虽然可以使用 str_replace 或 yaql 进行(滥)用,但两种方法都存在问题,例如避免 str_replace 中的部分匹配,以及在 yaql 或 str_replace 的情况下引发键/值冲突的验证错误。

提议的变更

此规范建议添加一个新函数,该函数可以遍历映射并根据每个映射的可选映射替换键或值

map_replace:
  - k1: v1
    k2: v2
  - keys:
      k1: K1
    values:
      v2: V2

在这种情况下,结果将被评估为 {‘K1’: ‘v1’, ‘k2’, ‘V2’}

将添加验证检查,以便如果发生键冲突,替换将失败,例如,如果将“k2”替换为上面的“k1”,该函数将失败,因为它将覆盖现有键。

备选方案

我尝试在 yaql 中执行此操作,并在一些 ML 帮助下使其工作

yaql:
   expression: let(root => $) -> dict($root.data.service.items().select(
                                      [$[0], $root.data.ip[$[1]]]))
   data:
     service: { get_param: ServiceNetMap }
     ip: {get_param: NetIpMap}

但是,这不允许在发生键冲突时引发错误,并且语法很难记住。

实现

实现新函数和测试。

负责人

主要负责人

shardy

里程碑

newton-3

工作项

  1. 实现 map_replace 内置函数。

  2. 添加相关的测试。

  3. 添加相应的文档。

  4. 在 heat-templates 中添加用法示例。

依赖项