gpt4 book ai didi

go - Terraform 提供程序应如何处理服务器端应用的默认值?

转载 作者:行者123 更新时间:2023-12-02 23:35:57 25 4
gpt4 key购买 nike

上下文:我正在实现(我的第一个)Terraform 插件/提供程序作为现有公共(public) API 的包装器。

API 中的创建操作之一指定一个整数字段,该字段采用正值或 -1 作为默认值。如果您在创建 API 调用中指定 -1,该值将被服务器端的某个默认值替换(例如 field = 1000),并存储为 1000 从现在开始。

如果我将其呈现给我的 Terraform 插件 (terraform apply):

resource "something" "mysomething" {
name = "someName"
field = -1
}

该调用不是幂等的。 Terraform 继续看到变化并随后提供:

  # something.mysomething will be updated in-place
~ resource "something" "mysomething" {
id = "165-1567498530352"
name = "someName"
~ field = 1000 -> -1
}

Plan: 0 to add, 1 to change, 0 to destroy.

如何处理这样的API?

最佳答案

Terraform SDK 包含一个特殊的架构标志Compated,这意味着“如果配置中没有给定值,则在应用时将选择默认值”。

这似乎与您的用例相符。如果您取消设置 Default 并设置 Compulated: true - 保留 Optional: true 以指示用户可以选择设置它 - 那么您可以激活该行为。

如果您能够在创建或更新任何内容之前在计划步骤中预测最终的“计算”值,那么您应该为资源实现CustomizeDiff,并且使用 d.Set 提供值,然后 Terraform 可以将其考虑在内以生成更完整的计划。

如果没有,那么您可以在规划期间将其保留为未设置(在 Terraform 术语中,其值将为“未知”),然后在 Create 中调用 d.SetUpdate 函数,其值在计划中显示为 (应用后已知)

使用此机制时,保持自洽非常重要:如果您在规划期间使用 CustomizeDiff 提供已知值,则该值必须与在规划过程中选择的最终值完全匹配创建更新。如果不一致,那么当 Terraform Core 验证最终更改与计划一致时,其他表达式中对此属性的任何引用都将导致应用期间出错。

<小时/>

目前此方法有一个警告:由于目前 Terraform SDK 的 API 设计限制,提供程序代码无法判断何时不再设置之前在配置中设置的值。或者,换句话说,SDK 无法判断已存储的值是通过显式配置选择的,还是由提供程序在应用期间作为默认值填充的。

因此,如果用户取消设置,配置中最后设置的值将是“粘性的”,并且提供程序将无法自动将该值调整回服务器提供的默认值。

这一警告在实践中通常不是什么大问题,但值得注意,以防它在您的具体情况中确实。 SDK 的后续版本可能会提供一种机制来询问配置中是否设置了特定值,与状态中存储的值分开。

关于go - Terraform 提供程序应如何处理服务器端应用的默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57784666/

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