github.com/crossplane/upjet@v1.3.0/pkg/controller/ignored_tfpluginsdk.go (about) 1 // SPDX-FileCopyrightText: 2023 The Crossplane Authors <https://crossplane.io> 2 // 3 // SPDX-License-Identifier: Apache-2.0 4 5 package controller 6 7 import "fmt" 8 9 // getTerraformIgnoreChanges returns a sorted Terraform `ignore_changes` 10 // lifecycle meta-argument expression by looking for differences between 11 // the `initProvider` and `forProvider` maps. The ignored fields are the ones 12 // that are present in initProvider, but not in forProvider. 13 // TODO: This method is copy-pasted from `pkg/resource/ignored.go` and adapted. 14 // Consider merging this implementation with the original one. 15 func getTerraformIgnoreChanges(forProvider, initProvider map[string]any) []string { 16 ignored := getIgnoredFieldsMap("%s", forProvider, initProvider) 17 return ignored 18 } 19 20 // TODO: This method is copy-pasted from `pkg/resource/ignored.go` and adapted. 21 // Consider merging this implementation with the original one. 22 func getIgnoredFieldsMap(format string, forProvider, initProvider map[string]any) []string { 23 ignored := []string{} 24 25 for k := range initProvider { 26 if _, ok := forProvider[k]; !ok { 27 ignored = append(ignored, fmt.Sprintf(format, k)) 28 } else { 29 // both are the same type so we dont need to check for forProvider type 30 if _, ok = initProvider[k].(map[string]any); ok { 31 ignored = append(ignored, getIgnoredFieldsMap(fmt.Sprintf(format, k)+".%v", forProvider[k].(map[string]any), initProvider[k].(map[string]any))...) 32 } 33 // if its an array, we need to check if its an array of maps or not 34 if _, ok = initProvider[k].([]any); ok { 35 ignored = append(ignored, getIgnoredFieldsArray(fmt.Sprintf(format, k), forProvider[k].([]any), initProvider[k].([]any))...) 36 } 37 38 } 39 } 40 return ignored 41 } 42 43 // TODO: This method is copy-pasted from `pkg/resource/ignored.go` and adapted. 44 // Consider merging this implementation with the original one. 45 func getIgnoredFieldsArray(format string, forProvider, initProvider []any) []string { 46 ignored := []string{} 47 for i := range initProvider { 48 // Construct the full field path with array index and prefix. 49 fieldPath := fmt.Sprintf("%s.%d", format, i) 50 if i < len(forProvider) { 51 if _, ok := initProvider[i].(map[string]any); ok { 52 ignored = append(ignored, getIgnoredFieldsMap(fieldPath+".%s", forProvider[i].(map[string]any), initProvider[i].(map[string]any))...) 53 } 54 if _, ok := initProvider[i].([]any); ok { 55 ignored = append(ignored, getIgnoredFieldsArray(fieldPath, forProvider[i].([]any), initProvider[i].([]any))...) 56 } 57 } else { 58 ignored = append(ignored, fieldPath) 59 } 60 } 61 return ignored 62 }