github.com/cilium/cilium@v1.16.2/operator/watchers/cilium_node_gc_test.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Cilium 3 4 package watchers 5 6 import ( 7 "context" 8 "testing" 9 "time" 10 11 "github.com/stretchr/testify/assert" 12 k8serrors "k8s.io/apimachinery/pkg/api/errors" 13 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 14 "k8s.io/apimachinery/pkg/runtime/schema" 15 "k8s.io/client-go/tools/cache" 16 17 v2 "github.com/cilium/cilium/pkg/k8s/apis/cilium.io/v2" 18 "github.com/cilium/cilium/pkg/k8s/client/clientset/versioned/fake" 19 slim_corev1 "github.com/cilium/cilium/pkg/k8s/slim/k8s/api/core/v1" 20 ) 21 22 func Test_performCiliumNodeGC(t *testing.T) { 23 validCN := &v2.CiliumNode{ 24 ObjectMeta: metav1.ObjectMeta{ 25 Name: "valid-node", 26 }, 27 } 28 invalidCN := &v2.CiliumNode{ 29 ObjectMeta: metav1.ObjectMeta{ 30 Name: "invalid-node", 31 }, 32 } 33 invalidCNWithOwnerRef := &v2.CiliumNode{ 34 ObjectMeta: metav1.ObjectMeta{ 35 Name: "invalid-node-with-owner-ref", 36 OwnerReferences: []metav1.OwnerReference{ 37 {}, 38 }, 39 }, 40 } 41 42 fcn := fake.NewSimpleClientset(validCN, invalidCN, invalidCNWithOwnerRef).CiliumV2().CiliumNodes() 43 44 fCNStore := &cache.FakeCustomStore{ 45 ListKeysFunc: func() []string { 46 return []string{"valid-node", "invalid-node"} 47 }, 48 GetByKeyFunc: func(key string) (interface{}, bool, error) { 49 return &v2.CiliumNode{ 50 ObjectMeta: metav1.ObjectMeta{ 51 Name: key, 52 }, 53 }, true, nil 54 }, 55 } 56 57 interval := time.Nanosecond 58 fng := &fakeNodeGetter{ 59 OnGetK8sSlimNode: func(nodeName string) (*slim_corev1.Node, error) { 60 if nodeName == "valid-node" { 61 return &slim_corev1.Node{}, nil 62 } 63 return nil, k8serrors.NewNotFound(schema.GroupResource{}, "invalid-node") 64 }, 65 } 66 67 candidateStore := newCiliumNodeGCCandidate() 68 69 // check if the invalid node is added to GC candidate 70 err := performCiliumNodeGC(context.TODO(), fcn, fCNStore, fng, interval, candidateStore) 71 assert.NoError(t, err) 72 assert.Len(t, candidateStore.nodesToRemove, 1) 73 _, exists := candidateStore.nodesToRemove["invalid-node"] 74 assert.True(t, exists) 75 76 // check if the invalid node is actually GC-ed 77 time.Sleep(interval) 78 err = performCiliumNodeGC(context.TODO(), fcn, fCNStore, fng, interval, candidateStore) 79 assert.NoError(t, err) 80 assert.Len(t, candidateStore.nodesToRemove, 0) 81 _, exists = candidateStore.nodesToRemove["invalid-node"] 82 assert.False(t, exists) 83 }