github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/controllers/apis/configmap/triggerqueue.go (about)

     1  package configmap
     2  
     3  // Functions for parsing out common ConfigMaps.
     4  
     5  import (
     6  	"context"
     7  	"fmt"
     8  	"strconv"
     9  	"strings"
    10  
    11  	apierrors "k8s.io/apimachinery/pkg/api/errors"
    12  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    13  	"k8s.io/apimachinery/pkg/types"
    14  	"sigs.k8s.io/controller-runtime/pkg/client"
    15  
    16  	"github.com/tilt-dev/tilt/pkg/apis/core/v1alpha1"
    17  	"github.com/tilt-dev/tilt/pkg/model"
    18  )
    19  
    20  const TriggerQueueName = "tilt-trigger-queue"
    21  
    22  func TriggerQueue(ctx context.Context, client client.Client) (*v1alpha1.ConfigMap, error) {
    23  	var cm v1alpha1.ConfigMap
    24  	err := client.Get(ctx, types.NamespacedName{Name: TriggerQueueName}, &cm)
    25  	if err != nil && !apierrors.IsNotFound(err) {
    26  		return nil, err
    27  	}
    28  
    29  	return &cm, nil
    30  }
    31  
    32  func NamesInTriggerQueue(cm *v1alpha1.ConfigMap) []string {
    33  	result := make([]string, 0, len(cm.Data)/2)
    34  	for k, v := range cm.Data {
    35  		if !strings.HasSuffix(k, "-name") {
    36  			continue
    37  		}
    38  
    39  		result = append(result, v)
    40  	}
    41  	return result
    42  }
    43  
    44  func InTriggerQueue(cm *v1alpha1.ConfigMap, nn types.NamespacedName) bool {
    45  	name := nn.Name
    46  	for k, v := range cm.Data {
    47  		if !strings.HasSuffix(k, "-name") {
    48  			continue
    49  		}
    50  
    51  		if v == name {
    52  			return true
    53  		}
    54  	}
    55  	return false
    56  }
    57  
    58  func TriggerQueueReason(cm *v1alpha1.ConfigMap, nn types.NamespacedName) model.BuildReason {
    59  	name := nn.Name
    60  	for k, v := range cm.Data {
    61  		if !strings.HasSuffix(k, "-name") {
    62  			continue
    63  		}
    64  
    65  		if v != name {
    66  			continue
    67  		}
    68  
    69  		cur := strings.TrimSuffix(k, "-name")
    70  		reasonCode := cm.Data[fmt.Sprintf("%s-reason-code", cur)]
    71  		i, err := strconv.Atoi(reasonCode)
    72  		if err != nil {
    73  			return model.BuildReasonFlagTriggerUnknown
    74  		}
    75  		return model.BuildReason(i)
    76  	}
    77  	return model.BuildReasonNone
    78  }
    79  
    80  type TriggerQueueEntry struct {
    81  	Name   model.ManifestName
    82  	Reason model.BuildReason
    83  }
    84  
    85  func TriggerQueueCreate(entries []TriggerQueueEntry) v1alpha1.ConfigMap {
    86  	cm := v1alpha1.ConfigMap{
    87  		ObjectMeta: metav1.ObjectMeta{
    88  			Name: TriggerQueueName,
    89  		},
    90  		Data: make(map[string]string, len(entries)),
    91  	}
    92  
    93  	for i, entry := range entries {
    94  		cm.Data[fmt.Sprintf("%d-name", i)] = entry.Name.String()
    95  		reason := entry.Reason
    96  		if !reason.HasTrigger() {
    97  			reason = model.BuildReasonFlagTriggerUnknown
    98  		}
    99  		cm.Data[fmt.Sprintf("%d-reason-code", i)] = fmt.Sprintf("%d", reason)
   100  	}
   101  	return cm
   102  }