更灵活的环境合并

https://blueprints.launchpad.net/heat/+spec/environment-merging

由于我们现在支持服务器端环境文件合并,这很好,但它仅支持与 heatclient 中先前相同的“最后胜出”合并策略。

在某些情况下,需要更高的灵活性,例如通过多个环境文件组成部署时,参数键冲突会发生。

问题描述

考虑以下场景

heat stack-create foo -f foo.yaml -e one.yaml -e two.yaml

one.yaml 包含

parameters
ControllerServices
  • Keystone

two.yaml 包含

parameters
ControllerServices
  • Glance

使用当前的环境合并,我总是会得到

parameters
ControllerServices
  • Glance

但实际上我想要的是

parameters
ControllerServices
  • Keystone

  • Glance

因此,我需要某种方式来指定 heat 服务器端环境合并将追加到,而不是覆盖 ControllerServices 参数。(同样的问题也存在于例如 json 映射参数中,在那里我们可能希望提供浅合并和深合并与仅仅覆盖的选项)。

请注意,这与一些其他接受潜在重叠的 yaml 数据部分(例如 cloud-init[1])面临并解决的完全相同的问题

[1] http://cloudinit.readthedocs.io/en/latest/topics/merging.html

提议的变更

由于 parameters/parameter_defaults 只是简单的键/值对,很难想出一个在参数映射中添加合并策略数据的接口,因此我们可能需要一个单独的环境部分,例如

  1. 为所有参数指定全局合并策略

merge_strategy

list: extend dict: merge # 我们可以在这里支持“merge”和“deep_merge”吗? string: append

  1. 为每个参数指定合并策略

merge_strategy
parameters

ControllerServices: extend

这与 cloud-init 的“merge_how”指令非常相似。

如果多个环境指定了冲突的 merge_strategy 值,我们将引发验证错误。

备选方案

另一种选择基本上是客户端模板修改,这可行,但会使模板可移植性降低(例如,我们将最终在 tripleo-common 中实现 TripleO 特定的解决方案,这将导致我们的环境无法直接通过 heatclient 传递给 heat)。

实现

由于 jdob 在 engine/service.py 中添加了对合并 environment_files 列表的支持,这应该只是在那个文件中的 _merge_environments 函数中添加对这些可选策略的支持。

负责人

主要负责人

ramishra

里程碑

完成目标里程碑

newton-2

工作项

  • 更新 heat-engine 代码以支持新的可选 merge_strategy 键

  • 此新接口的全面测试和文档

  • 为 heatclient 添加支持(不是为了支持合并,只是为了接受该键)

依赖项