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  }