当调用PlanResourceChange时,如何告诉Terraform提供程序新值应该是什么

当调用PlanResourceChange时,如何告诉Terraform提供程序新值应该是什么,terraform,terraform0.12+,Terraform,Terraform0.12+,我正在读关于地球地形的书。在我的例子中,我有两个属性作为资源的一部分,用于更改服务器的电源状态。它们是所需的功率动作,另一个是功率状态所需的电源动作可能类似于强制关闭。完成此操作后,我希望电源状态为关闭 required\u power\u action是必填字段,power\u state是计算字段。据我所知,在计划阶段,它将所需的\u power\u action投射为用户选择的任何内容。事实上,在我的提供者中,我只是简单地将它设置为用户希望它是什么,因为它只是他们希望它设置为什么。然而,对

我正在读关于地球地形的书。在我的例子中,我有两个属性作为资源的一部分,用于更改服务器的电源状态。它们是
所需的功率动作
,另一个是
功率状态
<代码>所需的电源动作可能类似于
强制关闭
。完成此操作后,我希望
电源状态
关闭

required\u power\u action
是必填字段,
power\u state
是计算字段。据我所知,在计划阶段,它将
所需的\u power\u action
投射为用户选择的任何内容。事实上,在我的提供者中,我只是简单地将它设置为用户希望它是什么,因为它只是他们希望它设置为什么。然而,对于
power\u state
我不确定如何在我的提供者代码中告诉Terraform,如果用户将
所需的\u power\u操作设置为
强制关闭
,则
power\u state
的预测值就是
关闭

我知道如何在应用时设置该值,但我如何告诉Terraform在应用后的计划时间
power\u state
应为XXXXXX

或者我误解了,这不是我需要做的吗?

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

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

在您的例子中,我想您已经注意到原始协议要求
PlanResourceChange
为资源类型上的每个“计算”属性提供一个值,其中它可以使用“未知值”占位符(在Terraform的UI中转换为
(应用后已知)
)或(如果提供程序知道足够的信息来预测最终值),它可以返回一个具体的值,该值必须与
ApplyResourceChange
finally返回的值相匹配

默认情况下,SDK将通过将所有计算属性设置为“未知”来响应
PlanResourceChange
,因此实际上大多数资源类型都不包含任何特殊的逻辑。但是,在类似您的情况下,如果存在可预测的情况,您可以通过填充的
CustomizeDiff
字段选择自定义默认行为

CustomizeDiff
回调接收一个对象,该对象类似于
schema.ResourceData
,但包含一些额外的方法来处理diff包括每个参数/属性的新旧值这一事实


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

如果您可以链接到资源文档,可能会有所帮助。您不需要这样做o在此处执行任何操作,而应在计划中说明已计算并显示
(应用后已知)
在终端的计划输出中。您在这里看到了其他问题吗?您是使用wire协议编写提供程序,还是直接针对wire协议编程?答案将根据具体情况而有所不同,因为SDK在wire协议之上添加了一些额外的抽象。@MartinAtkins官方SDKI知道我们我不应该在评论中感谢你的留言,但我不知道还能把它放在哪里。谢谢你的回复——这填补了我的很多空白,在我思考这一切是如何结合在一起的时候非常有帮助。