1
2
3
4
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 }
249
View as plain text