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  }