github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/k8s/pod_template.go (about)

     1  package k8s
     2  
     3  import (
     4  	"crypto"
     5  	"fmt"
     6  
     7  	"github.com/pkg/errors"
     8  	v1 "k8s.io/api/core/v1"
     9  )
    10  
    11  const TiltPodTemplateHashLabel = "tilt.dev/pod-template-hash"
    12  
    13  type PodTemplateSpecHash string
    14  
    15  func HashPodTemplateSpec(spec *v1.PodTemplateSpec) (PodTemplateSpecHash, error) {
    16  	data, err := defaultJSONIterator.Marshal(spec)
    17  	if err != nil {
    18  		return "", errors.Wrap(err, "serializing spec to json")
    19  	}
    20  
    21  	h := crypto.SHA1.New()
    22  	_, err = h.Write(data)
    23  	if err != nil {
    24  		return "", errors.Wrap(err, "writing to hash")
    25  	}
    26  	return PodTemplateSpecHash(fmt.Sprintf("%x", h.Sum(nil)[:10])), nil
    27  }
    28  
    29  // Iterate through the fields of a k8s entity and add the pod template spec hash on all
    30  // pod template specs
    31  func InjectPodTemplateSpecHashes(entity K8sEntity) (K8sEntity, error) {
    32  	entity = entity.DeepCopy()
    33  	templateSpecs, err := ExtractPodTemplateSpec(&entity)
    34  	if err != nil {
    35  		return K8sEntity{}, err
    36  	}
    37  
    38  	for _, ts := range templateSpecs {
    39  		if ts.Labels == nil {
    40  			ts.Labels = map[string]string{}
    41  		}
    42  
    43  		h, err := HashPodTemplateSpec(ts)
    44  		if err != nil {
    45  			return K8sEntity{}, errors.Wrap(err, "calculating hash")
    46  		}
    47  		ts.Labels[TiltPodTemplateHashLabel] = string(h)
    48  	}
    49  
    50  	return entity, nil
    51  }
    52  
    53  // ReadPodTemplateSpecHashes pulls the PodTemplateSpecHash that Tilt injected
    54  // into this entity's metadata during deploy (if any)
    55  func ReadPodTemplateSpecHashes(entity K8sEntity) ([]PodTemplateSpecHash, error) {
    56  	templateSpecs, err := ExtractPodTemplateSpec(&entity)
    57  	if err != nil {
    58  		return nil, err
    59  	}
    60  
    61  	var ret []PodTemplateSpecHash
    62  	for _, ts := range templateSpecs {
    63  		ret = append(ret, PodTemplateSpecHash(ts.Labels[TiltPodTemplateHashLabel]))
    64  	}
    65  
    66  	return ret, nil
    67  }