gpt4 book ai didi

go - Terraform Schema Elem 支持多种类型吗?

转载 作者:IT王子 更新时间:2023-10-29 02:06:43 26 4
gpt4 key购买 nike

Terraform Schema 能否为 Elem 支持多种 Schema 类型?我要解决的问题是,来 self 的外部 API 的数据是一个具有多种类型的数组——一些元素是字符串,一些是列表。例如,一个值看起来像这样:

condition = [
"and",
[
"contains",
["foo","bar","baz"],
"website"
]

然后,我为该属性创建我的模式,看起来像这样

"condition": {
Type: schema.TypeList,
Required: true,
Elem: &schema.Schema{
Type: schema.TypeList,
},
},

但是,当我运行测试时,我收到一条消息:

condition.0: should be a list

这是有道理的,因为我的架构定义声明每个 Elem 都应该是一个列表。有没有办法为 Elem 定义多个类型?

更新:

我已将上面的 condition 字段更改为

"condition_json": {
Type: schema.TypeString,
Required: true,
},

我的 .tf 文件现在使用 jsonencode() 像这样:


variable "condition_list" {
default = [
["and"],
["contains",["path","payload","source"],"website"],
["contains",["path","headers","from","0","address"],"homer"]
]
}
resource "event_rule" "first" {
condition_json = "${jsonencode(var.condition_list)}"
}

当我为事件规则对象构建结构时,Condition 字段正在获取 condition_json 的值,如下所示:

Condition: d.Get("condition_json").([]interface{}),

因为我在与 API 接口(interface)的库中的 Condition 字段如下所示:

Condition         []interface{} `json:"condition,omitempty"`

我的问题是我收到一个错误

interface {} is string, not []interface {}

这条消息是有道理的,因为我将模式设置为 TypeString 但是,在我与 API 接口(interface)的结构中,我将 Condition 键入为 []interface{ }。我的问题是,有没有办法将 d.Get("condition_json") 转换为 []interface{} 而不是断言?

我显然遗漏了什么,我不确定是什么。 :)

最佳答案

在当前(撰写本文时)Terraform SDK 中,这是不可能的:每个值都必须具有特定的定义类型,因为 SDK 依赖它来正确解码存储在 Terraform 状态快照中的数据。

当今提供程序中针对该限制的常见解决方法是拥有一个字符串类型的字段,该字段接受值的 JSON 序列化。为了允许将来远离此解决方法,这些属性通常使用 _json 后缀命名,例如 condition_json 在您的情况下。 Terraform 0.12 改进了 jsonencode 函数的稳健性,以便更轻松地为此类属性提供值,而无需在配置中手写 JSON 字符串。

Terraform 0.12 在核心层和提供者协议(protocol)中引入了对动态类型属性的支持,因此 Terraform SDK 的 future 版本将包含将属性定义为运行时类型的功能。也就是说,值类型将包含在通过线路发送的消息中,而不是从模式中假定。那时,您可以在此处为您的属性使用该模式。如果您之前使用过 _json 属性变通方法,则有可能在一段时间内同时支持 JSON 模式和动态类型模式以优雅地转换。

关于go - Terraform Schema Elem 支持多种类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56608097/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com