如何处理 terraform 中的递归模式?

问题描述 投票:0回答:1

我正在使用“github.com/hashicorp/terraform-plugin-framework/datasource/schemas”库来组合数据源的架构。我正在构建一个新的属性映射,如下所示:

var folderSchemaAttributes = map[string]schema.Attribute{
    "created_by": schema.StringAttribute{
        MarkdownDescription: "The details of the user that created the folder.",
    },
    "created_date": schema.StringAttribute{
        MarkdownDescription: "The date and time when the folder was created in.",
        Computed:            true,
    },
    "folders": schema.ListNestedAttribute{
        NestedObject: schema.NestedAttributeObject{
            Attributes: folderSchemaAttributes,
        },
        MarkdownDescription: "The list of folders contained in this folder",
    },
}

如上所示,属性的引用之一本身。即,对于上面的示例,文件夹下可以有一个文件夹列表,并且所有文件夹都具有相同的属性集。因此我希望这个引用以递归的方式发生。

但是我遇到了以下错误: 初始化周期:folderSchemaAttributes 引用自身编译器InvalidInitCycle

这基本上阻止了我实现这个递归引用。

我不确定解决这个问题的最佳方法是什么。关于如何处理这些情况有什么想法吗?

go terraform schema
1个回答
0
投票

您在这里遇到的问题似乎是 Go 编译时错误,因为 Go 正在尝试生成一些初始化时代码来初始化该变量,但不能,因为该变量引用了自身。

但是,即使 Go 本身没有这种限制,Terraform 也确实要求提供者模式是有限的且非递归的。无法在 Terraform 提供者协议中描述自引用模式。

Terraform 本身确实提供了一种“逃生舱口”,提供者可以将属性声明为动态类型,以便在运行时决定最终类型。原则上,这将允许您告诉 Terraform 将作者编写的内容传递给您,并在您自己的提供程序代码中以您想要的方式处理它,但是提供程序框架尚不直接支持(在撰写本文时) ,因此不幸的是,对于使用该框架的提供商来说,这并不是一个真正可行的解决方案(而不是直接实现原始提供商协议,这具有挑战性)。

当今的一些提供程序使用折衷方案,定义一个名为

folder_json
的参数,其类型为字符串,然后解析提供程序代码内的 JSON。这提供了与动态类型模式属性类似的效果,因为类型是在运行时动态决定的(在本例中,基于 JSON 语法而不是基于 Terraform 语言功能),但这确实意味着提供者的用户需要使用
jsonencode
函数或类似函数分配值:

  folder_json = jsonencode({
    # ...
  })
© www.soinside.com 2019 - 2024. All rights reserved.