Skip to content

Commit

Permalink
fix: status patch
Browse files Browse the repository at this point in the history
  • Loading branch information
adityathebe committed Jan 28, 2025
1 parent e5afc46 commit 3de0e86
Showing 1 changed file with 17 additions and 6 deletions.
23 changes: 17 additions & 6 deletions reconciler.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@ import (
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
)

// Custom Resources that uses "status" subresource
// must implement this interface.
type StatusPatchGenerator interface {
GenerateStatusPatch(previousState runtime.Object) client.Patch
}

func SetupReconciler[T any, PT interface {
*T
client.Object
Expand Down Expand Up @@ -53,6 +59,8 @@ type Reconciler[T any, PT interface {
func (r *Reconciler[T, PT]) Reconcile(ctx gocontext.Context, req ctrl.Request) (ctrl.Result, error) {
obj := PT(new(T))

original := obj.DeepCopyObject()

err := r.Get(ctx, req.NamespacedName, obj)
if err != nil {
if errors.IsNotFound(err) {
Expand All @@ -64,7 +72,7 @@ func (r *Reconciler[T, PT]) Reconcile(ctx gocontext.Context, req ctrl.Request) (
resourceName := fmt.Sprintf("%s[%s]", obj.GetObjectKind().GroupVersionKind().Kind, obj.GetUID())

if !obj.GetDeletionTimestamp().IsZero() {
logger.Infof("[kopper] deleting %s", resourceName)
logger.V(2).Infof("[kopper] deleting %s", resourceName)
if err := r.OnDeleteFunc(r.DutyContext, string(obj.GetUID())); err != nil {
logger.Errorf("[kopper] failed to delete %s: %v", resourceName, err)
return ctrl.Result{Requeue: true, RequeueAfter: 2 * time.Minute}, err
Expand All @@ -86,14 +94,17 @@ func (r *Reconciler[T, PT]) Reconcile(ctx gocontext.Context, req ctrl.Request) (
return ctrl.Result{Requeue: true, RequeueAfter: 2 * time.Minute}, err
}

if err := r.Status().Update(r.DutyContext, obj); err != nil {
logger.Errorf("[kopper] failed to update status %s: %v", resourceName, err)
return ctrl.Result{Requeue: true, RequeueAfter: 2 * time.Minute}, err
if mgr, ok := any(obj).(StatusPatchGenerator); ok {
if patch := mgr.GenerateStatusPatch(original); patch != nil {
if err := r.Status().Patch(r.DutyContext, obj, patch); err != nil {
logger.Errorf("[kopper] failed to update status %s: %v", resourceName, err)
return ctrl.Result{Requeue: true, RequeueAfter: 2 * time.Minute}, err
}
}
}

logger.Infof("[kopper] upserted %s", resourceName)
logger.V(2).Infof("[kopper] upserted %s", resourceName)
return ctrl.Result{}, nil

}

// SetupWithManager sets up the controller with the Manager.
Expand Down

0 comments on commit 3de0e86

Please sign in to comment.