Skip to content

Commit b7f278a

Browse files
authored
fix: set updaterun progressing condition to false when finished (#1103)
1 parent 4d83e36 commit b7f278a

6 files changed

Lines changed: 94 additions & 32 deletions

File tree

pkg/controllers/updaterun/controller.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,11 +185,19 @@ func (r *Reconciler) ensureFinalizer(ctx context.Context, updateRun *placementv1
185185

186186
// recordUpdateRunSucceeded records the succeeded condition in the ClusterStagedUpdateRun status.
187187
func (r *Reconciler) recordUpdateRunSucceeded(ctx context.Context, updateRun *placementv1beta1.ClusterStagedUpdateRun) error {
188+
meta.SetStatusCondition(&updateRun.Status.Conditions, metav1.Condition{
189+
Type: string(placementv1beta1.StagedUpdateRunConditionProgressing),
190+
Status: metav1.ConditionFalse,
191+
ObservedGeneration: updateRun.Generation,
192+
Reason: condition.UpdateRunSucceededReason,
193+
Message: "All stages are completed",
194+
})
188195
meta.SetStatusCondition(&updateRun.Status.Conditions, metav1.Condition{
189196
Type: string(placementv1beta1.StagedUpdateRunConditionSucceeded),
190197
Status: metav1.ConditionTrue,
191198
ObservedGeneration: updateRun.Generation,
192199
Reason: condition.UpdateRunSucceededReason,
200+
Message: "All stages are completed successfully",
193201
})
194202
if updateErr := r.Client.Status().Update(ctx, updateRun); updateErr != nil {
195203
klog.ErrorS(updateErr, "Failed to update the ClusterStagedUpdateRun status as succeeded", "clusterStagedUpdateRun", klog.KObj(updateRun))
@@ -201,6 +209,13 @@ func (r *Reconciler) recordUpdateRunSucceeded(ctx context.Context, updateRun *pl
201209

202210
// recordUpdateRunFailed records the failed condition in the ClusterStagedUpdateRun status.
203211
func (r *Reconciler) recordUpdateRunFailed(ctx context.Context, updateRun *placementv1beta1.ClusterStagedUpdateRun, message string) error {
212+
meta.SetStatusCondition(&updateRun.Status.Conditions, metav1.Condition{
213+
Type: string(placementv1beta1.StagedUpdateRunConditionProgressing),
214+
Status: metav1.ConditionFalse,
215+
ObservedGeneration: updateRun.Generation,
216+
Reason: condition.UpdateRunFailedReason,
217+
Message: "The stages are aborted due to a non-recoverable error",
218+
})
204219
meta.SetStatusCondition(&updateRun.Status.Conditions, metav1.Condition{
205220
Type: string(placementv1beta1.StagedUpdateRunConditionSucceeded),
206221
Status: metav1.ConditionFalse,

pkg/controllers/updaterun/controller_integration_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,8 @@ func generateFalseCondition(obj client.Object, condType any) metav1.Condition {
559559
switch cond {
560560
case placementv1beta1.StageUpdatingConditionSucceeded:
561561
reason = condition.StageUpdatingFailedReason
562+
case placementv1beta1.StageUpdatingConditionProgressing:
563+
reason = condition.StageUpdatingWaitingReason
562564
}
563565
typeStr = string(cond)
564566
case placementv1beta1.ClusterUpdatingStatusConditionType:
@@ -581,3 +583,24 @@ func generateFalseCondition(obj client.Object, condType any) metav1.Condition {
581583
Reason: reason,
582584
}
583585
}
586+
587+
func generateFalseProgressingCondition(obj client.Object, condType any, succeeded bool) metav1.Condition {
588+
falseCond := generateFalseCondition(obj, condType)
589+
reason := ""
590+
switch condType {
591+
case placementv1beta1.StagedUpdateRunConditionProgressing:
592+
if succeeded {
593+
reason = condition.UpdateRunSucceededReason
594+
} else {
595+
reason = condition.UpdateRunFailedReason
596+
}
597+
case placementv1beta1.StageUpdatingConditionProgressing:
598+
if succeeded {
599+
reason = condition.StageUpdatingSucceededReason
600+
} else {
601+
reason = condition.StageUpdatingFailedReason
602+
}
603+
}
604+
falseCond.Reason = reason
605+
return falseCond
606+
}

pkg/controllers/updaterun/execution.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,7 @@ func (r *Reconciler) updateApprovalRequestAccepted(ctx context.Context, appReq *
380380
Status: metav1.ConditionTrue,
381381
ObservedGeneration: appReq.Generation,
382382
Reason: condition.ApprovalRequestApprovalAcceptedReason,
383+
Message: "The approval request has been approved and cannot be reverted",
383384
}
384385
meta.SetStatusCondition(&appReq.Status.Conditions, cond)
385386
if err := r.Client.Status().Update(ctx, appReq); err != nil {
@@ -443,6 +444,7 @@ func markUpdateRunStarted(updateRun *placementv1beta1.ClusterStagedUpdateRun) {
443444
Status: metav1.ConditionTrue,
444445
ObservedGeneration: updateRun.Generation,
445446
Reason: condition.UpdateRunStartedReason,
447+
Message: "The stages started updating",
446448
})
447449
}
448450

@@ -456,6 +458,7 @@ func markStageUpdatingStarted(stageUpdatingStatus *placementv1beta1.StageUpdatin
456458
Status: metav1.ConditionTrue,
457459
ObservedGeneration: generation,
458460
Reason: condition.StageUpdatingStartedReason,
461+
Message: "Clusters in the stage started updating",
459462
})
460463
}
461464

@@ -466,6 +469,7 @@ func markStageUpdatingWaiting(stageUpdatingStatus *placementv1beta1.StageUpdatin
466469
Status: metav1.ConditionFalse,
467470
ObservedGeneration: generation,
468471
Reason: condition.StageUpdatingWaitingReason,
472+
Message: "All clusters in the stage are updated, waiting for after-stage tasks to complete",
469473
})
470474
}
471475

@@ -474,11 +478,19 @@ func markStageUpdatingSucceeded(stageUpdatingStatus *placementv1beta1.StageUpdat
474478
if stageUpdatingStatus.EndTime == nil {
475479
stageUpdatingStatus.EndTime = &metav1.Time{Time: time.Now()}
476480
}
481+
meta.SetStatusCondition(&stageUpdatingStatus.Conditions, metav1.Condition{
482+
Type: string(placementv1beta1.StageUpdatingConditionProgressing),
483+
Status: metav1.ConditionFalse,
484+
ObservedGeneration: generation,
485+
Reason: condition.StageUpdatingSucceededReason,
486+
Message: "All clusters in the stage are updated and after-stage tasks are completed",
487+
})
477488
meta.SetStatusCondition(&stageUpdatingStatus.Conditions, metav1.Condition{
478489
Type: string(placementv1beta1.StageUpdatingConditionSucceeded),
479490
Status: metav1.ConditionTrue,
480491
ObservedGeneration: generation,
481492
Reason: condition.StageUpdatingSucceededReason,
493+
Message: "Stage update completed successfully",
482494
})
483495
}
484496

@@ -487,6 +499,13 @@ func markStageUpdatingFailed(stageUpdatingStatus *placementv1beta1.StageUpdating
487499
if stageUpdatingStatus.EndTime == nil {
488500
stageUpdatingStatus.EndTime = &metav1.Time{Time: time.Now()}
489501
}
502+
meta.SetStatusCondition(&stageUpdatingStatus.Conditions, metav1.Condition{
503+
Type: string(placementv1beta1.StageUpdatingConditionProgressing),
504+
Status: metav1.ConditionFalse,
505+
ObservedGeneration: generation,
506+
Reason: condition.StageUpdatingFailedReason,
507+
Message: "Stage update aborted due to a non-recoverable error",
508+
})
490509
meta.SetStatusCondition(&stageUpdatingStatus.Conditions, metav1.Condition{
491510
Type: string(placementv1beta1.StageUpdatingConditionSucceeded),
492511
Status: metav1.ConditionFalse,
@@ -503,6 +522,7 @@ func markClusterUpdatingStarted(clusterUpdatingStatus *placementv1beta1.ClusterU
503522
Status: metav1.ConditionTrue,
504523
ObservedGeneration: generation,
505524
Reason: condition.ClusterUpdatingStartedReason,
525+
Message: "Cluster update started",
506526
})
507527
}
508528

@@ -513,6 +533,7 @@ func markClusterUpdatingSucceeded(clusterUpdatingStatus *placementv1beta1.Cluste
513533
Status: metav1.ConditionTrue,
514534
ObservedGeneration: generation,
515535
Reason: condition.ClusterUpdatingSucceededReason,
536+
Message: "Cluster update completed successfully",
516537
})
517538
}
518539

@@ -534,6 +555,7 @@ func markAfterStageRequestCreated(afterStageTaskStatus *placementv1beta1.AfterSt
534555
Status: metav1.ConditionTrue,
535556
ObservedGeneration: generation,
536557
Reason: condition.AfterStageTaskApprovalRequestCreatedReason,
558+
Message: "ClusterApprovalRequest is created",
537559
})
538560
}
539561

@@ -544,6 +566,7 @@ func markAfterStageRequestApproved(afterStageTaskStatus *placementv1beta1.AfterS
544566
Status: metav1.ConditionTrue,
545567
ObservedGeneration: generation,
546568
Reason: condition.AfterStageTaskApprovalRequestApprovedReason,
569+
Message: "ClusterApprovalRequest is approved",
547570
})
548571
}
549572

@@ -554,5 +577,6 @@ func markAfterStageWaitTimeElapsed(afterStageTaskStatus *placementv1beta1.AfterS
554577
Status: metav1.ConditionTrue,
555578
ObservedGeneration: generation,
556579
Reason: condition.AfterStageTaskWaitTimeElapsedReason,
580+
Message: "Wait time elapsed",
557581
})
558582
}

pkg/controllers/updaterun/execution_integration_test.go

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -257,10 +257,8 @@ var _ = Describe("UpdateRun execution tests", func() {
257257
Expect(k8sClient.Status().Update(ctx, binding)).Should(Succeed(), "failed to update the binding status")
258258

259259
By("Validating the 5th cluster has succeeded and stage waiting for AfterStageTasks")
260-
stageWaitingCondition := generateFalseCondition(updateRun, placementv1beta1.StageUpdatingConditionProgressing)
261-
stageWaitingCondition.Reason = condition.StageUpdatingWaitingReason
262260
wantStatus.StagesStatus[0].Clusters[4].Conditions = append(wantStatus.StagesStatus[0].Clusters[4].Conditions, generateTrueCondition(updateRun, placementv1beta1.ClusterUpdatingConditionSucceeded))
263-
wantStatus.StagesStatus[0].Conditions[0] = stageWaitingCondition // The progressing condition now becomes false with waiting reason.
261+
wantStatus.StagesStatus[0].Conditions[0] = generateFalseCondition(updateRun, placementv1beta1.StageUpdatingConditionProgressing) // The progressing condition now becomes false with waiting reason.
264262
wantStatus.StagesStatus[0].AfterStageTaskStatus[1].Conditions = append(wantStatus.StagesStatus[0].AfterStageTaskStatus[1].Conditions,
265263
generateTrueCondition(updateRun, placementv1beta1.AfterStageTaskConditionApprovalRequestCreated))
266264
validateClusterStagedUpdateRunStatus(ctx, updateRun, wantStatus, "")
@@ -307,7 +305,8 @@ var _ = Describe("UpdateRun execution tests", func() {
307305
// Approval afterStageTask completed.
308306
wantStatus.StagesStatus[0].AfterStageTaskStatus[1].Conditions = append(wantStatus.StagesStatus[0].AfterStageTaskStatus[1].Conditions,
309307
generateTrueCondition(updateRun, placementv1beta1.AfterStageTaskConditionApprovalRequestApproved))
310-
// 1st stage completed.
308+
// 1st stage completed, mark progressing condition reason as succeeded and add succeeded condition.
309+
wantStatus.StagesStatus[0].Conditions[0] = generateFalseProgressingCondition(updateRun, placementv1beta1.StageUpdatingConditionProgressing, true)
311310
wantStatus.StagesStatus[0].Conditions = append(wantStatus.StagesStatus[0].Conditions, generateTrueCondition(updateRun, placementv1beta1.StageUpdatingConditionSucceeded))
312311
// 2nd stage started.
313312
wantStatus.StagesStatus[1].Conditions = append(wantStatus.StagesStatus[1].Conditions, generateTrueCondition(updateRun, placementv1beta1.StageUpdatingConditionProgressing))
@@ -403,9 +402,7 @@ var _ = Describe("UpdateRun execution tests", func() {
403402

404403
By("Validating the 5th cluster has succeeded and the stage waiting for AfterStageTask")
405404
wantStatus.StagesStatus[1].Clusters[4].Conditions = append(wantStatus.StagesStatus[1].Clusters[4].Conditions, generateTrueCondition(updateRun, placementv1beta1.ClusterUpdatingConditionSucceeded))
406-
stageWaitingCondition := generateFalseCondition(updateRun, placementv1beta1.StageUpdatingConditionProgressing)
407-
stageWaitingCondition.Reason = condition.StageUpdatingWaitingReason
408-
wantStatus.StagesStatus[1].Conditions[0] = stageWaitingCondition // The progressing condition now becomes false with waiting reason.
405+
wantStatus.StagesStatus[1].Conditions[0] = generateFalseCondition(updateRun, placementv1beta1.StageUpdatingConditionProgressing) // The progressing condition now becomes false with waiting reason.
409406
wantStatus.StagesStatus[1].AfterStageTaskStatus[0].Conditions = append(wantStatus.StagesStatus[1].AfterStageTaskStatus[0].Conditions,
410407
generateTrueCondition(updateRun, placementv1beta1.AfterStageTaskConditionApprovalRequestCreated))
411408
validateClusterStagedUpdateRunStatus(ctx, updateRun, wantStatus, "")
@@ -450,6 +447,7 @@ var _ = Describe("UpdateRun execution tests", func() {
450447
generateTrueCondition(updateRun, placementv1beta1.AfterStageTaskConditionApprovalRequestApproved))
451448
wantStatus.StagesStatus[1].AfterStageTaskStatus[1].Conditions = append(wantStatus.StagesStatus[1].AfterStageTaskStatus[1].Conditions,
452449
generateTrueCondition(updateRun, placementv1beta1.AfterStageTaskConditionWaitTimeElapsed))
450+
wantStatus.StagesStatus[1].Conditions[0] = generateFalseProgressingCondition(updateRun, placementv1beta1.StageUpdatingConditionProgressing, true)
453451
wantStatus.StagesStatus[1].Conditions = append(wantStatus.StagesStatus[1].Conditions, generateTrueCondition(updateRun, placementv1beta1.StageUpdatingConditionSucceeded))
454452

455453
wantStatus.DeletionStageStatus.Conditions = append(wantStatus.DeletionStageStatus.Conditions, generateTrueCondition(updateRun, placementv1beta1.StageUpdatingConditionProgressing))
@@ -500,7 +498,11 @@ var _ = Describe("UpdateRun execution tests", func() {
500498
for i := range wantStatus.DeletionStageStatus.Clusters {
501499
wantStatus.DeletionStageStatus.Clusters[i].Conditions = append(wantStatus.DeletionStageStatus.Clusters[i].Conditions, generateTrueCondition(updateRun, placementv1beta1.ClusterUpdatingConditionSucceeded))
502500
}
501+
// Mark the stage progressing condition as false with succeeded reason and add succeeded condition.
502+
wantStatus.DeletionStageStatus.Conditions[0] = generateFalseProgressingCondition(updateRun, placementv1beta1.StageUpdatingConditionProgressing, true)
503503
wantStatus.DeletionStageStatus.Conditions = append(wantStatus.DeletionStageStatus.Conditions, generateTrueCondition(updateRun, placementv1beta1.StageUpdatingConditionSucceeded))
504+
// Mark updateRun progressing condition as false with succeeded reason and add succeeded condition.
505+
wantStatus.Conditions[1] = generateFalseProgressingCondition(updateRun, placementv1beta1.StagedUpdateRunConditionProgressing, true)
504506
wantStatus.Conditions = append(wantStatus.Conditions, generateTrueCondition(updateRun, placementv1beta1.StagedUpdateRunConditionSucceeded))
505507
validateClusterStagedUpdateRunStatus(ctx, updateRun, wantStatus, "")
506508
})
@@ -595,10 +597,8 @@ var _ = Describe("UpdateRun execution tests", func() {
595597
Expect(k8sClient.Status().Update(ctx, binding)).Should(Succeed(), "failed to update the binding status")
596598

597599
By("Validating the 5th cluster has succeeded and stage waiting for AfterStageTasks")
598-
stageWaitingCondition := generateFalseCondition(updateRun, placementv1beta1.StageUpdatingConditionProgressing)
599-
stageWaitingCondition.Reason = condition.StageUpdatingWaitingReason
600600
wantStatus.StagesStatus[0].Clusters[4].Conditions = append(wantStatus.StagesStatus[0].Clusters[4].Conditions, generateTrueCondition(updateRun, placementv1beta1.ClusterUpdatingConditionSucceeded))
601-
wantStatus.StagesStatus[0].Conditions[0] = stageWaitingCondition // The progressing condition now becomes false with waiting reason.
601+
wantStatus.StagesStatus[0].Conditions[0] = generateFalseCondition(updateRun, placementv1beta1.StageUpdatingConditionProgressing) // The progressing condition now becomes false with waiting reason.
602602
validateClusterStagedUpdateRunStatus(ctx, updateRun, wantStatus, "")
603603
})
604604

@@ -608,6 +608,7 @@ var _ = Describe("UpdateRun execution tests", func() {
608608
wantStatus.StagesStatus[0].AfterStageTaskStatus[0].Conditions = append(wantStatus.StagesStatus[0].AfterStageTaskStatus[0].Conditions,
609609
generateTrueCondition(updateRun, placementv1beta1.AfterStageTaskConditionWaitTimeElapsed))
610610
// 1st stage completed.
611+
wantStatus.StagesStatus[0].Conditions[0] = generateFalseProgressingCondition(updateRun, placementv1beta1.StageUpdatingConditionProgressing, true)
611612
wantStatus.StagesStatus[0].Conditions = append(wantStatus.StagesStatus[0].Conditions, generateTrueCondition(updateRun, placementv1beta1.StageUpdatingConditionSucceeded))
612613
// 2nd stage started.
613614
wantStatus.StagesStatus[1].Conditions = append(wantStatus.StagesStatus[1].Conditions, generateTrueCondition(updateRun, placementv1beta1.StageUpdatingConditionProgressing))
@@ -699,9 +700,7 @@ var _ = Describe("UpdateRun execution tests", func() {
699700

700701
By("Validating the 5th cluster has succeeded and the stage waiting for AfterStageTask")
701702
wantStatus.StagesStatus[1].Clusters[4].Conditions = append(wantStatus.StagesStatus[1].Clusters[4].Conditions, generateTrueCondition(updateRun, placementv1beta1.ClusterUpdatingConditionSucceeded))
702-
stageWaitingCondition := generateFalseCondition(updateRun, placementv1beta1.StageUpdatingConditionProgressing)
703-
stageWaitingCondition.Reason = condition.StageUpdatingWaitingReason
704-
wantStatus.StagesStatus[1].Conditions[0] = stageWaitingCondition // The progressing condition now becomes false with waiting reason.
703+
wantStatus.StagesStatus[1].Conditions[0] = generateFalseCondition(updateRun, placementv1beta1.StageUpdatingConditionProgressing) // The progressing condition now becomes false with waiting reason.
705704
wantStatus.StagesStatus[1].AfterStageTaskStatus[0].Conditions = append(wantStatus.StagesStatus[1].AfterStageTaskStatus[0].Conditions,
706705
generateTrueCondition(updateRun, placementv1beta1.AfterStageTaskConditionApprovalRequestCreated))
707706
validateClusterStagedUpdateRunStatus(ctx, updateRun, wantStatus, "")
@@ -744,6 +743,7 @@ var _ = Describe("UpdateRun execution tests", func() {
744743
By("Validating the 2nd stage has completed and the delete stage has started")
745744
wantStatus.StagesStatus[1].AfterStageTaskStatus[0].Conditions = append(wantStatus.StagesStatus[1].AfterStageTaskStatus[0].Conditions,
746745
generateTrueCondition(updateRun, placementv1beta1.AfterStageTaskConditionApprovalRequestApproved))
746+
wantStatus.StagesStatus[1].Conditions[0] = generateFalseProgressingCondition(updateRun, placementv1beta1.StageUpdatingConditionProgressing, true)
747747
wantStatus.StagesStatus[1].Conditions = append(wantStatus.StagesStatus[1].Conditions, generateTrueCondition(updateRun, placementv1beta1.StageUpdatingConditionSucceeded))
748748

749749
wantStatus.DeletionStageStatus.Conditions = append(wantStatus.DeletionStageStatus.Conditions, generateTrueCondition(updateRun, placementv1beta1.StageUpdatingConditionProgressing))
@@ -784,7 +784,9 @@ var _ = Describe("UpdateRun execution tests", func() {
784784
for i := range wantStatus.DeletionStageStatus.Clusters {
785785
wantStatus.DeletionStageStatus.Clusters[i].Conditions = append(wantStatus.DeletionStageStatus.Clusters[i].Conditions, generateTrueCondition(updateRun, placementv1beta1.ClusterUpdatingConditionSucceeded))
786786
}
787+
wantStatus.DeletionStageStatus.Conditions[0] = generateFalseProgressingCondition(updateRun, placementv1beta1.StageUpdatingConditionProgressing, true)
787788
wantStatus.DeletionStageStatus.Conditions = append(wantStatus.DeletionStageStatus.Conditions, generateTrueCondition(updateRun, placementv1beta1.StageUpdatingConditionSucceeded))
789+
wantStatus.Conditions[1] = generateFalseProgressingCondition(updateRun, placementv1beta1.StagedUpdateRunConditionProgressing, true)
788790
wantStatus.Conditions = append(wantStatus.Conditions, generateTrueCondition(updateRun, placementv1beta1.StagedUpdateRunConditionSucceeded))
789791
validateClusterStagedUpdateRunStatus(ctx, updateRun, wantStatus, "")
790792
})
@@ -826,7 +828,9 @@ var _ = Describe("UpdateRun execution tests", func() {
826828

827829
By("Validating the updateRun has failed")
828830
wantStatus.StagesStatus[0].Clusters[0].Conditions = append(wantStatus.StagesStatus[0].Clusters[0].Conditions, generateFalseCondition(updateRun, placementv1beta1.ClusterUpdatingConditionSucceeded))
831+
wantStatus.StagesStatus[0].Conditions[0] = generateFalseProgressingCondition(updateRun, placementv1beta1.StageUpdatingConditionProgressing, false)
829832
wantStatus.StagesStatus[0].Conditions = append(wantStatus.StagesStatus[0].Conditions, generateFalseCondition(updateRun, placementv1beta1.StageUpdatingConditionSucceeded))
833+
wantStatus.Conditions[1] = generateFalseProgressingCondition(updateRun, placementv1beta1.StagedUpdateRunConditionProgressing, false)
830834
wantStatus.Conditions = append(wantStatus.Conditions, generateFalseCondition(updateRun, placementv1beta1.StagedUpdateRunConditionSucceeded))
831835
validateClusterStagedUpdateRunStatus(ctx, updateRun, wantStatus, "")
832836
})

0 commit comments

Comments
 (0)