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  }