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 }