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 }