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 }