@@ -34,7 +34,9 @@ import (
34
34
"sync/atomic"
35
35
"testing"
36
36
37
+ "github.com/google/go-cmp/cmp"
37
38
"k8s.io/apiserver/pkg/audit"
39
+ "k8s.io/apiserver/pkg/features"
38
40
"k8s.io/apiserver/pkg/server/dynamiccertificates"
39
41
"k8s.io/client-go/transport"
40
42
@@ -53,8 +55,11 @@ import (
53
55
"k8s.io/apiserver/pkg/endpoints/filters"
54
56
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
55
57
"k8s.io/apiserver/pkg/server/egressselector"
58
+ utilfeature "k8s.io/apiserver/pkg/util/feature"
56
59
utilflowcontrol "k8s.io/apiserver/pkg/util/flowcontrol"
57
60
apiserverproxyutil "k8s.io/apiserver/pkg/util/proxy"
61
+ "k8s.io/component-base/featuregate"
62
+ featuregatetesting "k8s.io/component-base/featuregate/testing"
58
63
"k8s.io/component-base/metrics"
59
64
"k8s.io/component-base/metrics/legacyregistry"
60
65
apiregistration "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
@@ -130,6 +135,8 @@ func TestProxyHandler(t *testing.T) {
130
135
expectedBody string
131
136
expectedCalled bool
132
137
expectedHeaders map [string ][]string
138
+
139
+ enableFeatureGates []featuregate.Feature
133
140
}{
134
141
"no target" : {
135
142
expectedStatusCode : http .StatusNotFound ,
@@ -174,6 +181,40 @@ func TestProxyHandler(t *testing.T) {
174
181
},
175
182
expectedStatusCode : http .StatusOK ,
176
183
expectedCalled : true ,
184
+ expectedHeaders : map [string ][]string {
185
+ "X-Forwarded-Proto" : {"https" },
186
+ "X-Forwarded-Uri" : {"/request/path" },
187
+ "X-Forwarded-For" : {"127.0.0.1" },
188
+ "X-Remote-User" : {"username" },
189
+ "User-Agent" : {"Go-http-client/1.1" },
190
+ "Accept-Encoding" : {"gzip" },
191
+ "X-Remote-Group" : {"one" , "two" },
192
+ },
193
+ },
194
+ "[RemoteRequestHeaderUID] proxy with user, insecure" : {
195
+ user : & user.DefaultInfo {
196
+ Name : "username" ,
197
+ UID : "6b60d791-1af9-4513-92e5-e4252a1e0a78" ,
198
+ Groups : []string {"one" , "two" },
199
+ },
200
+ path : "/request/path" ,
201
+ apiService : & apiregistration.APIService {
202
+ ObjectMeta : metav1.ObjectMeta {Name : "v1.foo" },
203
+ Spec : apiregistration.APIServiceSpec {
204
+ Service : & apiregistration.ServiceReference {Port : pointer .Int32Ptr (443 )},
205
+ Group : "foo" ,
206
+ Version : "v1" ,
207
+ InsecureSkipTLSVerify : true ,
208
+ },
209
+ Status : apiregistration.APIServiceStatus {
210
+ Conditions : []apiregistration.APIServiceCondition {
211
+ {Type : apiregistration .Available , Status : apiregistration .ConditionTrue },
212
+ },
213
+ },
214
+ },
215
+ enableFeatureGates : []featuregate.Feature {features .RemoteRequestHeaderUID },
216
+ expectedStatusCode : http .StatusOK ,
217
+ expectedCalled : true ,
177
218
expectedHeaders : map [string ][]string {
178
219
"X-Forwarded-Proto" : {"https" },
179
220
"X-Forwarded-Uri" : {"/request/path" },
@@ -208,6 +249,40 @@ func TestProxyHandler(t *testing.T) {
208
249
},
209
250
expectedStatusCode : http .StatusOK ,
210
251
expectedCalled : true ,
252
+ expectedHeaders : map [string ][]string {
253
+ "X-Forwarded-Proto" : {"https" },
254
+ "X-Forwarded-Uri" : {"/request/path" },
255
+ "X-Forwarded-For" : {"127.0.0.1" },
256
+ "X-Remote-User" : {"username" },
257
+ "User-Agent" : {"Go-http-client/1.1" },
258
+ "Accept-Encoding" : {"gzip" },
259
+ "X-Remote-Group" : {"one" , "two" },
260
+ },
261
+ },
262
+ "[RemoteRequestHeaderUID] proxy with user, cabundle" : {
263
+ user : & user.DefaultInfo {
264
+ Name : "username" ,
265
+ UID : "6b60d791-1af9-4513-92e5-e4252a1e0a78" ,
266
+ Groups : []string {"one" , "two" },
267
+ },
268
+ path : "/request/path" ,
269
+ apiService : & apiregistration.APIService {
270
+ ObjectMeta : metav1.ObjectMeta {Name : "v1.foo" },
271
+ Spec : apiregistration.APIServiceSpec {
272
+ Service : & apiregistration.ServiceReference {Name : "test-service" , Namespace : "test-ns" , Port : pointer .Int32Ptr (443 )},
273
+ Group : "foo" ,
274
+ Version : "v1" ,
275
+ CABundle : testCACrt ,
276
+ },
277
+ Status : apiregistration.APIServiceStatus {
278
+ Conditions : []apiregistration.APIServiceCondition {
279
+ {Type : apiregistration .Available , Status : apiregistration .ConditionTrue },
280
+ },
281
+ },
282
+ },
283
+ enableFeatureGates : []featuregate.Feature {features .RemoteRequestHeaderUID },
284
+ expectedStatusCode : http .StatusOK ,
285
+ expectedCalled : true ,
211
286
expectedHeaders : map [string ][]string {
212
287
"X-Forwarded-Proto" : {"https" },
213
288
"X-Forwarded-Uri" : {"/request/path" },
@@ -320,7 +395,11 @@ func TestProxyHandler(t *testing.T) {
320
395
target .Reset ()
321
396
legacyregistry .Reset ()
322
397
323
- func () {
398
+ t .Run (name , func (t * testing.T ) {
399
+ for _ , f := range tc .enableFeatureGates {
400
+ featuregatetesting .SetFeatureGateDuringTest (t , utilfeature .DefaultFeatureGate , f , true )
401
+ }
402
+
324
403
targetServer := httptest .NewUnstartedServer (target )
325
404
serviceCert := tc .serviceCertOverride
326
405
if serviceCert == nil {
@@ -354,37 +433,37 @@ func TestProxyHandler(t *testing.T) {
354
433
355
434
resp , err := http .Get (server .URL + tc .path )
356
435
if err != nil {
357
- t .Errorf ("%s: %v" , name , err )
436
+ t .Errorf ("%v" , err )
358
437
return
359
438
}
360
439
if e , a := tc .expectedStatusCode , resp .StatusCode ; e != a {
361
440
body , _ := httputil .DumpResponse (resp , true )
362
- t .Logf ("%s: %v" , name , string (body ))
363
- t .Errorf ("%s: expected %v, got %v" , name , e , a )
441
+ t .Logf ("%v" , string (body ))
442
+ t .Errorf ("expected %v, got %v" , e , a )
364
443
return
365
444
}
366
445
bytes , err := io .ReadAll (resp .Body )
367
446
if err != nil {
368
- t .Errorf ("%s: %v" , name , err )
447
+ t .Errorf ("%v" , err )
369
448
return
370
449
}
371
450
if ! strings .Contains (string (bytes ), tc .expectedBody ) {
372
- t .Errorf ("%s: expected %q, got %q" , name , tc .expectedBody , string (bytes ))
451
+ t .Errorf ("expected %q, got %q" , tc .expectedBody , string (bytes ))
373
452
return
374
453
}
375
454
376
455
if e , a := tc .expectedCalled , target .called ; e != a {
377
- t .Errorf ("%s: expected %v, got %v" , name , e , a )
456
+ t .Errorf ("expected %v, got %v" , e , a )
378
457
return
379
458
}
380
459
// this varies every test
381
460
delete (target .headers , "X-Forwarded-Host" )
382
461
if e , a := tc .expectedHeaders , target .headers ; ! reflect .DeepEqual (e , a ) {
383
- t .Errorf ("%s: expected %v, got %v" , name , e , a )
462
+ t .Errorf ("expected != got %v" , cmp . Diff ( e , a ) )
384
463
return
385
464
}
386
465
if e , a := targetServer .Listener .Addr ().String (), target .host ; tc .expectedCalled && ! reflect .DeepEqual (e , a ) {
387
- t .Errorf ("%s: expected %v, got %v" , name , e , a )
466
+ t .Errorf ("expected %v, got %v" , e , a )
388
467
return
389
468
}
390
469
@@ -397,7 +476,7 @@ func TestProxyHandler(t *testing.T) {
397
476
t .Errorf ("expected the x509_missing_san_total to be 1, but it's %d" , errorCounter )
398
477
}
399
478
}
400
- }( )
479
+ })
401
480
}
402
481
}
403
482
0 commit comments