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