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 }