Skip to content

Commit 2e4af5f

Browse files
authored
fix: autosync would not trigger for different sources (argoproj#23615) (argoproj#23655)
Signed-off-by: Alexandre Gaudreault <alexandre_gaudreault@intuit.com>
1 parent e692a22 commit 2e4af5f

2 files changed

Lines changed: 73 additions & 44 deletions

File tree

controller/appcontroller.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2114,12 +2114,6 @@ func (ctrl *ApplicationController) autoSync(app *appv1.Application, syncStatus *
21142114
}
21152115

21162116
selfHeal := app.Spec.SyncPolicy.Automated.SelfHeal
2117-
// Multi-Source Apps with selfHeal disabled should not trigger an autosync if
2118-
// the last sync revision and the new sync revision is the same.
2119-
if app.Spec.HasMultipleSources() && !selfHeal && reflect.DeepEqual(app.Status.Sync.Revisions, syncStatus.Revisions) {
2120-
logCtx.Infof("Skipping auto-sync: selfHeal disabled and sync caused by object update")
2121-
return nil, 0
2122-
}
21232117

21242118
desiredCommitSHA := syncStatus.Revision
21252119
desiredCommitSHAsMS := syncStatus.Revisions

controller/appcontroller_test.go

Lines changed: 73 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -348,10 +348,13 @@ status:
348348
- cccccccccccccccccccccccccccccccccccccccc
349349
sources:
350350
- path: some/path
351+
helm:
352+
valueFiles:
353+
- $values_test/values.yaml
351354
repoURL: https://github.com/argoproj/argocd-example-apps.git
352355
- path: some/other/path
353356
repoURL: https://github.com/argoproj/argocd-example-apps-fake.git
354-
- path: some/other/path
357+
- ref: values_test
355358
repoURL: https://github.com/argoproj/argocd-example-apps-fake-ref.git
356359
`
357360

@@ -625,13 +628,13 @@ func TestAutoSyncEnabledSetToTrue(t *testing.T) {
625628
assert.False(t, app.Operation.Sync.Prune)
626629
}
627630

628-
func TestMultiSourceSelfHeal(t *testing.T) {
631+
func TestAutoSyncMultiSourceWithoutSelfHeal(t *testing.T) {
629632
// Simulate OutOfSync caused by object change in cluster
630633
// So our Sync Revisions and SyncStatus Revisions should deep equal
631634
t.Run("ClusterObjectChangeShouldNotTriggerAutoSync", func(t *testing.T) {
632635
app := newFakeMultiSourceApp()
633636
app.Spec.SyncPolicy.Automated.SelfHeal = false
634-
app.Status.Sync.Revisions = []string{"z", "x", "v"}
637+
app.Status.OperationState.SyncResult.Revisions = []string{"z", "x", "v"}
635638
ctrl := newFakeController(&fakeData{apps: []runtime.Object{app}}, nil)
636639
syncStatus := v1alpha1.SyncStatus{
637640
Status: v1alpha1.SyncStatusCodeOutOfSync,
@@ -643,15 +646,14 @@ func TestMultiSourceSelfHeal(t *testing.T) {
643646
require.NoError(t, err)
644647
assert.Nil(t, app.Operation)
645648
})
646-
647649
t.Run("NewRevisionChangeShouldTriggerAutoSync", func(t *testing.T) {
648650
app := newFakeMultiSourceApp()
649651
app.Spec.SyncPolicy.Automated.SelfHeal = false
650-
app.Status.Sync.Revisions = []string{"a", "b", "c"}
652+
app.Status.OperationState.SyncResult.Revisions = []string{"z", "x", "v"}
651653
ctrl := newFakeController(&fakeData{apps: []runtime.Object{app}}, nil)
652654
syncStatus := v1alpha1.SyncStatus{
653655
Status: v1alpha1.SyncStatusCodeOutOfSync,
654-
Revisions: []string{"z", "x", "v"},
656+
Revisions: []string{"a", "b", "c"},
655657
}
656658
cond, _ := ctrl.autoSync(app, &syncStatus, []v1alpha1.ResourceStatus{{Name: "guestbook-1", Kind: kube.DeploymentKind, Status: v1alpha1.SyncStatusCodeOutOfSync}}, true)
657659
assert.Nil(t, cond)
@@ -872,45 +874,78 @@ func TestAutoSyncIndicateError(t *testing.T) {
872874

873875
// TestAutoSyncParameterOverrides verifies we auto-sync if revision is same but parameter overrides are different
874876
func TestAutoSyncParameterOverrides(t *testing.T) {
875-
app := newFakeApp()
876-
app.Spec.Source.Helm = &v1alpha1.ApplicationSourceHelm{
877-
Parameters: []v1alpha1.HelmParameter{
878-
{
879-
Name: "a",
880-
Value: "1",
877+
t.Run("Single source", func(t *testing.T) {
878+
app := newFakeApp()
879+
app.Spec.Source.Helm = &v1alpha1.ApplicationSourceHelm{
880+
Parameters: []v1alpha1.HelmParameter{
881+
{
882+
Name: "a",
883+
Value: "1",
884+
},
881885
},
882-
},
883-
}
884-
ctrl := newFakeController(&fakeData{apps: []runtime.Object{app}}, nil)
885-
syncStatus := v1alpha1.SyncStatus{
886-
Status: v1alpha1.SyncStatusCodeOutOfSync,
887-
Revision: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
888-
}
889-
app.Status.OperationState = &v1alpha1.OperationState{
890-
Operation: v1alpha1.Operation{
891-
Sync: &v1alpha1.SyncOperation{
892-
Source: &v1alpha1.ApplicationSource{
893-
Helm: &v1alpha1.ApplicationSourceHelm{
894-
Parameters: []v1alpha1.HelmParameter{
895-
{
896-
Name: "a",
897-
Value: "2", // this value changed
886+
}
887+
app.Status.OperationState = &v1alpha1.OperationState{
888+
Operation: v1alpha1.Operation{
889+
Sync: &v1alpha1.SyncOperation{
890+
Source: &v1alpha1.ApplicationSource{
891+
Helm: &v1alpha1.ApplicationSourceHelm{
892+
Parameters: []v1alpha1.HelmParameter{
893+
{
894+
Name: "a",
895+
Value: "2", // this value changed
896+
},
898897
},
899898
},
900899
},
901900
},
902901
},
903-
},
904-
Phase: synccommon.OperationFailed,
905-
SyncResult: &v1alpha1.SyncOperationResult{
902+
Phase: synccommon.OperationFailed,
903+
SyncResult: &v1alpha1.SyncOperationResult{
904+
Revision: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
905+
},
906+
}
907+
syncStatus := v1alpha1.SyncStatus{
908+
Status: v1alpha1.SyncStatusCodeOutOfSync,
906909
Revision: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
907-
},
908-
}
909-
cond, _ := ctrl.autoSync(app, &syncStatus, []v1alpha1.ResourceStatus{{Name: "guestbook", Kind: kube.DeploymentKind, Status: v1alpha1.SyncStatusCodeOutOfSync}}, true)
910-
assert.Nil(t, cond)
911-
app, err := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(test.FakeArgoCDNamespace).Get(t.Context(), "my-app", metav1.GetOptions{})
912-
require.NoError(t, err)
913-
assert.NotNil(t, app.Operation)
910+
}
911+
ctrl := newFakeController(&fakeData{apps: []runtime.Object{app}}, nil)
912+
cond, _ := ctrl.autoSync(app, &syncStatus, []v1alpha1.ResourceStatus{{Name: "guestbook", Kind: kube.DeploymentKind, Status: v1alpha1.SyncStatusCodeOutOfSync}}, true)
913+
assert.Nil(t, cond)
914+
app, err := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(test.FakeArgoCDNamespace).Get(t.Context(), "my-app", metav1.GetOptions{})
915+
require.NoError(t, err)
916+
assert.NotNil(t, app.Operation)
917+
})
918+
919+
t.Run("Multi sources", func(t *testing.T) {
920+
app := newFakeMultiSourceApp()
921+
app.Spec.Sources[0].Helm = &v1alpha1.ApplicationSourceHelm{
922+
Parameters: []v1alpha1.HelmParameter{
923+
{
924+
Name: "a",
925+
Value: "1",
926+
},
927+
},
928+
}
929+
ctrl := newFakeController(&fakeData{apps: []runtime.Object{app}}, nil)
930+
app.Status.OperationState.SyncResult.Revisions = []string{"z", "x", "v"}
931+
app.Status.OperationState.SyncResult.Sources[0].Helm = &v1alpha1.ApplicationSourceHelm{
932+
Parameters: []v1alpha1.HelmParameter{
933+
{
934+
Name: "a",
935+
Value: "2", // this value changed
936+
},
937+
},
938+
}
939+
syncStatus := v1alpha1.SyncStatus{
940+
Status: v1alpha1.SyncStatusCodeOutOfSync,
941+
Revisions: []string{"z", "x", "v"},
942+
}
943+
cond, _ := ctrl.autoSync(app, &syncStatus, []v1alpha1.ResourceStatus{{Name: "guestbook", Kind: kube.DeploymentKind, Status: v1alpha1.SyncStatusCodeOutOfSync}}, true)
944+
assert.Nil(t, cond)
945+
app, err := ctrl.applicationClientset.ArgoprojV1alpha1().Applications(test.FakeArgoCDNamespace).Get(t.Context(), "my-app", metav1.GetOptions{})
946+
require.NoError(t, err)
947+
assert.NotNil(t, app.Operation)
948+
})
914949
}
915950

916951
// TestFinalizeAppDeletion verifies application deletion

0 commit comments

Comments
 (0)