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  }