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  }