如何在自定义地形提供程序资源中允许有序列表



我有一个自定义地形提供程序,它有一个以列表为输入的资源。

以下是有问题的列表:https://github.com/volterraedge/terraform-provider-volterra/blob/main/volterra/resource_auto_volterra_http_loadbalancer.go#L3501

当我声明列表时,它需要设置为多个块,如下所示:

active_service_policies {
policies {
name      = "foobar"
namespace = "shared"
}
policies {
name      = "batz"
namespace = "shared"
}
}

相反,我希望能够像下面这样声明:

active_service_policies {
policies = [
{
name      = "foobar"
namespace = "shared"
},
{
name      = "batz"
namespace = "shared"
}
]
}

这会导致以下错误:

Error: Unsupported argument
on main.tf line 79, in resource "volterra_http_loadbalancer" "sp":
79:     policies = [
An argument named "policies" is not expected here. Did you mean to define a block
of type "policies"?

为什么我不能使用有序列表?我如何允许使用它?

这个问题是因为policiesType: schema.TypeList,吗?应该是TypeSet还是其他对象?

您使用的Terraform SDK最初是为Terraform v0.11及更早版本设计的,因此它不支持那些旧的Terraform版本不支持的配置结构,Terraform v.11及更早版本也不支持您想要的对象列表。

要使用现代Terraform语言的全部功能,您可以使用更新的插件框架来构建您的提供商,该插件框架是围绕现代Terraform语言类型系统设计的,尽管由于年龄的差异,它目前也不如旧的SDK成熟。

在新的框架中,您可以声明一个tfsdk.Attribute,它的Attributes字段设置为tfsdk.ListNestedAttributes结果:

tfsdk.Attribute{
Attributes: tfsdk.ListNestedAttributes(
map[string]tfsdk.Attribute{
"name": tfsdk.Attribute{
// ...
},
"namespace": tfsdk.Attribute{
// ...
},
},
tfsdk.ListNestedAttributesOptions{},
),
// ...
}

上面的(部分(示例声明了一个属性,该属性需要一个对象列表,其中每个对象本身都可以具有namenamespace属性。

在旧的SDK中,最接近这一点的是您在示例中显示的块序列。在使用该SDK构建的较旧的提供程序中,这里的常见模式是为块指定单数名称policy,而不是复数名称policies,这样在配置中可以更清楚地看到,每个块在序列中只声明一个策略。

相关内容

  • 没有找到相关文章

最新更新