in controllers/stage/stage_controller.go [160:213]
func (r *ReconcileStage) tryToDeleteCDStage(ctx context.Context, stage *cdPipeApi.Stage) (*reconcile.Result, error) {
log := ctrl.LoggerFrom(ctx)
if stage.GetDeletionTimestamp().IsZero() {
if controllerutil.AddFinalizer(stage, envLabelDeletionFinalizer) {
if err := r.client.Update(ctx, stage); err != nil {
return &reconcile.Result{}, fmt.Errorf("failed to update cd stage: %w", err)
}
log.Info("Finalizer has been added to Stage", "finalizer", envLabelDeletionFinalizer)
}
return nil, nil
}
log.Info("Deleting Stage")
isLastStage, err := r.isLastStage(ctx, stage)
if err != nil {
return &reconcile.Result{}, fmt.Errorf("failed to check if stage is last: %w", err)
}
// if stage is not last, we should postpone deletion
// and wait for all parent stages to be deleted
// because in the chain we get previous stage
if !isLastStage {
log.Info("Stage is not last. Postpone deletion")
return &reconcile.Result{RequeueAfter: waitForParentStagesDeletion}, nil
}
log.Info("Stage is last. Delete chain")
ch, err := chain.CreateDeleteChain(ctx, r.client, stage)
if err != nil {
return &reconcile.Result{}, fmt.Errorf("failed to create delete chain: %w", err)
}
if err = ch.ServeRequest(ctx, stage); err != nil {
return &reconcile.Result{}, fmt.Errorf("failed to delete Stage: %w", err)
}
log.Info("Removing finalizer from Stage", "finalizer", envLabelDeletionFinalizer)
controllerutil.RemoveFinalizer(stage, envLabelDeletionFinalizer)
if err := r.client.Update(ctx, stage); err != nil {
return &reconcile.Result{}, fmt.Errorf("failed to update cd pipeline stage: %w", err)
}
log.Info("Stage has been deleted")
return &reconcile.Result{}, nil
}