Skip to content

Commit

Permalink
add ownerReference and update order of checks in dataimage reconcile
Browse files Browse the repository at this point in the history
Signed-off-by: Himanshu Roy <hroy@redhat.com>
  • Loading branch information
hroyrh committed Feb 20, 2025
1 parent 42b6875 commit 112295a
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 20 deletions.
14 changes: 0 additions & 14 deletions controllers/metal3.io/baremetalhost_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,20 +141,6 @@ func (r *BareMetalHostReconciler) Reconcile(ctx context.Context, request ctrl.Re
}
}

// If DataImage exists, add its ownerReference
dataImage := &metal3api.DataImage{}
err = r.Get(ctx, request.NamespacedName, dataImage)
if !(err != nil || ownerReferenceExists(host, dataImage)) {
if err := controllerutil.SetControllerReference(host, dataImage, r.Scheme()); err != nil {
return ctrl.Result{}, fmt.Errorf("could not set bmh as controller, %w", err)
}
if err := r.Update(ctx, dataImage); err != nil {
return ctrl.Result{}, fmt.Errorf("failure updating dataImage status, %w", err)
}

return ctrl.Result{Requeue: true}, nil
}

hostData, err := r.reconcileHostData(ctx, host, request)
if err != nil {
return ctrl.Result{}, errors.Wrap(err, "Could not reconcile host data")
Expand Down
27 changes: 21 additions & 6 deletions controllers/metal3.io/dataimage_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import (
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
"sigs.k8s.io/controller-runtime/pkg/event"
"sigs.k8s.io/controller-runtime/pkg/predicate"
)
Expand Down Expand Up @@ -108,6 +109,7 @@ func (r *DataImageReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
return ctrl.Result{Requeue: true, RequeueAfter: dataImageRetryDelay}, fmt.Errorf("could not load dataImage, %w", err)
}

// If a corresponding BareMetalHost is missing, keep retrying
bmh := &metal3api.BareMetalHost{}
if err := r.Get(ctx, req.NamespacedName, bmh); err != nil {
// There might not be any BareMetalHost for the DataImage
Expand All @@ -128,18 +130,25 @@ func (r *DataImageReconciler) Reconcile(ctx context.Context, req ctrl.Request) (

info := &rdiInfo{ctx: ctx, log: reqLogger, request: req, di: di, bmh: bmh}

if hasDetachedAnnotation(bmh) {
reqLogger.Info("the host is detached, not running reconciler")
return ctrl.Result{Requeue: true, RequeueAfter: dataImageUnmanagedRetryDelay}, nil
}

// If the reconciliation is paused, requeue
annotations := bmh.GetAnnotations()
if _, ok := annotations[metal3api.PausedAnnotation]; ok {
reqLogger.Info("host is paused, no work to do")
reqLogger.Info("host associated with dataImage is paused, no work to do")
return ctrl.Result{Requeue: false}, nil
}

// If DataImage exists, add its ownerReference
if !ownerReferenceExists(bmh, di) {
if err := controllerutil.SetOwnerReference(bmh, di, r.Scheme()); err != nil {
return ctrl.Result{Requeue: true, RequeueAfter: dataImageRetryDelay}, fmt.Errorf("could not set bmh as controller, %w", err)
}
if err := r.Update(ctx, di); err != nil {
return ctrl.Result{Requeue: true, RequeueAfter: dataImageRetryDelay}, fmt.Errorf("failure updating dataImage status, %w", err)
}

return ctrl.Result{Requeue: true}, nil
}

// Add finalizer for newly created DataImage
if di.DeletionTimestamp.IsZero() && !utils.StringInList(di.Finalizers, metal3api.DataImageFinalizer) {
reqLogger.Info("adding finalizer")
Expand All @@ -153,6 +162,12 @@ func (r *DataImageReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
return ctrl.Result{Requeue: true}, nil
}

// If the associated BMH is detached, keep requeuing till the annotation is removed
if hasDetachedAnnotation(bmh) {
reqLogger.Info("the host is detached, not running reconciler")
return ctrl.Result{Requeue: true, RequeueAfter: dataImageUnmanagedRetryDelay}, nil
}

// Create a provisioner that can access Ironic API
prov, err := r.ProvisionerFactory.NewProvisioner(ctx, provisioner.BuildHostDataNoBMC(*bmh), info.publishEvent)
if err != nil {
Expand Down

0 comments on commit 112295a

Please sign in to comment.