in controllers/cdpipeline/cdpipeline_controller.go [124:177]
func (r *ReconcileCDPipeline) tryToDeletePipeline(ctx context.Context, pipeline *cdPipeApi.CDPipeline) (*reconcile.Result, error) {
log := ctrl.LoggerFrom(ctx)
if pipeline.GetDeletionTimestamp().IsZero() {
if controllerutil.AddFinalizer(pipeline, ownedStagesFinalizer) {
if err := r.client.Update(ctx, pipeline); err != nil {
return &reconcile.Result{}, fmt.Errorf("failed to update pipeline: %w", err)
}
log.Info("Finalizer has been added to CDPipeline", "finalizer", ownedStagesFinalizer)
}
return nil, nil
}
log.Info("Deleting CDPipeline")
hasStages, err := r.hasActiveOwnedStages(ctx, pipeline)
if err != nil {
return &reconcile.Result{}, err
}
// if pipeline has active stages, postpone deletion
// because if we delete pipeline before stages,
// stages deletion chain will be broken
if hasStages {
log.Info("Deleting stages of CDPipeline")
if err := r.client.DeleteAllOf(
ctx,
&cdPipeApi.Stage{},
client.InNamespace(pipeline.Namespace),
client.MatchingLabels(map[string]string{cdPipeApi.StageCdPipelineLabelName: pipeline.Name}),
); err != nil {
return &reconcile.Result{}, fmt.Errorf("failed to delete stages: %w", err)
}
log.Info("CDPipeline has active stages. Postpone deletion")
return &reconcile.Result{RequeueAfter: waitForOwnedStagesDeletion}, nil
}
log.Info("Removing finalizer from CDPipeline", "finalizer", ownedStagesFinalizer)
controllerutil.RemoveFinalizer(pipeline, ownedStagesFinalizer)
if err := r.client.Update(ctx, pipeline); err != nil {
return &reconcile.Result{}, fmt.Errorf("failed to update pipeline: %w", err)
}
log.Info("CDPipeline has been deleted")
return &reconcile.Result{}, nil
}