github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/engine/configs/trigger_queue_subscriber.go (about) 1 package configs 2 3 import ( 4 "context" 5 6 ctrlclient "sigs.k8s.io/controller-runtime/pkg/client" 7 "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" 8 9 "github.com/tilt-dev/tilt/internal/controllers/apicmp" 10 "github.com/tilt-dev/tilt/internal/controllers/apis/configmap" 11 "github.com/tilt-dev/tilt/internal/store" 12 "github.com/tilt-dev/tilt/pkg/apis/core/v1alpha1" 13 ) 14 15 // Replicates the TriggerQueue back to the API server. 16 type TriggerQueueSubscriber struct { 17 client ctrlclient.Client 18 lastUpdate *v1alpha1.ConfigMap 19 } 20 21 func NewTriggerQueueSubscriber(client ctrlclient.Client) *TriggerQueueSubscriber { 22 return &TriggerQueueSubscriber{client: client} 23 } 24 25 func (s *TriggerQueueSubscriber) fromState(st store.RStore) *v1alpha1.ConfigMap { 26 state := st.RLockState() 27 defer st.RUnlockState() 28 29 var entries []configmap.TriggerQueueEntry 30 for _, mn := range state.TriggerQueue { 31 entry := configmap.TriggerQueueEntry{ 32 Name: mn, 33 } 34 35 ms, ok := state.ManifestState(mn) 36 if !ok { 37 continue 38 } 39 entry.Reason = ms.TriggerReason 40 41 entries = append(entries, entry) 42 } 43 44 result := configmap.TriggerQueueCreate(entries) 45 return &result 46 } 47 48 func (s *TriggerQueueSubscriber) OnChange(ctx context.Context, st store.RStore, summary store.ChangeSummary) error { 49 if summary.IsLogOnly() { 50 return nil 51 } 52 53 cm := s.fromState(st) 54 if s.lastUpdate != nil && apicmp.DeepEqual(cm.Data, s.lastUpdate.Data) { 55 return nil 56 } 57 58 obj := v1alpha1.ConfigMap{ 59 ObjectMeta: cm.ObjectMeta, 60 } 61 _, err := controllerutil.CreateOrUpdate(ctx, s.client, &obj, func() error { 62 obj.Data = cm.Data 63 return nil 64 }) 65 if err != nil { 66 return err 67 } 68 s.lastUpdate = &obj 69 return nil 70 }