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  }