簡體   English   中英

是否可以在 Terraform SDK v2 中將 DiffSuppressFunc 用於 TypeMap?

[英]Is it possible to use DiffSuppressFunc for a TypeMap in Terraform SDK v2?

當我創建一個新屬性時:

"foo": {
    Type: schema.TypeMap,
    Elem: &schema.Schema{
        Type: schema.TypeString,
    },
    Sensitive:   true,
    Required:    true,
    ForceNew:    false,
},

一切都按預期工作。 但是,當我向其中添加新屬性時:

DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool {
  return true
},

忽略 state 和 main.tf 之間的每一個變化( foo屬性僅在CREATE上使用) d.Get("foo")開始返回一個超級混亂的空地圖。 一旦我刪除DiffSuppressFunc d.Get("foo")不再是空地圖(如預期的那樣)。

https://github.com/hashicorp/terraform-plugin-sdk/issues/477似乎是相關的。

更新:問題似乎是DiffSuppressFunc被調用的事實

"foo.%" "0" "2"

甚至在d.Get()之前。

此 SDKv2 基於最初為非常舊的 Terraform 版本(v0.11 及更早版本)編寫的 SDK,因此它使用了一些不再適用的約定,其中包括您在所有嵌套的地方看到的這種不尋常的行為資源類型的屬性和復雜類型被扁平化為從字符串到字符串的單個映射,特別是一個名為foo的映射屬性,其值如{ a = 1, b = 2 }最終以以下特殊方式存儲SDK 抽象內部:

"foo.%" = "2"
"foo.a" = "1"
"foo.b" = "2"

foo.%元素既可以記錄這是一個地圖(與foo.#相對,它表示一個列表),也可以記錄地圖中元素的數量,這對地圖來說不是很有用,但是是 SDK 如何處理列表的重要部分,以便它可以知道期望找到哪些索引。

不幸的是,這個實現細節在DiffSuppressFunc中顯示出來,因為當schema.ResourceData對象已經被扁平化為上述形狀時,該特定函數在過程中處理得很晚,因此您在該函數中收到的是原始鍵和值壓扁后。

出於這個原因,將DiffSuppressFunc與地圖或列表屬性一起使用並不實際或可靠。 由於這個要求與 Terraform v0.11 的期望保持兼容,它可能永遠不會。 HashiCorp 的一個團隊一直致力於替代 SDKv2,稱為Terraform 插件框架,該框架從一開始就圍繞現代 Terraform 的類型系統和假設進行設計,因此它能夠以合理的方式支持復雜類型。

不幸的是,新框架目前沒有直接等效於DiffSuppressFunc ,因為它的設計仍在考慮中,但原則上可以通過計划修改來實現類似的效果,盡管有更多的樣板。 在底層, DiffSuppressFunc所做的只是覆蓋計划值以匹配先前狀態而不是配置,然后 Terraform 將其理解為配置和先前狀態值是寫下相同信息的兩種不同方式。

暫無
暫無

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

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