github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/store/k8sconv/resource_test.go (about) 1 package k8sconv 2 3 import ( 4 "strings" 5 "testing" 6 "time" 7 8 "github.com/google/uuid" 9 "github.com/stretchr/testify/assert" 10 "github.com/stretchr/testify/require" 11 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 12 13 "github.com/tilt-dev/tilt/internal/k8s" 14 "github.com/tilt-dev/tilt/internal/k8s/testyaml" 15 "github.com/tilt-dev/tilt/pkg/apis/core/v1alpha1" 16 ) 17 18 func TestFilteredPodByAncestorUID(t *testing.T) { 19 applyStatus := newDeploymentApplyStatus() 20 21 podA := v1alpha1.Pod{Name: "pod-1", Namespace: "default"} 22 podB := v1alpha1.Pod{Name: "pod-1", Namespace: "default", AncestorUID: "328372c6-a93a-460a-9bc7-eff90c69f5ce"} 23 podC := v1alpha1.Pod{Name: "pod-1", Namespace: "default", AncestorUID: "328372c6-a93a-460a-9bc7-cab"} 24 discovery := newDiscovery([]v1alpha1.Pod{podA, podB, podC}) 25 res, err := NewKubernetesResource(discovery, applyStatus) 26 require.NoError(t, err) 27 assert.Equal(t, []v1alpha1.Pod{podA, podB}, res.FilteredPods) 28 } 29 30 func TestFilteredPodByPodTemplateHash(t *testing.T) { 31 applyStatus := newDeploymentApplyStatus() 32 33 podA := v1alpha1.Pod{Name: "pod-1", Namespace: "default"} 34 podB := v1alpha1.Pod{Name: "pod-1", Namespace: "default", PodTemplateSpecHash: "9e6121753dfe0fbb65ed"} 35 podC := v1alpha1.Pod{Name: "pod-1", Namespace: "default", PodTemplateSpecHash: "328372c6-a93a-460a-9bc7-cab"} 36 discovery := newDiscovery([]v1alpha1.Pod{podA, podB, podC}) 37 res, err := NewKubernetesResource(discovery, applyStatus) 38 require.NoError(t, err) 39 assert.Equal(t, []v1alpha1.Pod{podA, podB}, res.FilteredPods) 40 } 41 42 func TestFilteredPodByOwner(t *testing.T) { 43 time1 := metav1.Time{Time: time.Now().Add(-time.Hour)} 44 time2 := metav1.Time{Time: time.Now().Add(-time.Minute)} 45 46 ownerA := &v1alpha1.PodOwner{Name: "rs-rev-1", CreationTimestamp: time1} 47 ownerB := &v1alpha1.PodOwner{Name: "rs-rev-2", CreationTimestamp: time2} 48 ownerC := &v1alpha1.PodOwner{Name: "alt-rs", CreationTimestamp: time1} 49 podA := v1alpha1.Pod{Name: "pod-1", Owner: ownerA, AncestorUID: "dep-1"} 50 podB := v1alpha1.Pod{Name: "pod-2", Owner: ownerA, AncestorUID: "dep-1"} 51 podAlt := v1alpha1.Pod{Name: "pod-alt", Owner: ownerC, AncestorUID: "alt-server"} 52 podC := v1alpha1.Pod{Name: "pod-3", Owner: ownerB, AncestorUID: "dep-1"} 53 54 filter := func(pods ...v1alpha1.Pod) []v1alpha1.Pod { 55 discovery := newDiscovery(pods) 56 res, err := NewKubernetesResource(discovery, nil) 57 require.NoError(t, err) 58 return res.FilteredPods 59 } 60 61 assert.Equal(t, []v1alpha1.Pod{podA, podB}, filter(podA, podB)) 62 assert.Equal(t, []v1alpha1.Pod{podA, podAlt}, filter(podA, podAlt)) 63 64 // Ensure that if one deployment has a new replicaset, 65 // the pods from the old replicaset are filtered out. 66 assert.Equal(t, []v1alpha1.Pod{podC}, filter(podA, podB, podC)) 67 assert.Equal(t, []v1alpha1.Pod{podC}, filter(podC, podB, podA)) 68 69 // Ensure that if we have pods coming from multiple deployments, 70 // we keep pods from all deployments. 71 assert.Equal(t, []v1alpha1.Pod{podAlt, podC}, filter(podAlt, podC, podB, podA)) 72 } 73 74 func TestNewKubernetesApplyFilter_Sorted(t *testing.T) { 75 forDeploy, err := k8s.ParseYAMLFromString(testyaml.OutOfOrderYaml) 76 require.NoError(t, err, "Invalid test YAML") 77 for i := range forDeploy { 78 forDeploy[i].SetUID(uuid.New().String()) 79 } 80 resultYAML, err := k8s.SerializeSpecYAML(forDeploy) 81 require.NoError(t, err, "Failed to re-serialize test YAML") 82 // sanity check to ensure serialization isn't changing the sort 83 require.Less(t, strings.Index(resultYAML, "Job"), strings.Index(resultYAML, "PersistentVolumeClaim"), 84 "Order in re-serialized YAML was not preserved") 85 86 applyFilter, err := NewKubernetesApplyFilter(resultYAML) 87 require.NoError(t, err, "Failed to create KubernetesApplyFilter") 88 require.NotNil(t, applyFilter, "KubernetesApplyFilter was nil") 89 90 var actualKinds []string 91 for _, ref := range applyFilter.DeployedRefs { 92 actualKinds = append(actualKinds, ref.Kind) 93 } 94 95 expectedKindOrder := []string{"PersistentVolume", "PersistentVolumeClaim", "ConfigMap", "Service", "StatefulSet", "Job", "Pod"} 96 assert.Equal(t, expectedKindOrder, actualKinds) 97 } 98 99 func newDeploymentApplyStatus() *v1alpha1.KubernetesApplyStatus { 100 return &v1alpha1.KubernetesApplyStatus{ 101 ResultYAML: ` 102 apiVersion: apps/v1 103 kind: Deployment 104 metadata: 105 name: tilt-site 106 namespace: default 107 resourceVersion: "41313" 108 uid: 328372c6-a93a-460a-9bc7-eff90c69f5ce 109 spec: 110 selector: 111 matchLabels: 112 app: tilt-site 113 template: 114 metadata: 115 creationTimestamp: null 116 labels: 117 app: tilt-site 118 app.kubernetes.io/managed-by: tilt 119 tilt.dev/pod-template-hash: 9e6121753dfe0fbb65ed 120 spec: 121 containers: 122 - image: localhost:5005/tilt-site:tilt-bb6b20cd3041242e 123 name: tilt-site 124 `, 125 } 126 } 127 128 func newDiscovery(pods []v1alpha1.Pod) *v1alpha1.KubernetesDiscovery { 129 return &v1alpha1.KubernetesDiscovery{ 130 Status: v1alpha1.KubernetesDiscoveryStatus{ 131 Pods: pods, 132 }, 133 } 134 }