调用 PlanResourceChange 时如何告诉 Terraform 提供者新值应该是什么

How to tell a Terraform provider what a new value should be when PlanResourceChange is called

我正在阅读 Terraform 中的 underpinnings of providers。在我的例子中,我有两个属性作为改变服务器电源状态的资源的一部分。他们是desired_power_action,另一个是power_statedesired_power_action 可能类似于 FORCE_OFF。完成此操作后,我希望 power_stateoff

desired_power_action 是必填字段,power_state 是计算字段。据我了解,在计划阶段,它会将 desired_power_action 投影为用户选择的任何内容。事实上,在我的提供商中,我只是将其设置为用户所说的他们想要的任何内容,因为这只是他们希望将其设置为的内容。但是对于 power_state 我不确定如何在我的提供商代码中告诉 Terraform 如果用户将 desired_power_action 设置为 FORCE_OFF 那么 power_state 的预测值就是 off.

我知道如何在申请时设置该值,但我如何在计划时告诉 Terraform power_state 申请后 应该是 XXXXXX?

还是我误会了,这不是我需要做的事情?

您在此处链接到的“资源实例更改生命周期”文档是从 Terraform Core 开发人员的角度编写的,因为它的文档主要针对为 Terraform Core 做出贡献的人员,而不是提供商开发人员。

Terraform SDK 团队也参考了此文档以了解 SDK 应该保证哪些不变量,但是 SDK 然后在该较低级别的模型之上添加了自己的抽象,以便更方便地开发 Terraform适合常用模式的提供商。

在你的情况下,我想你已经注意到原始协议要求 PlanResourceChange 为资源类型的每个“计算”属性提供一个值,它可以使用“未知值”占位符(在 Terraform 的 UI 中转换为 (known after apply))或(如果提供者知道足以预测最终值)它可以 return 一个具体值,然后必须匹配 ApplyResourceChange 最后 returns.

默认情况下,SDK 将通过将所有计算属性设置为“未知”来响应 PlanResourceChange,因此实际上大多数资源类型不包含任何特殊逻辑。但是,在像您这样的情况下,您可以选择通过填充 schema.Resource.

CustomizeDiff 字段来自定义默认行为

CustomizeDiff 回调接收一个 schema.ResourceDiff 对象,它与 schema.ResourceData 类似,但包含一些额外的方法来处理 diff 同时包含旧值和新值的事实每个 argument/attribute.

在您的情况下,您可以编写一些逻辑以在您知道具体新值的情况下有条件地调用 SetNew。然后,SDK 将在其 PlanResourceChange 响应中依次 return,而不是 return 未知值的默认行为。