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 }