github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/controllers/core/kubernetesapply/disco_test.go (about) 1 package kubernetesapply 2 3 import ( 4 "fmt" 5 "strings" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 10 "k8s.io/apimachinery/pkg/types" 11 12 "github.com/tilt-dev/tilt/internal/k8s/testyaml" 13 "github.com/tilt-dev/tilt/pkg/apis/core/v1alpha1" 14 ) 15 16 func TestCreateAndUpdateDisco(t *testing.T) { 17 f := newFixture(t) 18 ka := v1alpha1.KubernetesApply{ 19 ObjectMeta: metav1.ObjectMeta{ 20 Name: "a", 21 }, 22 Spec: v1alpha1.KubernetesApplySpec{ 23 YAML: testyaml.SanchoYAML, 24 }, 25 } 26 f.Create(&ka) 27 28 f.MustReconcile(types.NamespacedName{Name: "a"}) 29 f.MustGet(types.NamespacedName{Name: "a"}, &ka) 30 31 var kd v1alpha1.KubernetesDiscovery 32 f.MustGet(types.NamespacedName{Name: "a"}, &kd) 33 assert.Equal(f.T(), 1, len(kd.Spec.Watches)) 34 35 // Make sure the UID in the watch ref matches what we deployed. 36 uid1 := kd.Spec.Watches[0].UID 37 assert.Contains(f.T(), ka.Status.ResultYAML, fmt.Sprintf("uid: %s", uid1)) 38 39 // Change the yaml and redeploy. 40 ka.Spec = v1alpha1.KubernetesApplySpec{ 41 YAML: strings.Replace(testyaml.SanchoYAML, "name: sancho", "name: sancho2", 1), 42 } 43 f.Update(&ka) 44 45 f.MustReconcile(types.NamespacedName{Name: "a"}) 46 f.MustGet(types.NamespacedName{Name: "a"}, &ka) 47 f.MustGet(types.NamespacedName{Name: "a"}, &kd) 48 49 // Make sure the UID changed and got updated. 50 assert.Equal(f.T(), 1, len(kd.Spec.Watches)) 51 uid2 := kd.Spec.Watches[0].UID 52 assert.NotEqual(f.T(), uid1, uid2) 53 assert.Contains(f.T(), ka.Status.ResultYAML, fmt.Sprintf("uid: %s", uid2)) 54 } 55 56 func TestDiscoveryStrategySelectorsOnly(t *testing.T) { 57 f := newFixture(t) 58 ka := v1alpha1.KubernetesApply{ 59 ObjectMeta: metav1.ObjectMeta{ 60 Name: "a", 61 }, 62 Spec: v1alpha1.KubernetesApplySpec{ 63 YAML: testyaml.SanchoYAML, 64 DiscoveryStrategy: v1alpha1.KubernetesDiscoveryStrategySelectorsOnly, 65 KubernetesDiscoveryTemplateSpec: &v1alpha1.KubernetesDiscoveryTemplateSpec{ 66 ExtraSelectors: []metav1.LabelSelector{ 67 metav1.LabelSelector{ 68 MatchLabels: map[string]string{"app": "tilt-site"}, 69 }, 70 }, 71 }, 72 }, 73 } 74 f.Create(&ka) 75 76 f.MustReconcile(types.NamespacedName{Name: "a"}) 77 f.MustGet(types.NamespacedName{Name: "a"}, &ka) 78 79 var kd v1alpha1.KubernetesDiscovery 80 f.MustGet(types.NamespacedName{Name: "a"}, &kd) 81 assert.Equal(f.T(), 1, len(kd.Spec.Watches)) 82 83 // Make sure we don't contain UID watches 84 assert.Equal(t, "", kd.Spec.Watches[0].UID) 85 assert.Equal(t, "default", kd.Spec.Watches[0].Namespace) 86 assert.Equal(t, map[string]string{"app": "tilt-site"}, kd.Spec.ExtraSelectors[0].MatchLabels) 87 } 88 89 // https://github.com/tilt-dev/tilt/issues/5773 90 func TestApplyCmdDiscoveryStrategySelectorsOnly(t *testing.T) { 91 f := newFixture(t) 92 f.execer.RegisterCommand("myapply", 0, testyaml.SanchoYAML, "") 93 ka := v1alpha1.KubernetesApply{ 94 ObjectMeta: metav1.ObjectMeta{ 95 Name: "a", 96 }, 97 Spec: v1alpha1.KubernetesApplySpec{ 98 DiscoveryStrategy: v1alpha1.KubernetesDiscoveryStrategySelectorsOnly, 99 KubernetesDiscoveryTemplateSpec: &v1alpha1.KubernetesDiscoveryTemplateSpec{ 100 ExtraSelectors: []metav1.LabelSelector{ 101 metav1.LabelSelector{ 102 MatchLabels: map[string]string{"app": "tilt-site"}, 103 }, 104 }, 105 }, 106 ApplyCmd: &v1alpha1.KubernetesApplyCmd{Args: []string{"myapply"}}, 107 }, 108 Status: v1alpha1.KubernetesApplyStatus{ 109 ResultYAML: testyaml.SanchoYAML, 110 }, 111 } 112 f.Create(&ka) 113 114 f.MustReconcile(types.NamespacedName{Name: "a"}) 115 f.MustGet(types.NamespacedName{Name: "a"}, &ka) 116 117 var kd v1alpha1.KubernetesDiscovery 118 f.MustGet(types.NamespacedName{Name: "a"}, &kd) 119 assert.Equal(f.T(), 1, len(kd.Spec.Watches)) 120 121 // Make sure we don't contain UID watches 122 assert.Equal(t, "", kd.Spec.Watches[0].UID) 123 assert.Equal(t, "default", kd.Spec.Watches[0].Namespace) 124 assert.Equal(t, map[string]string{"app": "tilt-site"}, kd.Spec.ExtraSelectors[0].MatchLabels) 125 } 126 127 func TestCreateAndDeleteDisco(t *testing.T) { 128 f := newFixture(t) 129 ka := v1alpha1.KubernetesApply{ 130 ObjectMeta: metav1.ObjectMeta{ 131 Name: "a", 132 }, 133 Spec: v1alpha1.KubernetesApplySpec{ 134 YAML: testyaml.SanchoYAML, 135 }, 136 } 137 f.Create(&ka) 138 139 f.MustReconcile(types.NamespacedName{Name: "a"}) 140 f.MustGet(types.NamespacedName{Name: "a"}, &ka) 141 142 var kd v1alpha1.KubernetesDiscovery 143 assert.True(f.T(), f.Get(types.NamespacedName{Name: "a"}, &kd)) 144 145 f.Delete(&ka) 146 f.MustReconcile(types.NamespacedName{Name: "a"}) 147 assert.False(f.T(), f.Get(types.NamespacedName{Name: "a"}, &kd)) 148 } 149 150 func TestDoNotReconcileDiscoOnTransientError(t *testing.T) { 151 f := newFixture(t) 152 ka := v1alpha1.KubernetesApply{ 153 ObjectMeta: metav1.ObjectMeta{ 154 Name: "a", 155 }, 156 Spec: v1alpha1.KubernetesApplySpec{ 157 YAML: testyaml.SanchoYAML, 158 }, 159 } 160 f.Create(&ka) 161 162 f.MustReconcile(types.NamespacedName{Name: "a"}) 163 f.MustGet(types.NamespacedName{Name: "a"}, &ka) 164 165 var kd v1alpha1.KubernetesDiscovery 166 assert.True(f.T(), f.Get(types.NamespacedName{Name: "a"}, &kd)) 167 168 // Simulate a redeploy that fails. 169 ka.Spec = v1alpha1.KubernetesApplySpec{ 170 YAML: strings.Replace(testyaml.SanchoYAML, "name: sancho", "name: sancho2", 1), 171 } 172 f.kClient.UpsertError = fmt.Errorf("Failed to deploy") 173 f.Update(&ka) 174 f.MustReconcile(types.NamespacedName{Name: "a"}) 175 176 // Assert the KubernetesDeploy is still running. 177 f.MustGet(types.NamespacedName{Name: "a"}, &kd) 178 assert.Equal(f.T(), 1, len(kd.Spec.Watches)) 179 180 // Assert the apply status 181 f.MustGet(types.NamespacedName{Name: "a"}, &ka) 182 assert.Contains(f.T(), ka.Status.Error, "Failed to deploy") 183 }