Skip to content

Commit aaed35c

Browse files
gcp-cherry-pick-bot[bot]Fserotjametcarlosrejano
authoredFeb 22, 2025··
fix(applicationset): ApplicationSets with rolling sync stuck in Pending (cherry-pick #20230) (#21948)
Signed-off-by: Fabián Sellés <fabian.selles@adevinta.com> Co-authored-by: Fabián Sellés Rosa <1088313+Fsero@users.noreply.github.com> Co-authored-by: Thibault Jamet <tjamet@users.noreply.github.com> Co-authored-by: Carlos Rejano <carlosrejanoromeu@gmail.com>

File tree

2 files changed

+50
-63
lines changed

2 files changed

+50
-63
lines changed
 

‎applicationset/controllers/applicationset_controller.go

+14-23
Original file line numberDiff line numberDiff line change
@@ -1060,19 +1060,20 @@ func (r *ApplicationSetReconciler) updateApplicationSetApplicationStatus(ctx con
10601060
Message: "No Application status found, defaulting status to Waiting.",
10611061
Status: "Waiting",
10621062
Step: strconv.Itoa(getAppStep(app.Name, appStepMap)),
1063-
TargetRevisions: app.Status.GetRevisions(),
10641063
}
10651064
} else {
10661065
// we have an existing AppStatus
10671066
currentAppStatus = applicationSet.Status.ApplicationStatus[idx]
1068-
1069-
// upgrade any existing AppStatus that might have been set by an older argo-cd version
1070-
// note: currentAppStatus.TargetRevisions may be set to empty list earlier during migrations,
1071-
// to prevent other usage of r.Client.Status().Update to fail before reaching here.
1072-
if len(currentAppStatus.TargetRevisions) == 0 {
1073-
currentAppStatus.TargetRevisions = app.Status.GetRevisions()
1067+
if !reflect.DeepEqual(currentAppStatus.TargetRevisions, app.Status.GetRevisions()) {
1068+
currentAppStatus.Message = "Application has pending changes, setting status to Waiting."
10741069
}
10751070
}
1071+
if !reflect.DeepEqual(currentAppStatus.TargetRevisions, app.Status.GetRevisions()) {
1072+
currentAppStatus.TargetRevisions = app.Status.GetRevisions()
1073+
currentAppStatus.Status = "Waiting"
1074+
currentAppStatus.LastTransitionTime = &now
1075+
currentAppStatus.Step = strconv.Itoa(getAppStep(currentAppStatus.Application, appStepMap))
1076+
}
10761077

10771078
appOutdated := false
10781079
if progressiveSyncsRollingSyncStrategyEnabled(applicationSet) {
@@ -1085,25 +1086,15 @@ func (r *ApplicationSetReconciler) updateApplicationSetApplicationStatus(ctx con
10851086
currentAppStatus.Status = "Waiting"
10861087
currentAppStatus.Message = "Application has pending changes, setting status to Waiting."
10871088
currentAppStatus.Step = strconv.Itoa(getAppStep(currentAppStatus.Application, appStepMap))
1088-
currentAppStatus.TargetRevisions = app.Status.GetRevisions()
10891089
}
10901090

10911091
if currentAppStatus.Status == "Pending" {
1092-
if operationPhaseString == "Succeeded" {
1093-
revisions := []string{}
1094-
if len(app.Status.OperationState.SyncResult.Revisions) > 0 {
1095-
revisions = app.Status.OperationState.SyncResult.Revisions
1096-
} else if app.Status.OperationState.SyncResult.Revision != "" {
1097-
revisions = append(revisions, app.Status.OperationState.SyncResult.Revision)
1098-
}
1099-
1100-
if reflect.DeepEqual(currentAppStatus.TargetRevisions, revisions) {
1101-
logCtx.Infof("Application %v has completed a sync successfully, updating its ApplicationSet status to Progressing", app.Name)
1102-
currentAppStatus.LastTransitionTime = &now
1103-
currentAppStatus.Status = "Progressing"
1104-
currentAppStatus.Message = "Application resource completed a sync successfully, updating status from Pending to Progressing."
1105-
currentAppStatus.Step = strconv.Itoa(getAppStep(currentAppStatus.Application, appStepMap))
1106-
}
1092+
if !appOutdated && operationPhaseString == "Succeeded" {
1093+
logCtx.Infof("Application %v has completed a sync successfully, updating its ApplicationSet status to Progressing", app.Name)
1094+
currentAppStatus.LastTransitionTime = &now
1095+
currentAppStatus.Status = "Progressing"
1096+
currentAppStatus.Message = "Application resource completed a sync successfully, updating status from Pending to Progressing."
1097+
currentAppStatus.Step = strconv.Itoa(getAppStep(currentAppStatus.Application, appStepMap))
11071098
} else if operationPhaseString == "Running" || healthStatusString == "Progressing" {
11081099
logCtx.Infof("Application %v has entered Progressing status, updating its ApplicationSet status to Progressing", app.Name)
11091100
currentAppStatus.LastTransitionTime = &now

‎applicationset/controllers/applicationset_controller_test.go

+36-40
Original file line numberDiff line numberDiff line change
@@ -4733,6 +4733,9 @@ func TestUpdateApplicationSetApplicationStatus(t *testing.T) {
47334733
Health: v1alpha1.HealthStatus{
47344734
Status: health.HealthStatusProgressing,
47354735
},
4736+
Sync: v1alpha1.SyncStatus{
4737+
Revision: "Next",
4738+
},
47364739
},
47374740
},
47384741
},
@@ -4796,7 +4799,8 @@ func TestUpdateApplicationSetApplicationStatus(t *testing.T) {
47964799
Phase: common.OperationRunning,
47974800
},
47984801
Sync: v1alpha1.SyncStatus{
4799-
Status: v1alpha1.SyncStatusCodeSynced,
4802+
Status: v1alpha1.SyncStatusCodeSynced,
4803+
Revision: "Current",
48004804
},
48014805
},
48024806
},
@@ -4861,7 +4865,8 @@ func TestUpdateApplicationSetApplicationStatus(t *testing.T) {
48614865
Phase: common.OperationSucceeded,
48624866
},
48634867
Sync: v1alpha1.SyncStatus{
4864-
Status: v1alpha1.SyncStatusCodeSynced,
4868+
Status: v1alpha1.SyncStatusCodeSynced,
4869+
Revision: "Next",
48654870
},
48664871
},
48674872
},
@@ -4926,7 +4931,8 @@ func TestUpdateApplicationSetApplicationStatus(t *testing.T) {
49264931
Phase: common.OperationSucceeded,
49274932
},
49284933
Sync: v1alpha1.SyncStatus{
4929-
Status: v1alpha1.SyncStatusCodeSynced,
4934+
Revision: "Current",
4935+
Status: v1alpha1.SyncStatusCodeSynced,
49304936
},
49314937
},
49324938
},
@@ -5166,7 +5172,7 @@ func TestUpdateApplicationSetApplicationStatus(t *testing.T) {
51665172
},
51675173
},
51685174
{
5169-
name: "does not progresses a pending application with a successful sync triggered by controller with invalid revision to progressing",
5175+
name: "removes the appStatus for applications that no longer exist",
51705176
appSet: v1alpha1.ApplicationSet{
51715177
ObjectMeta: metav1.ObjectMeta{
51725178
Name: "name",
@@ -5190,14 +5196,18 @@ func TestUpdateApplicationSetApplicationStatus(t *testing.T) {
51905196
Status: v1alpha1.ApplicationSetStatus{
51915197
ApplicationStatus: []v1alpha1.ApplicationSetApplicationStatus{
51925198
{
5193-
Application: "app1",
5194-
LastTransitionTime: &metav1.Time{
5195-
Time: time.Now().Add(time.Duration(-1) * time.Minute),
5196-
},
5197-
Message: "",
5198-
Status: "Pending",
5199+
Application: "app1",
5200+
Message: "Application has pending changes, setting status to Waiting.",
5201+
Status: "Waiting",
51995202
Step: "1",
5200-
TargetRevisions: []string{"Next"},
5203+
TargetRevisions: []string{"Current"},
5204+
},
5205+
{
5206+
Application: "app2",
5207+
Message: "Application has pending changes, setting status to Waiting.",
5208+
Status: "Waiting",
5209+
Step: "1",
5210+
TargetRevisions: []string{"Current"},
52015211
},
52025212
},
52035213
},
@@ -5209,25 +5219,14 @@ func TestUpdateApplicationSetApplicationStatus(t *testing.T) {
52095219
},
52105220
Status: v1alpha1.ApplicationStatus{
52115221
Health: v1alpha1.HealthStatus{
5212-
Status: health.HealthStatusDegraded,
5222+
Status: health.HealthStatusHealthy,
52135223
},
52145224
OperationState: &v1alpha1.OperationState{
52155225
Phase: common.OperationSucceeded,
5216-
StartedAt: metav1.Time{
5217-
Time: time.Now(),
5218-
},
5219-
Operation: v1alpha1.Operation{
5220-
InitiatedBy: v1alpha1.OperationInitiator{
5221-
Username: "applicationset-controller",
5222-
Automated: true,
5223-
},
5224-
},
5225-
SyncResult: &v1alpha1.SyncOperationResult{
5226-
Revision: "Previous",
5227-
},
52285226
},
52295227
Sync: v1alpha1.SyncStatus{
5230-
Status: v1alpha1.SyncStatusCodeSynced,
5228+
Status: v1alpha1.SyncStatusCodeSynced,
5229+
Revision: "Current",
52315230
},
52325231
},
52335232
},
@@ -5238,15 +5237,15 @@ func TestUpdateApplicationSetApplicationStatus(t *testing.T) {
52385237
expectedAppStatus: []v1alpha1.ApplicationSetApplicationStatus{
52395238
{
52405239
Application: "app1",
5241-
Message: "",
5242-
Status: "Pending",
5240+
Message: "Application resource is already Healthy, updating status from Waiting to Healthy.",
5241+
Status: "Healthy",
52435242
Step: "1",
5244-
TargetRevisions: []string{"Next"},
5243+
TargetRevisions: []string{"Current"},
52455244
},
52465245
},
52475246
},
52485247
{
5249-
name: "removes the appStatus for applications that no longer exist",
5248+
name: "progresses a pending synced application with an old revision to progressing with the Current one",
52505249
appSet: v1alpha1.ApplicationSet{
52515250
ObjectMeta: metav1.ObjectMeta{
52525251
Name: "name",
@@ -5271,17 +5270,10 @@ func TestUpdateApplicationSetApplicationStatus(t *testing.T) {
52715270
ApplicationStatus: []v1alpha1.ApplicationSetApplicationStatus{
52725271
{
52735272
Application: "app1",
5274-
Message: "Application has pending changes, setting status to Waiting.",
5275-
Status: "Waiting",
5276-
Step: "1",
5277-
TargetRevisions: []string{"Current"},
5278-
},
5279-
{
5280-
Application: "app2",
5281-
Message: "Application has pending changes, setting status to Waiting.",
5282-
Status: "Waiting",
5273+
Message: "",
5274+
Status: "Pending",
52835275
Step: "1",
5284-
TargetRevisions: []string{"Current"},
5276+
TargetRevisions: []string{"Old"},
52855277
},
52865278
},
52875279
},
@@ -5297,9 +5289,13 @@ func TestUpdateApplicationSetApplicationStatus(t *testing.T) {
52975289
},
52985290
OperationState: &v1alpha1.OperationState{
52995291
Phase: common.OperationSucceeded,
5292+
SyncResult: &v1alpha1.SyncOperationResult{
5293+
Revision: "Current",
5294+
},
53005295
},
53015296
Sync: v1alpha1.SyncStatus{
5302-
Status: v1alpha1.SyncStatusCodeSynced,
5297+
Status: v1alpha1.SyncStatusCodeSynced,
5298+
Revisions: []string{"Current"},
53035299
},
53045300
},
53055301
},

0 commit comments

Comments
 (0)
Please sign in to comment.