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  }