github.com/cilium/cilium@v1.16.2/pkg/maps/srv6map/vrf_test.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Cilium 3 4 package srv6map 5 6 import ( 7 "context" 8 "net/netip" 9 "testing" 10 11 "github.com/cilium/hive" 12 "github.com/cilium/hive/cell" 13 "github.com/cilium/hive/hivetest" 14 "github.com/stretchr/testify/require" 15 16 "github.com/cilium/cilium/pkg/bpf" 17 "github.com/cilium/cilium/pkg/datapath/linux/config/defines" 18 "github.com/cilium/cilium/pkg/option" 19 "github.com/cilium/cilium/pkg/testutils" 20 ) 21 22 func TestVRFMapsHive(t *testing.T) { 23 testutils.PrivilegedTest(t) 24 25 type in struct { 26 cell.In 27 28 Map4 *VRFMap4 29 Map6 *VRFMap6 30 NodeExtraDefines []defines.Map `group:"header-node-defines"` 31 } 32 33 var ( 34 m4 *VRFMap4 35 m6 *VRFMap6 36 ) 37 38 hive := hive.New( 39 cell.Provide( 40 newVRFMaps, 41 func() *option.DaemonConfig { 42 return &option.DaemonConfig{ 43 EnableSRv6: true, 44 } 45 }, 46 ), 47 cell.Invoke(func(in in) { 48 // Test DI works 49 require.NotNil(t, in.Map4) 50 require.NotNil(t, in.Map6) 51 52 merged := defines.Map{} 53 for _, def := range in.NodeExtraDefines { 54 require.NoError(t, merged.Merge(def)) 55 } 56 57 require.Contains(t, merged, "SRV6_VRF_MAP4") 58 require.Contains(t, merged, "SRV6_VRF_MAP6") 59 require.Contains(t, merged, "SRV6_VRF_MAP_SIZE") 60 61 // Setup cleanup 62 t.Cleanup(func() { 63 in.Map4.Unpin() 64 in.Map6.Unpin() 65 }) 66 67 m4 = in.Map4 68 m6 = in.Map6 69 }), 70 ) 71 72 logger := hivetest.Logger(t) 73 74 require.NoError(t, hive.Start(logger, context.TODO())) 75 76 // Test map creation 77 require.FileExists(t, bpf.MapPath(vrfMapName4)) 78 require.FileExists(t, bpf.MapPath(vrfMapName6)) 79 80 // Test map iteration 81 k4 := &VRFKey4{ 82 PrefixLen: vrf4StaticPrefixBits + 8, 83 SourceIP: netip.MustParseAddr("192.168.0.1").As4(), 84 DestCIDR: netip.MustParseAddr("10.0.0.0").As4(), 85 } 86 87 k6 := &VRFKey6{ 88 PrefixLen: vrf6StaticPrefixBits + 16, 89 SourceIP: netip.MustParseAddr("fd01::1").As16(), 90 DestCIDR: netip.MustParseAddr("fd00::").As16(), 91 } 92 93 v0 := &VRFValue{ 94 ID: 1, 95 } 96 97 v1 := &VRFValue{ 98 ID: 2, 99 } 100 101 m4, m6, err := OpenVRFMaps() 102 require.NoError(t, err) 103 104 require.NoError(t, m4.Map.Update(k4, v0)) 105 require.NoError(t, m6.Map.Update(k6, v1)) 106 107 var ( 108 keys []VRFKey 109 vals []VRFValue 110 ) 111 112 require.NoError(t, m4.IterateWithCallback(func(k *VRFKey, v *VRFValue) { 113 keys = append(keys, *k) 114 vals = append(vals, *v) 115 })) 116 117 require.NoError(t, m6.IterateWithCallback(func(k *VRFKey, v *VRFValue) { 118 keys = append(keys, *k) 119 vals = append(vals, *v) 120 })) 121 122 require.Contains(t, keys, VRFKey{ 123 SourceIP: netip.MustParseAddr("192.168.0.1"), 124 DestCIDR: netip.MustParsePrefix("10.0.0.0/8"), 125 }) 126 require.Contains(t, keys, VRFKey{ 127 SourceIP: netip.MustParseAddr("fd01::1"), 128 DestCIDR: netip.MustParsePrefix("fd00::/16"), 129 }) 130 require.Contains(t, vals, VRFValue{ID: 1}) 131 require.Contains(t, vals, VRFValue{ID: 2}) 132 133 require.NoError(t, hive.Stop(logger, context.TODO())) 134 135 // Map should be pinned even after stopping the hive 136 require.FileExists(t, bpf.MapPath(vrfMapName4)) 137 require.FileExists(t, bpf.MapPath(vrfMapName6)) 138 }