github.com/argoproj/argo-cd/v3@v3.2.1/util/argo/diff/normalize.go (about)

     1  package diff
     2  
     3  import (
     4  	"github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1"
     5  	"github.com/argoproj/argo-cd/v3/util/argo/normalizers"
     6  
     7  	"github.com/argoproj/gitops-engine/pkg/diff"
     8  	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
     9  )
    10  
    11  // Normalize applies the full normalization on the lives and configs resources based
    12  // on the provided DiffConfig.
    13  func Normalize(lives, configs []*unstructured.Unstructured, diffConfig DiffConfig) (*NormalizationResult, error) {
    14  	result, err := preDiffNormalize(lives, configs, diffConfig)
    15  	if err != nil {
    16  		return nil, err
    17  	}
    18  	diffNormalizer, err := newDiffNormalizer(diffConfig.Ignores(), diffConfig.Overrides(), diffConfig.IgnoreNormalizerOpts())
    19  	if err != nil {
    20  		return nil, err
    21  	}
    22  
    23  	for _, live := range result.Lives {
    24  		if live != nil {
    25  			err = diffNormalizer.Normalize(live)
    26  			if err != nil {
    27  				return nil, err
    28  			}
    29  		}
    30  	}
    31  	for _, target := range result.Targets {
    32  		if target != nil {
    33  			err = diffNormalizer.Normalize(target)
    34  			if err != nil {
    35  				return nil, err
    36  			}
    37  		}
    38  	}
    39  	return result, nil
    40  }
    41  
    42  // newDiffNormalizer creates normalizer that uses Argo CD and application settings to normalize the resource prior to diffing.
    43  func newDiffNormalizer(ignore []v1alpha1.ResourceIgnoreDifferences, overrides map[string]v1alpha1.ResourceOverride, opts normalizers.IgnoreNormalizerOpts) (diff.Normalizer, error) {
    44  	ignoreNormalizer, err := normalizers.NewIgnoreNormalizer(ignore, overrides, opts)
    45  	if err != nil {
    46  		return nil, err
    47  	}
    48  	knownTypesNorm, err := normalizers.NewKnownTypesNormalizer(overrides)
    49  	if err != nil {
    50  		return nil, err
    51  	}
    52  
    53  	return &composableNormalizer{normalizers: []diff.Normalizer{ignoreNormalizer, knownTypesNorm}}, nil
    54  }
    55  
    56  type composableNormalizer struct {
    57  	normalizers []diff.Normalizer
    58  }
    59  
    60  // Normalize performs resource normalization.
    61  func (n *composableNormalizer) Normalize(un *unstructured.Unstructured) error {
    62  	for i := range n.normalizers {
    63  		if err := n.normalizers[i].Normalize(un); err != nil {
    64  			return err
    65  		}
    66  	}
    67  	return nil
    68  }