实现“ terraform.ReadPlan不再使用”的替换

时间:2019-08-02 14:14:33

标签: terraform

Microsoft提供了一个使用Terratest测试Terraform基础结构的示例: https://docs.microsoft.com/en-us/azure/terraform/terratest-in-terraform-modules 有一段有趣的代码:

        // Terraform init and plan only
        tfPlanOutput := "terraform.tfplan"
        terraform.Init(t, tfOptions)
        terraform.RunTerraformCommand(t, tfOptions, terraform.FormatArgs(tfOptions.Vars, "plan", "-out="+tfPlanOutput)...)

        // Read and parse the plan output
        f, err := os.Open(path.Join(tfOptions.TerraformDir, tfPlanOutput))
        if err != nil {
            t.Fatal(err)
        }
        defer f.Close()
        plan, err := terraformCore.ReadPlan(f)

如果尝试在Terraform 0.12上执行它,则会出现错误:

terraform.ReadPlan is no longer in use; use planfile.Open instead

问题是,如何重新实现Microsoft的代码以与Terraform 0.12一起使用?如何将 *文件转换为计划

2 个答案:

答案 0 :(得分:0)

此错误消息针对的是Terraform代码库本身上的人员,而不是外部调用方。 terraform Go软件包不是公共API,因此从技术上来说可能供其他Go代码库调用,但它与任何其他调用它的系统都没有兼容性保证在将来的发行版中进行重构很可能会破坏(如本例所示)。

话虽如此,Terraform 0.12引入了一种受支持的方法,即通过terraform show -json <planfile>对保存的计划文件进行解码以供其他软件检查。

terratest具有函数RunTerraformCommandAndGetStdoutE,您可以使用该函数运行terraform show -json <planfile>并获取原始JSON输出:

planJSON, err := terraform.RunTerraformCommandAndGetStdoutE(
    t, tfOptions, terraform.FormatArgs("show", "-json", tfPlanOutput)...
)

然后,您可以使用Go标准库encoding/json程序包将其解析为您自己的一些struct类型,这些类型可以覆盖您打算编写的测试所需的the JSON output format的子集

答案 1 :(得分:0)

@Grzegorz P您是否能够解决此问题?我正在尝试执行相同的操作,并将Terraform计划解析为json格式,但始终出现异常(FatalError {Underlying:退出状态1})。我正在使用与Azure terraform terratest示例相同的.tf文件。 请您将整个代码与指定的go import一起粘贴吗?谢谢

PS:当我将Terraform降级到0.11.4时,我能够使用readplan方法成功运行该示例。 谢谢。