func()

in controllers/codebasebranch/codebasebranch_controller.go [233:286]


func (r *ReconcileCodebaseBranch) tryToDeleteCodebaseBranch(ctx context.Context, cb *codebaseApi.CodebaseBranch,
	deletionChain cbHandler.CodebaseBranchHandler,
) (*reconcile.Result, error) {
	if cb.GetDeletionTimestamp().IsZero() {
		if controllerutil.AddFinalizer(cb, codebaseBranchOperatorFinalizerName) {
			if err := r.client.Update(ctx, cb); err != nil {
				return &reconcile.Result{}, fmt.Errorf("failed to add finalizer to %v: %w", cb.Name, err)
			}
		}

		return nil, nil
	}

	if err := deletionChain.ServeRequest(ctx, cb); err != nil {
		if errors.Is(err, service.ErrJobFailed) {
			r.log.Error(err, "deletion job failed")

			timeout := r.setFailureCount(cb)

			if err = r.client.Status().Update(ctx, cb); err != nil {
				ctrl.LoggerFrom(ctx).Error(err, "failed to update CodebaseBranch status with failure count")
			}

			return &reconcile.Result{RequeueAfter: timeout}, nil
		}
	}

	if err := removeDirectoryIfExists(cb.Spec.CodebaseName, cb.Name, cb.Namespace); err != nil {
		return &reconcile.Result{}, fmt.Errorf("failed to remove codebase branch directory: %w", err)
	}

	err := retry.RetryOnConflict(retry.DefaultRetry, func() error {
		// Fetch the resource here; we need to refetch it on every try, since
		// if we got a conflict on the last update attempt then we need to get
		// the current version before making your own changes.
		if err := r.client.Get(ctx, types.NamespacedName{Namespace: cb.Namespace, Name: cb.Name}, cb); err != nil {
			return err //nolint:wrapcheck // We have to return original error
		}
		r.log.Info("Trying to remove finalizer from", "codebasebranch_name", cb.Name)
		controllerutil.RemoveFinalizer(cb, codebaseBranchOperatorFinalizerName)
		err := r.client.Update(ctx, cb)

		// We have to return err itself here (not wrapped inside another error)
		// so that RetryOnConflict can identify it correctly.
		return err //nolint:wrapcheck // We have to return original error
	})
	if err != nil {
		// May be conflict if max retries were hit, or may be something unrelated
		// like permissions or a network error
		return &reconcile.Result{}, fmt.Errorf("failed to remove finalizer from %v: %w", cb.Name, err)
	}

	return &reconcile.Result{}, nil
}