github.com/cilium/cilium@v1.16.2/pkg/service/id_test.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // Copyright Authors of Cilium
     3  
     4  package service
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/require"
    10  
    11  	cmtypes "github.com/cilium/cilium/pkg/clustermesh/types"
    12  	"github.com/cilium/cilium/pkg/loadbalancer"
    13  )
    14  
    15  var (
    16  	l3n4Addr1 = loadbalancer.L3n4Addr{
    17  		AddrCluster: cmtypes.MustParseAddrCluster("::1"),
    18  		L4Addr:      loadbalancer.L4Addr{Port: 0, Protocol: "UDP"},
    19  	}
    20  	l3n4Addr2 = loadbalancer.L3n4Addr{
    21  		AddrCluster: cmtypes.MustParseAddrCluster("::1"),
    22  		L4Addr:      loadbalancer.L4Addr{Port: 1, Protocol: "TCP"},
    23  	}
    24  	l3n4Addr3 = loadbalancer.L3n4Addr{
    25  		AddrCluster: cmtypes.MustParseAddrCluster("::1"),
    26  		L4Addr:      loadbalancer.L4Addr{Port: 1, Protocol: "UDP"},
    27  	}
    28  	l3n4Addr4 = loadbalancer.L3n4Addr{
    29  		AddrCluster: cmtypes.MustParseAddrCluster("::1"),
    30  		L4Addr:      loadbalancer.L4Addr{Port: 2, Protocol: "UDP"},
    31  	}
    32  	l3n4Addr5 = loadbalancer.L3n4Addr{
    33  		AddrCluster: cmtypes.MustParseAddrCluster("::2"),
    34  		L4Addr:      loadbalancer.L4Addr{Port: 2, Protocol: "UDP"},
    35  	}
    36  	l3n4Addr6 = loadbalancer.L3n4Addr{
    37  		AddrCluster: cmtypes.MustParseAddrCluster("::3"),
    38  		L4Addr:      loadbalancer.L4Addr{Port: 2, Protocol: "UDP"},
    39  	}
    40  	wantL3n4AddrID = &loadbalancer.L3n4AddrID{
    41  		ID:       123,
    42  		L3n4Addr: l3n4Addr2,
    43  	}
    44  )
    45  
    46  func TestServices(t *testing.T) {
    47  	var nilL3n4AddrID *loadbalancer.L3n4AddrID
    48  	// Set up last free ID with zero
    49  	id, err := getMaxServiceID()
    50  	require.Equal(t, nil, err)
    51  	require.Equal(t, FirstFreeServiceID, id)
    52  
    53  	ffsIDu16 := loadbalancer.ServiceID(uint16(FirstFreeServiceID))
    54  
    55  	l3n4AddrID, err := AcquireID(l3n4Addr1, 0)
    56  	require.Equal(t, nil, err)
    57  	require.Equal(t, loadbalancer.ID(ffsIDu16), l3n4AddrID.ID)
    58  
    59  	l3n4AddrID, err = AcquireID(l3n4Addr1, 0)
    60  	require.Equal(t, nil, err)
    61  	require.Equal(t, loadbalancer.ID(ffsIDu16), l3n4AddrID.ID)
    62  
    63  	l3n4AddrID, err = AcquireID(l3n4Addr2, 0)
    64  	require.Equal(t, nil, err)
    65  	require.Equal(t, loadbalancer.ID(ffsIDu16+1), l3n4AddrID.ID)
    66  
    67  	// l3n4Addr3 should have the same ID as l3n4Addr2 since we are omitting the
    68  	// protocol type.
    69  	l3n4AddrID, err = AcquireID(l3n4Addr3, 0)
    70  	require.Equal(t, nil, err)
    71  	require.Equal(t, loadbalancer.ID(ffsIDu16+1), l3n4AddrID.ID)
    72  
    73  	gotL3n4AddrID, err := GetID(FirstFreeServiceID)
    74  	require.Equal(t, nil, err)
    75  	wantL3n4AddrID.ID = loadbalancer.ID(ffsIDu16)
    76  	wantL3n4AddrID.L3n4Addr = l3n4Addr1
    77  	require.EqualValues(t, wantL3n4AddrID, gotL3n4AddrID)
    78  
    79  	err = DeleteID(FirstFreeServiceID)
    80  	require.Equal(t, nil, err)
    81  	gotL3n4AddrID, err = GetID(FirstFreeServiceID)
    82  	require.Equal(t, nil, err)
    83  	require.Equal(t, nilL3n4AddrID, gotL3n4AddrID)
    84  
    85  	gotL3n4AddrID, err = GetID(FirstFreeServiceID + 1)
    86  	require.Equal(t, nil, err)
    87  	wantL3n4AddrID.ID = loadbalancer.ID(FirstFreeServiceID + 1)
    88  	wantL3n4AddrID.L3n4Addr = l3n4Addr2
    89  	require.EqualValues(t, wantL3n4AddrID, gotL3n4AddrID)
    90  
    91  	err = DeleteID(FirstFreeServiceID)
    92  	require.Equal(t, nil, err)
    93  
    94  	err = setIDSpace(FirstFreeServiceID, FirstFreeServiceID)
    95  	require.Equal(t, nil, err)
    96  
    97  	err = DeleteID(FirstFreeServiceID)
    98  	require.Equal(t, nil, err)
    99  	gotL3n4AddrID, err = GetID(FirstFreeServiceID)
   100  	require.Equal(t, nil, err)
   101  	require.Equal(t, nilL3n4AddrID, gotL3n4AddrID)
   102  
   103  	gotL3n4AddrID, err = AcquireID(l3n4Addr2, 0)
   104  	require.Equal(t, nil, err)
   105  	require.Equal(t, loadbalancer.ID(FirstFreeServiceID+1), gotL3n4AddrID.ID)
   106  
   107  	err = DeleteID(uint32(gotL3n4AddrID.ID))
   108  	require.Equal(t, nil, err)
   109  	err = DeleteID(FirstFreeServiceID + 1)
   110  	require.Equal(t, nil, err)
   111  	err = DeleteID(FirstFreeServiceID + 1)
   112  	require.Equal(t, nil, err)
   113  
   114  	gotL3n4AddrID, err = AcquireID(l3n4Addr2, 0)
   115  	require.Equal(t, nil, err)
   116  	require.Equal(t, loadbalancer.ID(ffsIDu16), gotL3n4AddrID.ID)
   117  
   118  	gotL3n4AddrID, err = AcquireID(l3n4Addr1, 0)
   119  	require.Equal(t, nil, err)
   120  	require.Equal(t, loadbalancer.ID(FirstFreeServiceID+1), gotL3n4AddrID.ID)
   121  
   122  	gotL3n4AddrID, err = AcquireID(l3n4Addr1, 99)
   123  	require.Equal(t, nil, err)
   124  	require.Equal(t, loadbalancer.ID(FirstFreeServiceID+1), gotL3n4AddrID.ID)
   125  
   126  	err = DeleteID(uint32(FirstFreeServiceID + 1))
   127  	require.Equal(t, nil, err)
   128  
   129  	gotL3n4AddrID, err = AcquireID(l3n4Addr1, 99)
   130  	require.Equal(t, nil, err)
   131  	require.Equal(t, loadbalancer.ID(99), gotL3n4AddrID.ID)
   132  
   133  	// ID "99" has been already allocated to l3n4Addr1
   134  	gotL3n4AddrID, err = AcquireID(l3n4Addr4, 99)
   135  	require.Error(t, err)
   136  	require.Nil(t, gotL3n4AddrID)
   137  }
   138  
   139  func TestGetMaxServiceID(t *testing.T) {
   140  	lastID := uint32(MaxSetOfServiceID - 1)
   141  
   142  	err := setIDSpace(lastID, MaxSetOfServiceID)
   143  	require.Nil(t, err)
   144  
   145  	id, err := getMaxServiceID()
   146  	require.Equal(t, nil, err)
   147  	require.Equal(t, (MaxSetOfServiceID - 1), id)
   148  }
   149  
   150  func TestBackendID(t *testing.T) {
   151  	firstBackendID := loadbalancer.BackendID(FirstFreeBackendID)
   152  
   153  	id1, err := AcquireBackendID(l3n4Addr1)
   154  	require.Equal(t, nil, err)
   155  	require.Equal(t, firstBackendID, id1)
   156  
   157  	id1, err = AcquireBackendID(l3n4Addr1)
   158  	require.Equal(t, nil, err)
   159  	require.Equal(t, firstBackendID, id1)
   160  
   161  	id2, err := AcquireBackendID(l3n4Addr2)
   162  	require.Equal(t, nil, err)
   163  	require.Equal(t, firstBackendID+1, id2)
   164  
   165  	existingID1, err := LookupBackendID(l3n4Addr1)
   166  	require.Equal(t, nil, err)
   167  	require.Equal(t, id1, existingID1)
   168  
   169  	// Check that the backend ID restoration advances the nextID
   170  	err = RestoreBackendID(l3n4Addr5, firstBackendID+10)
   171  	require.Equal(t, nil, err)
   172  	id3, err := AcquireBackendID(l3n4Addr6)
   173  	require.Equal(t, nil, err)
   174  	require.Equal(t, firstBackendID+11, id3)
   175  
   176  }
   177  
   178  func BenchmarkAllocation(b *testing.B) {
   179  	addr := loadbalancer.L3n4Addr{
   180  		AddrCluster: cmtypes.MustParseAddrCluster("::1"),
   181  		L4Addr:      loadbalancer.L4Addr{Port: 0, Protocol: "UDP"},
   182  	}
   183  
   184  	b.ResetTimer()
   185  	for i := 0; i < b.N; i++ {
   186  		addr.L4Addr.Port = uint16(b.N)
   187  		_, err := AcquireID(addr, 0)
   188  		require.Nil(b, err)
   189  	}
   190  	b.StopTimer()
   191  
   192  }