istio.io/istio@v0.0.0-20240520182934-d79c90f27776/pkg/kube/krt/informer_test.go (about) 1 // Copyright Istio Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package krt_test 16 17 import ( 18 "context" 19 "testing" 20 21 corev1 "k8s.io/api/core/v1" 22 v1 "k8s.io/api/networking/v1" 23 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 24 "k8s.io/apimachinery/pkg/runtime" 25 "k8s.io/apimachinery/pkg/watch" 26 27 "istio.io/istio/pkg/config/schema/kubeclient" 28 "istio.io/istio/pkg/kube" 29 "istio.io/istio/pkg/kube/kclient/clienttest" 30 "istio.io/istio/pkg/kube/krt" 31 "istio.io/istio/pkg/slices" 32 "istio.io/istio/pkg/test" 33 "istio.io/istio/pkg/test/util/assert" 34 ) 35 36 func TestNewInformer(t *testing.T) { 37 c := kube.NewFakeClient() 38 ConfigMaps := krt.NewInformer[*corev1.ConfigMap](c) 39 c.RunAndWait(test.NewStop(t)) 40 cmt := clienttest.NewWriter[*corev1.ConfigMap](t, c) 41 tt := assert.NewTracker[string](t) 42 ConfigMaps.Register(TrackerHandler[*corev1.ConfigMap](tt)) 43 44 assert.Equal(t, ConfigMaps.List(), nil) 45 46 cmA := &corev1.ConfigMap{ 47 ObjectMeta: metav1.ObjectMeta{ 48 Name: "a", 49 Namespace: "ns", 50 }, 51 } 52 cmA2 := &corev1.ConfigMap{ 53 ObjectMeta: metav1.ObjectMeta{ 54 Name: "a", 55 Namespace: "ns", 56 }, 57 Data: map[string]string{"foo": "bar"}, 58 } 59 cmB := &corev1.ConfigMap{ 60 ObjectMeta: metav1.ObjectMeta{ 61 Name: "b", 62 Namespace: "ns", 63 }, 64 } 65 cmt.Create(cmA) 66 tt.WaitOrdered("add/ns/a") 67 assert.Equal(t, ConfigMaps.List(), []*corev1.ConfigMap{cmA}) 68 69 cmt.Update(cmA2) 70 tt.WaitOrdered("update/ns/a") 71 assert.Equal(t, ConfigMaps.List(), []*corev1.ConfigMap{cmA2}) 72 73 cmt.Create(cmB) 74 tt.WaitOrdered("add/ns/b") 75 assert.Equal(t, slices.SortBy(ConfigMaps.List(), func(a *corev1.ConfigMap) string { return a.Name }), []*corev1.ConfigMap{cmA2, cmB}) 76 77 assert.Equal(t, ConfigMaps.GetKey("ns/b"), &cmB) 78 assert.Equal(t, ConfigMaps.GetKey("ns/a"), &cmA2) 79 80 tt2 := assert.NewTracker[string](t) 81 ConfigMaps.Register(TrackerHandler[*corev1.ConfigMap](tt2)) 82 tt2.WaitUnordered("add/ns/a", "add/ns/b") 83 84 cmt.Delete(cmB.Name, cmB.Namespace) 85 tt.WaitOrdered("delete/ns/b") 86 } 87 88 func TestUnregisteredTypeCollection(t *testing.T) { 89 np := &v1.NetworkPolicy{ 90 ObjectMeta: metav1.ObjectMeta{ 91 Name: "netpol", 92 Namespace: "default", 93 }, 94 } 95 c := kube.NewFakeClient(np) 96 97 kubeclient.Register[*v1.NetworkPolicy]( 98 v1.SchemeGroupVersion.WithResource("networkpolicies"), 99 v1.SchemeGroupVersion.WithKind("NetworkPolicy"), 100 func(c kubeclient.ClientGetter, namespace string, o metav1.ListOptions) (runtime.Object, error) { 101 return c.Kube().NetworkingV1().NetworkPolicies(namespace).List(context.Background(), o) 102 }, 103 func(c kubeclient.ClientGetter, namespace string, o metav1.ListOptions) (watch.Interface, error) { 104 return c.Kube().NetworkingV1().NetworkPolicies(namespace).Watch(context.Background(), o) 105 }, 106 ) 107 npcoll := krt.NewInformer[*v1.NetworkPolicy](c) 108 c.RunAndWait(test.NewStop(t)) 109 assert.Equal(t, npcoll.List(), []*v1.NetworkPolicy{np}) 110 }