Terraform Schema Elem支持多种类型?

时间:2019-06-15 06:55:07

标签: go terraform

Terraform模式可以支持Elem的多种模式类型吗?我要解决的问题是来自外部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接口的库中的我的Condition字段看起来像:

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

我的问题是我遇到了一个错误

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

此消息很有意义,因为我已将模式设置为TypeString,但是在与API进行接口的结构中,我将Condition键入为[]interface{}。我的问题是,是否有一种方法可以将d.Get(“ condition_json”)强制转换为[]interface{}而非断言?

我显然错过了一些东西,我不确定。 :)

1 个答案:

答案 0 :(得分:1)

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

当今在提供程序中进行此限制的一种常见解决方法是让一个字符串类型的字段接受该值的JSON序列化。为了将来可以从此替代方法迁移,这些属性通常使用后缀_json命名,例如condition_json。 Terraform 0.12改进了jsonencode函数的健壮性,使其更容易为此类属性提供值,而无需在配置中手动编写JSON字符串。

Terraform 0.12在核心层和提供者协议中引入了对动态类型属性的支持,因此Terraform SDK的未来版本将具有将属性定义为运行时类型的功能。也就是说,值类型将包含在通过导线发送的消息中,而不是从模式中假定。此时,您可以在此处为该属性使用该模式。如果您以前使用过_json属性变通办法,则可能会同时支持JSON模式和动态类型模式一段时间,以进行正常过渡。