k8s.io/kubernetes@v1.29.3/pkg/proxy/ipvs/ipset_test.go (about) 1 //go:build !windows 2 // +build !windows 3 4 /* 5 Copyright 2017 The Kubernetes Authors. 6 7 Licensed under the Apache License, Version 2.0 (the "License"); 8 you may not use this file except in compliance with the License. 9 You may obtain a copy of the License at 10 11 http://www.apache.org/licenses/LICENSE-2.0 12 13 Unless required by applicable law or agreed to in writing, software 14 distributed under the License is distributed on an "AS IS" BASIS, 15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 See the License for the specific language governing permissions and 17 limitations under the License. 18 */ 19 20 package ipvs 21 22 import ( 23 "testing" 24 25 utilipset "k8s.io/kubernetes/pkg/proxy/ipvs/ipset" 26 fakeipset "k8s.io/kubernetes/pkg/proxy/ipvs/ipset/testing" 27 ) 28 29 func TestCheckIPSetVersion(t *testing.T) { 30 testCases := []struct { 31 name string 32 vstring string 33 valid bool 34 }{ 35 {"4.0 < 6.0 is invalid", "4.0", false}, 36 {"5.1 < 6.0 is invalid", "5.1", false}, 37 {"5.2 < 6.0 is invalid", "5.1.2", false}, 38 {"7 is not a valid version", "7", false}, 39 {"6.0 is valid since >= 6.0", "6.0", true}, 40 {"6.1 is valid since >= 6.0", "6.1", true}, 41 {"6.19 is valid since >= 6.0", "6.19", true}, 42 {"7.0 is valid since >= 6.0", "7.0", true}, 43 {"8.1.2 is valid since >= 6.0", "8.1.2", true}, 44 {"9.3.4.0 is valid since >= 6.0", "9.3.4.0", true}, 45 {"not a valid semantic version", "total junk", false}, 46 } 47 48 for _, testCase := range testCases { 49 t.Run(testCase.name, func(t *testing.T) { 50 valid := checkMinVersion(testCase.vstring) 51 if testCase.valid != valid { 52 t.Errorf("Expected result: %v, Got result: %v", testCase.valid, valid) 53 } 54 }) 55 } 56 } 57 58 const testIPSetVersion = "v6.19" 59 60 func TestSyncIPSetEntries(t *testing.T) { 61 testCases := []struct { 62 name string 63 set *utilipset.IPSet 64 setType utilipset.Type 65 ipv6 bool 66 activeEntries []string 67 currentEntries []string 68 expectedEntries []string 69 }{ 70 { 71 name: "normal ipset sync", 72 set: &utilipset.IPSet{ 73 Name: "foo", 74 }, 75 setType: utilipset.HashIPPort, 76 ipv6: false, 77 activeEntries: []string{"172.17.0.4,tcp:80"}, 78 currentEntries: nil, 79 expectedEntries: []string{"172.17.0.4,tcp:80"}, 80 }, 81 { 82 name: "ipset IPv6 sync with no new entries", 83 set: &utilipset.IPSet{ 84 Name: "abz", 85 }, 86 setType: utilipset.HashIPPort, 87 ipv6: true, 88 activeEntries: []string{"FE80::0202:B3FF:FE1E:8329,tcp:80"}, 89 currentEntries: []string{"FE80::0202:B3FF:FE1E:8329,tcp:80"}, 90 expectedEntries: []string{"FE80::0202:B3FF:FE1E:8329,tcp:80"}, 91 }, 92 { 93 name: "ipset sync with updated udp->tcp in hash", 94 set: &utilipset.IPSet{ 95 Name: "bca", 96 }, 97 setType: utilipset.HashIPPort, 98 ipv6: false, 99 activeEntries: []string{"172.17.0.4,tcp:80", "172.17.0.5,tcp:80"}, 100 currentEntries: []string{"172.17.0.5,udp:53"}, 101 expectedEntries: []string{"172.17.0.4,tcp:80", "172.17.0.5,tcp:80"}, 102 }, 103 { 104 name: "ipset sync no updates required", 105 set: &utilipset.IPSet{ 106 Name: "bar", 107 }, 108 setType: utilipset.HashIPPortIP, 109 ipv6: false, 110 activeEntries: []string{"172.17.0.4,tcp:80:172.17.0.4"}, 111 currentEntries: []string{"172.17.0.4,tcp:80:172.17.0.4"}, 112 expectedEntries: []string{"172.17.0.4,tcp:80:172.17.0.4"}, 113 }, 114 { 115 name: "ipset IPv6 sync, delete and add new entry", 116 set: &utilipset.IPSet{ 117 Name: "baz", 118 }, 119 setType: utilipset.HashIPPortIP, 120 ipv6: true, 121 activeEntries: []string{"FE80:0000:0000:0000:0202:B3FF:FE1E:8329,tcp:8080:FE80:0000:0000:0000:0202:B3FF:FE1E:8329"}, 122 currentEntries: []string{"1111:0000:0000:0000:0202:B3FF:FE1E:8329,tcp:8081:1111:0000:0000:0000:0202:B3FF:FE1E:8329:8081"}, 123 expectedEntries: []string{"FE80:0000:0000:0000:0202:B3FF:FE1E:8329,tcp:8080:FE80:0000:0000:0000:0202:B3FF:FE1E:8329"}, 124 }, 125 { 126 name: "ipset sync, no current entries", 127 set: &utilipset.IPSet{ 128 Name: "NOPE", 129 }, 130 setType: utilipset.HashIPPortIP, 131 ipv6: false, 132 activeEntries: []string{"172.17.0.4,tcp:80,172.17.0.9", "172.17.0.5,tcp:80,172.17.0.10"}, 133 currentEntries: nil, 134 expectedEntries: []string{"172.17.0.4,tcp:80,172.17.0.9", "172.17.0.5,tcp:80,172.17.0.10"}, 135 }, 136 { 137 name: "ipset sync, no current entries with /16 subnet", 138 set: &utilipset.IPSet{ 139 Name: "ABC-DEF", 140 }, 141 setType: utilipset.HashIPPortNet, 142 ipv6: false, 143 activeEntries: []string{"172.17.0.4,tcp:80,172.17.0.0/16", "172.17.0.5,tcp:80,172.17.0.0/16"}, 144 currentEntries: nil, 145 expectedEntries: []string{"172.17.0.4,tcp:80,172.17.0.0/16", "172.17.0.5,tcp:80,172.17.0.0/16"}, 146 }, 147 { 148 name: "ipset IPv6 sync, no updates required with /32 subnet", 149 set: &utilipset.IPSet{ 150 Name: "zar", 151 }, 152 setType: utilipset.HashIPPortNet, 153 ipv6: true, 154 activeEntries: []string{"FE80::8329,tcp:8800,2001:db8::/32"}, 155 currentEntries: []string{"FE80::8329,tcp:8800,2001:db8::/32"}, 156 expectedEntries: []string{"FE80::8329,tcp:8800,2001:db8::/32"}, 157 }, 158 { 159 name: "ipset IPv6 sync, current entries removed", 160 set: &utilipset.IPSet{ 161 Name: "bbb", 162 }, 163 setType: utilipset.HashIPPortNet, 164 ipv6: true, 165 activeEntries: nil, 166 currentEntries: []string{"FE80::8329,udp:8801,2001:db8::/32"}, 167 expectedEntries: nil, 168 }, 169 { 170 name: "ipset sync, port entry removed", 171 set: &utilipset.IPSet{ 172 Name: "AAA", 173 }, 174 setType: utilipset.BitmapPort, 175 activeEntries: nil, 176 currentEntries: []string{"80"}, 177 expectedEntries: nil, 178 }, 179 { 180 name: "ipset sync, remove old and add new", 181 set: &utilipset.IPSet{ 182 Name: "c-c-c", 183 }, 184 setType: utilipset.BitmapPort, 185 activeEntries: []string{"8080", "9090"}, 186 currentEntries: []string{"80"}, 187 expectedEntries: []string{"8080", "9090"}, 188 }, 189 { 190 name: "ipset sync, remove many stale ports", 191 set: &utilipset.IPSet{ 192 Name: "NODE-PORT", 193 }, 194 setType: utilipset.BitmapPort, 195 activeEntries: []string{"8080"}, 196 currentEntries: []string{"80", "9090", "8081", "8082"}, 197 expectedEntries: []string{"8080"}, 198 }, 199 { 200 name: "ipset sync, add sctp entry", 201 set: &utilipset.IPSet{ 202 Name: "sctp-1", 203 }, 204 setType: utilipset.HashIPPort, 205 ipv6: false, 206 activeEntries: []string{"172.17.0.4,sctp:80"}, 207 currentEntries: nil, 208 expectedEntries: []string{"172.17.0.4,sctp:80"}, 209 }, 210 { 211 name: "ipset sync, add IPV6 sctp entry", 212 set: &utilipset.IPSet{ 213 Name: "sctp-2", 214 }, 215 setType: utilipset.HashIPPort, 216 ipv6: true, 217 activeEntries: []string{"FE80::0202:B3FF:FE1E:8329,sctp:80"}, 218 currentEntries: []string{"FE80::0202:B3FF:FE1E:8329,sctp:80"}, 219 expectedEntries: []string{"FE80::0202:B3FF:FE1E:8329,sctp:80"}, 220 }, 221 } 222 223 for _, testCase := range testCases { 224 t.Run(testCase.name, func(t *testing.T) { 225 set := NewIPSet(fakeipset.NewFake(testIPSetVersion), testCase.set.Name, testCase.setType, testCase.ipv6, "comment-"+testCase.set.Name) 226 227 if err := set.handle.CreateSet(&set.IPSet, true); err != nil { 228 t.Errorf("Unexpected error: %v", err) 229 } 230 231 for _, entry := range testCase.currentEntries { 232 set.handle.AddEntry(entry, testCase.set, true) 233 } 234 235 set.activeEntries.Insert(testCase.activeEntries...) 236 set.syncIPSetEntries() 237 for _, entry := range testCase.expectedEntries { 238 found, err := set.handle.TestEntry(entry, testCase.set.Name) 239 if err != nil { 240 t.Errorf("Unexpected error: %v", err) 241 } 242 if !found { 243 t.Errorf("Unexpected entry %q not found in set foo", entry) 244 } 245 } 246 }) 247 } 248 }