我正在使用“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 编译时错误,因为 Go 正在尝试生成一些初始化时代码来初始化该变量,但不能,因为该变量引用了自身。
但是,即使 Go 本身没有这种限制,Terraform 也确实要求提供者模式是有限的且非递归的。无法在 Terraform 提供者协议中描述自引用模式。
Terraform 本身确实提供了一种“逃生舱口”,提供者可以将属性声明为动态类型,以便在运行时决定最终类型。原则上,这将允许您告诉 Terraform 将作者编写的内容传递给您,并在您自己的提供程序代码中以您想要的方式处理它,但是提供程序框架尚不直接支持(在撰写本文时) ,因此不幸的是,对于使用该框架的提供商来说,这并不是一个真正可行的解决方案(而不是直接实现原始提供商协议,这具有挑战性)。
当今的一些提供程序使用折衷方案,定义一个名为
folder_json
的参数,其类型为字符串,然后解析提供程序代码内的 JSON。这提供了与动态类型模式属性类似的效果,因为类型是在运行时动态决定的(在本例中,基于 JSON 语法而不是基于 Terraform 语言功能),但这确实意味着提供者的用户需要使用 jsonencode
函数或类似函数分配值:
folder_json = jsonencode({
# ...
})