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
}