func()

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
}