22
v1 "k8s.io/api/admissionregistration/v1"
23
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26
"istio.io/istio/pkg/kube"
27
"istio.io/istio/pkg/kube/kclient/clienttest"
28
"istio.io/istio/pkg/test"
29
"istio.io/istio/pkg/test/util/retry"
32
func webhook(revision string) *v1.MutatingWebhookConfiguration {
33
return &v1.MutatingWebhookConfiguration{
34
TypeMeta: metav1.TypeMeta{},
35
ObjectMeta: metav1.ObjectMeta{
36
Name: defaultTagWebhookName,
37
Labels: map[string]string{
38
label.IoIstioRev.Name: revision,
44
func expectRevision(t test.Failer, watcher DefaultWatcher, expected string) {
46
retry.UntilSuccessOrFail(t, func() error {
47
got := watcher.GetDefault()
49
return fmt.Errorf("wanted default revision %q, got %q", expected, got)
52
}, retry.Timeout(time.Second*10), retry.BackoffDelay(time.Millisecond*10))
55
func expectRevisionChan(t test.Failer, revisionChan chan string, expected string) {
57
case rev := <-revisionChan:
59
t.Fatalf("expected revision %q to be produced on chan, got %q", expected, rev)
61
case <-time.After(time.Second * 5):
62
t.Fatalf("timed out waiting for value on default revision chan")
66
func TestNoDefaultRevision(t *testing.T) {
67
stop := make(chan struct{})
68
client := kube.NewFakeClient()
69
w := NewDefaultWatcher(client, "default")
70
client.RunAndWait(stop)
73
expectRevision(t, w, "")
77
func TestDefaultRevisionChanges(t *testing.T) {
78
stop := test.NewStop(t)
79
client := kube.NewFakeClient()
80
w := NewDefaultWatcher(client, "default").(*defaultWatcher)
81
client.RunAndWait(stop)
83
whc := clienttest.Wrap(t, w.webhooks)
84
expectRevision(t, w, "")
86
whc.CreateOrUpdate(webhook("red"))
87
expectRevision(t, w, "red")
90
whc.CreateOrUpdate(webhook("green"))
91
expectRevision(t, w, "green")
94
whc.Delete(defaultTagWebhookName, "")
95
expectRevision(t, w, "")
98
func TestHandlers(t *testing.T) {
99
stop := test.NewStop(t)
100
client := kube.NewFakeClient()
101
w := NewDefaultWatcher(client, "default").(*defaultWatcher)
102
client.RunAndWait(stop)
104
whc := clienttest.Wrap(t, w.webhooks)
105
expectRevision(t, w, "")
108
newDefaultChan := make(chan string)
109
handler := func(revision string) {
110
newDefaultChan <- revision
112
w.AddHandler(handler)
113
whc.CreateOrUpdate(webhook("green"))
114
expectRevisionChan(t, newDefaultChan, "green")