[英]Is it possible to use DiffSuppressFunc for a TypeMap in Terraform SDK v2?
当我创建一个新属性时:
"foo": {
Type: schema.TypeMap,
Elem: &schema.Schema{
Type: schema.TypeString,
},
Sensitive: true,
Required: true,
ForceNew: false,
},
一切都按预期工作。 但是,当我向其中添加新属性时:
DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool {
return true
},
忽略 state 和 main.tf 之间的每一个变化( foo
属性仅在CREATE
上使用) d.Get("foo")
开始返回一个超级混乱的空地图。 一旦我删除DiffSuppressFunc
d.Get("foo")
不再是空地图(如预期的那样)。
https://github.com/hashicorp/terraform-plugin-sdk/issues/477似乎是相关的。
更新:问题似乎是DiffSuppressFunc
被调用的事实
"foo.%" "0" "2"
甚至在d.Get()
之前。
此 SDKv2 基于最初为非常旧的 Terraform 版本(v0.11 及更早版本)编写的 SDK,因此它使用了一些不再适用的约定,其中包括您在所有嵌套的地方看到的这种不寻常的行为资源类型的属性和复杂类型被扁平化为从字符串到字符串的单个映射,特别是一个名为foo
的映射属性,其值如{ a = 1, b = 2 }
最终以以下特殊方式存储SDK 抽象内部:
"foo.%" = "2"
"foo.a" = "1"
"foo.b" = "2"
foo.%
元素既可以记录这是一个地图(与foo.#
相对,它表示一个列表),也可以记录地图中元素的数量,这对地图来说不是很有用,但是是 SDK 如何处理列表的重要部分,以便它可以知道期望找到哪些索引。
不幸的是,这个实现细节在DiffSuppressFunc
中显示出来,因为当schema.ResourceData
对象已经被扁平化为上述形状时,该特定函数在过程中处理得很晚,因此您在该函数中收到的是原始键和值压扁后。
出于这个原因,将DiffSuppressFunc
与地图或列表属性一起使用并不实际或可靠。 由于这个要求与 Terraform v0.11 的期望保持兼容,它可能永远不会。 HashiCorp 的一个团队一直致力于替代 SDKv2,称为Terraform 插件框架,该框架从一开始就围绕现代 Terraform 的类型系统和假设进行设计,因此它能够以合理的方式支持复杂类型。
不幸的是,新框架目前没有直接等效于DiffSuppressFunc
,因为它的设计仍在考虑中,但原则上可以通过计划修改来实现类似的效果,尽管有更多的样板。 在底层, DiffSuppressFunc
所做的只是覆盖计划值以匹配先前状态而不是配置,然后 Terraform 将其理解为配置和先前状态值是写下相同信息的两种不同方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.