blob: 68face527fbca142ec2574d1b2f0c2e0918fb642 [file] [log] [blame]
Jan Schära48bd3c2024-07-29 17:22:18 +02001package object
2
3// Taken and modified from the Kubernetes plugin of CoreDNS, under Apache 2.0.
4
5import (
6 "testing"
7
8 api "k8s.io/api/core/v1"
9 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10 "k8s.io/client-go/tools/cache"
11)
12
13func TestDefaultProcessor(t *testing.T) {
14 pbuild := DefaultProcessor(ToService)
15 reh := cache.ResourceEventHandlerFuncs{}
16 idx := cache.NewIndexer(cache.DeletionHandlingMetaNamespaceKeyFunc, cache.Indexers{})
17 processor := pbuild(idx, reh)
18 testProcessor(t, processor, idx)
19}
20
21func testProcessor(t *testing.T, processor cache.ProcessFunc, idx cache.Indexer) {
22 obj := &api.Service{
23 ObjectMeta: metav1.ObjectMeta{Name: "service1", Namespace: "test1"},
24 Spec: api.ServiceSpec{
25 Type: api.ServiceTypeExternalName,
26 ExternalName: "example.com.",
27 Ports: []api.ServicePort{{Port: 80}},
28 },
29 }
30 obj2 := &api.Service{
31 ObjectMeta: metav1.ObjectMeta{Name: "service2", Namespace: "test1"},
32 Spec: api.ServiceSpec{
33 ClusterIP: "5.6.7.8",
34 ClusterIPs: []string{"5.6.7.8"},
35 Ports: []api.ServicePort{{Port: 80}},
36 },
37 }
38
39 // Add the objects
40 err := processor(cache.Deltas{
41 {Type: cache.Added, Object: obj.DeepCopy()},
42 {Type: cache.Added, Object: obj2.DeepCopy()},
43 }, false)
44 if err != nil {
45 t.Fatalf("add failed: %v", err)
46 }
47 got, exists, err := idx.Get(obj)
48 if err != nil {
49 t.Fatalf("get added object failed: %v", err)
50 }
51 if !exists {
52 t.Fatal("added object not found in index")
53 }
54 svc, ok := got.(*Service)
55 if !ok {
56 t.Fatal("object in index was incorrect type")
57 }
58 if svc.ExternalName != obj.Spec.ExternalName {
59 t.Fatalf("expected '%v', got '%v'", obj.Spec.ExternalName, svc.ExternalName)
60 }
61
62 // Update an object
63 obj.Spec.ExternalName = "2.example.com."
64 err = processor(cache.Deltas{{
65 Type: cache.Updated,
66 Object: obj.DeepCopy(),
67 }}, false)
68 if err != nil {
69 t.Fatalf("update failed: %v", err)
70 }
71 got, exists, err = idx.Get(obj)
72 if err != nil {
73 t.Fatalf("get updated object failed: %v", err)
74 }
75 if !exists {
76 t.Fatal("updated object not found in index")
77 }
78 svc, ok = got.(*Service)
79 if !ok {
80 t.Fatal("object in index was incorrect type")
81 }
82 if svc.ExternalName != obj.Spec.ExternalName {
83 t.Fatalf("expected '%v', got '%v'", obj.Spec.ExternalName, svc.ExternalName)
84 }
85
86 // Delete an object
87 err = processor(cache.Deltas{{
88 Type: cache.Deleted,
89 Object: obj2.DeepCopy(),
90 }}, false)
91 if err != nil {
92 t.Fatalf("delete test failed: %v", err)
93 }
94 _, exists, err = idx.Get(obj2)
95 if err != nil {
96 t.Fatalf("get deleted object failed: %v", err)
97 }
98 if exists {
99 t.Fatal("deleted object found in index")
100 }
101
102 // Delete an object via tombstone
103 key, _ := cache.MetaNamespaceKeyFunc(obj)
104 tombstone := cache.DeletedFinalStateUnknown{Key: key, Obj: svc}
105 err = processor(cache.Deltas{{
106 Type: cache.Deleted,
107 Object: tombstone,
108 }}, false)
109 if err != nil {
110 t.Fatalf("tombstone delete test failed: %v", err)
111 }
112 _, exists, err = idx.Get(svc)
113 if err != nil {
114 t.Fatalf("get tombstone deleted object failed: %v", err)
115 }
116 if exists {
117 t.Fatal("tombstone deleted object found in index")
118 }
119}