github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/controllers/core/uisession/reconciler.go (about)

     1  package uisession
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	"sigs.k8s.io/controller-runtime/pkg/builder"
     8  
     9  	apierrors "k8s.io/apimachinery/pkg/api/errors"
    10  	ctrl "sigs.k8s.io/controller-runtime"
    11  	ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
    12  	"sigs.k8s.io/controller-runtime/pkg/reconcile"
    13  
    14  	"github.com/tilt-dev/tilt/internal/hud/server"
    15  	"github.com/tilt-dev/tilt/pkg/apis/core/v1alpha1"
    16  )
    17  
    18  // The uisession.Reconciler is not a real reconciler because UIResource is not
    19  // a real API object.
    20  //
    21  // It's a fake status object that reports the Status of the legacy engine. The
    22  // uisession.Reconciler wathces that status and broadcasts it to the legacy web
    23  // UI.
    24  type Reconciler struct {
    25  	client ctrlclient.Client
    26  	wsList *server.WebsocketList
    27  }
    28  
    29  var _ reconcile.Reconciler = &Reconciler{}
    30  
    31  func NewReconciler(client ctrlclient.Client, wsList *server.WebsocketList) *Reconciler {
    32  	return &Reconciler{
    33  		client: client,
    34  		wsList: wsList,
    35  	}
    36  }
    37  
    38  func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    39  	session := &v1alpha1.UISession{}
    40  	err := r.client.Get(ctx, req.NamespacedName, session)
    41  	if err != nil && !apierrors.IsNotFound(err) {
    42  		return ctrl.Result{}, fmt.Errorf("uisession reconcile: %v", err)
    43  	}
    44  
    45  	if apierrors.IsNotFound(err) || session.ObjectMeta.DeletionTimestamp != nil {
    46  		// NOTE(nick): This should never happen, and if it does, Tilt should
    47  		// immediately re-create the session.
    48  		return ctrl.Result{}, nil
    49  	}
    50  
    51  	// Broadcast to all websockets.
    52  	r.wsList.ForEach(func(ws *server.WebsocketSubscriber) {
    53  		ws.SendUISessionUpdate(ctx, session)
    54  	})
    55  
    56  	return ctrl.Result{}, nil
    57  }
    58  
    59  func (r *Reconciler) CreateBuilder(mgr ctrl.Manager) (*builder.Builder, error) {
    60  	b := ctrl.NewControllerManagedBy(mgr).
    61  		For(&v1alpha1.UISession{})
    62  
    63  	return b, nil
    64  }