func()

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
}