簡體   English   中英

id 是保留字段名稱

[英]id is a reserved field name

我正在為 terraform 編寫一個提供程序以與 API 接口,這是我擁有的資源架構:

&schema.Resource{
        Create: resourceProjectCreate,
        Read:   resourceProjectRead,
        Update: resourceProjectUpdate,
        Delete: resourceProjectDelete,
        Importer: &schema.ResourceImporter{
            State: schema.ImportStatePassthrough,
        },

        CustomizeDiff: customdiff.Sequence(
            customdiff.ComputedIf("slug", func(d *schema.ResourceDiff, meta interface{}) bool {
                return d.HasChange("name")
            }),
        ),

        Schema: map[string]*schema.Schema{
            "name": {
                Type:     schema.TypeString,
                Required: true,
                ValidateFunc: validateName,
            },
            "description": {
                Type:     schema.TypeString,
                Optional: true,
            },
            "issueManagementEnabled": {
                Type:     schema.TypeBool,
                Required: true,
            },
            "forkedFromId": {
                Type:     schema.TypeInt,
                Required: false,
            },
        },
    }

go install沒有編譯或安裝錯誤,我正在本地嘗試,所以我設置了.terraformrc指向我的 go bin 文件夾。

Terraform 似乎在某處找到了一個 id,並抱怨:

Error: Internal validation of the provider failed! This is always a bug
with the provider itself, and not a user issue. Please report
this bug:

1 error occurred:
    * resource onedev_project: id is a reserved field name

代碼在這里https://github.com/UbiquitousBear/terraform-provider-onedev 有誰知道我應該在哪里刪除對id的引用? 它不在資源架構中。

您的go.mod文件表明您使用的是 SDK 版本 1.17.2,其中id確實記錄為保留屬性 name

但是, 它似乎不再出現在最新的 SDK 版本 2.6.1中。 由於issue #607似乎該政策發生了變化,並且該更改在 SDK 版本 v2.1.0 中首次發布。

雖然我無法解釋為什么您共享的代碼會引發該錯誤,但您可以通過升級到最新的 SDK 版本來避免該問題。 由於它是一個新的主要版本,因此在 API 的其他地方可能需要考慮一些重大更改。 一個 Terraform SDK v2 升級指南,其中描述了更改,還包括一個指向tf-sdk-migrator工具的鏈接,該工具具有一些自動化來幫助升級。

這個問題有一個解決方法,無需升級到 SDK v2,您可以嘗試在您的架構上提供其他名稱,如“id1”而不是“id”

"id1": {
                Type:        schema.TypeInt,
                Optional:    true,
                Description: "",
            },

並將此屬性的值解析為您的結構

c.ID = d.Get("id1").(int)

並嘗試構建。

現在唯一的缺點是您需要在 hcl 文件中提及“id1”而不是“id”。

這對我有用,但仍然升級到 SDKv2 是更好的解決方案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM