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

     1  package diff_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/assert"
     7  	"github.com/stretchr/testify/require"
     8  	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
     9  
    10  	"github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1"
    11  	"github.com/argoproj/argo-cd/v3/test"
    12  	"github.com/argoproj/argo-cd/v3/util/argo/diff"
    13  	"github.com/argoproj/argo-cd/v3/util/argo/normalizers"
    14  	"github.com/argoproj/argo-cd/v3/util/argo/testdata"
    15  )
    16  
    17  func TestNormalize(t *testing.T) {
    18  	type fixture struct {
    19  		diffConfig diff.DiffConfig
    20  		lives      []*unstructured.Unstructured
    21  		targets    []*unstructured.Unstructured
    22  	}
    23  	setup := func(t *testing.T, ignores []v1alpha1.ResourceIgnoreDifferences) *fixture {
    24  		t.Helper()
    25  		dc, err := diff.NewDiffConfigBuilder().
    26  			WithDiffSettings(ignores, nil, true, normalizers.IgnoreNormalizerOpts{}).
    27  			WithNoCache().
    28  			Build()
    29  		require.NoError(t, err)
    30  		live := test.YamlToUnstructured(testdata.LiveDeploymentWithManagedReplicaYaml)
    31  		target := test.YamlToUnstructured(testdata.DesiredDeploymentYaml)
    32  		return &fixture{
    33  			diffConfig: dc,
    34  			lives:      []*unstructured.Unstructured{live},
    35  			targets:    []*unstructured.Unstructured{target},
    36  		}
    37  	}
    38  	t.Run("will normalize resources removing the fields owned by managers", func(t *testing.T) {
    39  		// given
    40  		ignore := v1alpha1.ResourceIgnoreDifferences{
    41  			Group:                 "*",
    42  			Kind:                  "*",
    43  			ManagedFieldsManagers: []string{"revision-history-manager"},
    44  		}
    45  		ignores := []v1alpha1.ResourceIgnoreDifferences{ignore}
    46  		f := setup(t, ignores)
    47  
    48  		// when
    49  		result, err := diff.Normalize(f.lives, f.targets, f.diffConfig)
    50  
    51  		// then
    52  		require.NoError(t, err)
    53  		require.Len(t, result.Targets, 1)
    54  		_, ok, err := unstructured.NestedFloat64(result.Targets[0].Object, "spec", "revisionHistoryLimit")
    55  		require.NoError(t, err)
    56  		require.False(t, ok)
    57  		_, ok, err = unstructured.NestedFloat64(result.Lives[0].Object, "spec", "revisionHistoryLimit")
    58  		require.NoError(t, err)
    59  		require.False(t, ok)
    60  	})
    61  	t.Run("will correctly normalize with multiple ignore configurations", func(t *testing.T) {
    62  		// given
    63  		ignores := []v1alpha1.ResourceIgnoreDifferences{
    64  			{
    65  				Group:        "apps",
    66  				Kind:         "Deployment",
    67  				JSONPointers: []string{"/spec/replicas"},
    68  			},
    69  			{
    70  				Group:                 "*",
    71  				Kind:                  "*",
    72  				ManagedFieldsManagers: []string{"revision-history-manager"},
    73  			},
    74  		}
    75  		f := setup(t, ignores)
    76  
    77  		// when
    78  		normalized, err := diff.Normalize(f.lives, f.targets, f.diffConfig)
    79  
    80  		// then
    81  		require.NoError(t, err)
    82  		require.Len(t, normalized.Targets, 1)
    83  		_, ok, err := unstructured.NestedFloat64(normalized.Targets[0].Object, "spec", "revisionHistoryLimit")
    84  		require.NoError(t, err)
    85  		require.False(t, ok)
    86  		_, ok, err = unstructured.NestedFloat64(normalized.Lives[0].Object, "spec", "revisionHistoryLimit")
    87  		require.NoError(t, err)
    88  		require.False(t, ok)
    89  		_, ok, err = unstructured.NestedInt64(normalized.Targets[0].Object, "spec", "replicas")
    90  		require.NoError(t, err)
    91  		require.False(t, ok)
    92  		_, ok, err = unstructured.NestedInt64(normalized.Lives[0].Object, "spec", "replicas")
    93  		require.NoError(t, err)
    94  		require.False(t, ok)
    95  	})
    96  	t.Run("will not modify resources if ignore difference is not configured", func(t *testing.T) {
    97  		// given
    98  		ignores := []v1alpha1.ResourceIgnoreDifferences{}
    99  		f := setup(t, ignores)
   100  
   101  		// when
   102  		result, err := diff.Normalize(f.lives, f.targets, f.diffConfig)
   103  
   104  		// then
   105  		require.NoError(t, err)
   106  		require.Len(t, result.Targets, 1)
   107  		assert.Equal(t, f.lives[0], result.Lives[0])
   108  		assert.Equal(t, f.targets[0], result.Targets[0])
   109  	})
   110  }