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 }