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  }