github.com/cilium/cilium@v1.16.2/operator/pkg/bgpv2/fixture_test.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // Copyright Authors of Cilium
     3  
     4  package bgpv2
     5  
     6  import (
     7  	"context"
     8  	"sync"
     9  
    10  	"github.com/cilium/hive/cell"
    11  	"github.com/stretchr/testify/require"
    12  	"k8s.io/apimachinery/pkg/watch"
    13  	k8sTesting "k8s.io/client-go/testing"
    14  
    15  	"github.com/cilium/cilium/pkg/hive"
    16  	cilium_api_v2 "github.com/cilium/cilium/pkg/k8s/apis/cilium.io/v2"
    17  	cilium_api_v2alpha1 "github.com/cilium/cilium/pkg/k8s/apis/cilium.io/v2alpha1"
    18  	k8s_client "github.com/cilium/cilium/pkg/k8s/client"
    19  	cilium_client_v2 "github.com/cilium/cilium/pkg/k8s/client/clientset/versioned/typed/cilium.io/v2"
    20  	cilium_client_v2alpha1 "github.com/cilium/cilium/pkg/k8s/client/clientset/versioned/typed/cilium.io/v2alpha1"
    21  	"github.com/cilium/cilium/pkg/k8s/resource"
    22  	"github.com/cilium/cilium/pkg/k8s/utils"
    23  	"github.com/cilium/cilium/pkg/lock"
    24  	"github.com/cilium/cilium/pkg/option"
    25  	"github.com/cilium/cilium/pkg/time"
    26  )
    27  
    28  var (
    29  	TestTimeout = 5 * time.Second
    30  )
    31  
    32  type fixture struct {
    33  	hive          *hive.Hive
    34  	fakeClientSet *k8s_client.FakeClientset
    35  	bgpcClient    cilium_client_v2alpha1.CiliumBGPClusterConfigInterface
    36  	nodeClient    cilium_client_v2.CiliumNodeInterface
    37  	bgpncoClient  cilium_client_v2alpha1.CiliumBGPNodeConfigOverrideInterface
    38  
    39  	// for validations
    40  	bgpnClient cilium_client_v2alpha1.CiliumBGPNodeConfigInterface
    41  }
    42  
    43  func newFixture(ctx context.Context, req *require.Assertions) (*fixture, func()) {
    44  	var (
    45  		onceCN, onceBGPCC   sync.Once
    46  		cnWatch, bgpccWatch = make(chan struct{}), make(chan struct{})
    47  	)
    48  
    49  	f := &fixture{}
    50  	f.fakeClientSet, _ = k8s_client.NewFakeClientset()
    51  
    52  	watchReactorFn := func(action k8sTesting.Action) (handled bool, ret watch.Interface, err error) {
    53  		w := action.(k8sTesting.WatchAction)
    54  		gvr := w.GetResource()
    55  		ns := w.GetNamespace()
    56  		watch, err := f.fakeClientSet.CiliumFakeClientset.Tracker().Watch(gvr, ns)
    57  		if err != nil {
    58  			return false, nil, err
    59  		}
    60  
    61  		switch w.GetResource().Resource {
    62  		case "ciliumnodes":
    63  			onceCN.Do(func() { close(cnWatch) })
    64  		case "ciliumbgpclusterconfigs":
    65  			onceBGPCC.Do(func() { close(bgpccWatch) })
    66  		default:
    67  			return false, watch, nil
    68  		}
    69  
    70  		return true, watch, nil
    71  	}
    72  
    73  	// make sure watchers are initialized before the test starts
    74  	watchersReadyFn := func() {
    75  		select {
    76  		case <-cnWatch:
    77  		case <-ctx.Done():
    78  			req.Fail("cilium node watcher is not initialized")
    79  		}
    80  
    81  		select {
    82  		case <-bgpccWatch:
    83  		case <-ctx.Done():
    84  			req.Fail("cilium bgp cluster config watcher is not initialized")
    85  		}
    86  	}
    87  
    88  	f.bgpcClient = f.fakeClientSet.CiliumFakeClientset.CiliumV2alpha1().CiliumBGPClusterConfigs()
    89  	f.nodeClient = f.fakeClientSet.CiliumFakeClientset.CiliumV2().CiliumNodes()
    90  	f.bgpnClient = f.fakeClientSet.CiliumFakeClientset.CiliumV2alpha1().CiliumBGPNodeConfigs()
    91  	f.bgpncoClient = f.fakeClientSet.CiliumFakeClientset.CiliumV2alpha1().CiliumBGPNodeConfigOverrides()
    92  
    93  	f.fakeClientSet.CiliumFakeClientset.PrependWatchReactor("*", watchReactorFn)
    94  
    95  	f.hive = hive.New(
    96  		cell.Provide(func(lc cell.Lifecycle, c k8s_client.Clientset) resource.Resource[*cilium_api_v2alpha1.CiliumBGPClusterConfig] {
    97  			return resource.New[*cilium_api_v2alpha1.CiliumBGPClusterConfig](
    98  				lc, utils.ListerWatcherFromTyped[*cilium_api_v2alpha1.CiliumBGPClusterConfigList](
    99  					c.CiliumV2alpha1().CiliumBGPClusterConfigs(),
   100  				),
   101  			)
   102  		}),
   103  		cell.Provide(func(lc cell.Lifecycle, c k8s_client.Clientset) resource.Resource[*cilium_api_v2alpha1.CiliumBGPNodeConfig] {
   104  			return resource.New[*cilium_api_v2alpha1.CiliumBGPNodeConfig](
   105  				lc, utils.ListerWatcherFromTyped[*cilium_api_v2alpha1.CiliumBGPNodeConfigList](
   106  					c.CiliumV2alpha1().CiliumBGPNodeConfigs(),
   107  				),
   108  			)
   109  		}),
   110  
   111  		cell.Provide(func(lc cell.Lifecycle, c k8s_client.Clientset) resource.Resource[*cilium_api_v2alpha1.CiliumBGPNodeConfigOverride] {
   112  			return resource.New[*cilium_api_v2alpha1.CiliumBGPNodeConfigOverride](
   113  				lc, utils.ListerWatcherFromTyped[*cilium_api_v2alpha1.CiliumBGPNodeConfigOverrideList](
   114  					c.CiliumV2alpha1().CiliumBGPNodeConfigOverrides(),
   115  				),
   116  			)
   117  		}),
   118  
   119  		cell.Provide(func(lc cell.Lifecycle, c k8s_client.Clientset) resource.Resource[*cilium_api_v2.CiliumNode] {
   120  			return resource.New[*cilium_api_v2.CiliumNode](
   121  				lc, utils.ListerWatcherFromTyped[*cilium_api_v2.CiliumNodeList](
   122  					c.CiliumV2().CiliumNodes(),
   123  				),
   124  			)
   125  		}),
   126  
   127  		cell.Provide(func() *option.DaemonConfig {
   128  			return &option.DaemonConfig{
   129  				ConfigPatchMutex:      new(lock.RWMutex),
   130  				EnableBGPControlPlane: true,
   131  				Debug:                 true,
   132  			}
   133  		}),
   134  
   135  		cell.Provide(func() k8s_client.Clientset {
   136  			return f.fakeClientSet
   137  		}),
   138  
   139  		Cell,
   140  	)
   141  
   142  	return f, watchersReadyFn
   143  }