@@ -23,12 +23,28 @@ import (
23
23
)
24
24
25
25
type mockChecker struct {
26
+ name string
26
27
checks []Check
27
- err error
28
28
}
29
29
30
- func (m * mockChecker ) Init (_ context.Context , _ ctrlclient.Client , _ * clusterv1.Cluster ) ([]Check , error ) {
31
- return m .checks , m .err
30
+ func (m * mockChecker ) Name () string {
31
+ return m .name
32
+ }
33
+
34
+ func (m * mockChecker ) Init (_ context.Context , _ ctrlclient.Client , _ * clusterv1.Cluster ) []Check {
35
+ return m .checks
36
+ }
37
+
38
+ type mockDecoder struct {
39
+ err error
40
+ }
41
+
42
+ func (m * mockDecoder ) Decode (_ admission.Request , _ runtime.Object ) error {
43
+ return m .err
44
+ }
45
+
46
+ func (m * mockDecoder ) DecodeRaw (_ runtime.RawExtension , _ runtime.Object ) error {
47
+ return m .err
32
48
}
33
49
34
50
func TestHandle (t * testing.T ) {
@@ -38,13 +54,16 @@ func TestHandle(t *testing.T) {
38
54
39
55
tests := []struct {
40
56
name string
57
+ operation admissionv1.Operation
58
+ decoder admission.Decoder
41
59
cluster * clusterv1.Cluster
42
60
checkers []Checker
43
61
checks []Check
44
62
expectedResponse admission.Response
45
63
}{
46
64
{
47
- name : "skip delete operations" ,
65
+ name : "skip delete operations" ,
66
+ operation : admissionv1 .Delete ,
48
67
cluster : & clusterv1.Cluster {
49
68
ObjectMeta : metav1.ObjectMeta {
50
69
Name : "test-cluster" ,
@@ -76,7 +95,29 @@ func TestHandle(t *testing.T) {
76
95
},
77
96
},
78
97
},
79
-
98
+ {
99
+ name : "handle decoder error" ,
100
+ decoder : & mockDecoder {
101
+ err : fmt .Errorf ("decode error" ),
102
+ },
103
+ cluster : & clusterv1.Cluster {
104
+ ObjectMeta : metav1.ObjectMeta {
105
+ Name : "test-cluster" ,
106
+ Labels : map [string ]string {
107
+ clusterv1 .ProviderNameLabel : "test-provider" ,
108
+ },
109
+ },
110
+ },
111
+ expectedResponse : admission.Response {
112
+ AdmissionResponse : admissionv1.AdmissionResponse {
113
+ Allowed : false ,
114
+ Result : & metav1.Status {
115
+ Code : http .StatusBadRequest ,
116
+ Message : "decode error" ,
117
+ },
118
+ },
119
+ },
120
+ },
80
121
{
81
122
name : "if no checks, then allowed" ,
82
123
cluster : & clusterv1.Cluster {
@@ -214,7 +255,7 @@ func TestHandle(t *testing.T) {
214
255
},
215
256
},
216
257
{
217
- name : "run other checks, despite checker initialization error " ,
258
+ name : "internal error takes precedence in response " ,
218
259
cluster : & clusterv1.Cluster {
219
260
ObjectMeta : metav1.ObjectMeta {
220
261
Name : "test-cluster" ,
@@ -231,7 +272,9 @@ func TestHandle(t *testing.T) {
231
272
checks : []Check {
232
273
func (ctx context.Context ) CheckResult {
233
274
return CheckResult {
234
- Allowed : true ,
275
+ Allowed : false ,
276
+ Error : true ,
277
+ Message : "internal error" ,
235
278
}
236
279
},
237
280
},
@@ -250,36 +293,28 @@ func TestHandle(t *testing.T) {
250
293
checks : []Check {
251
294
func (ctx context.Context ) CheckResult {
252
295
return CheckResult {
253
- Allowed : false ,
254
- Error : true ,
255
- Message : "check result error" ,
296
+ Allowed : true ,
256
297
}
257
298
},
258
299
},
259
300
},
260
- & mockChecker {
261
- err : fmt .Errorf ("checker initialization error" ),
262
- },
263
301
},
264
302
expectedResponse : admission.Response {
265
303
AdmissionResponse : admissionv1.AdmissionResponse {
266
304
Allowed : false ,
267
305
Result : & metav1.Status {
268
- Code : http .StatusForbidden ,
306
+ Code : http .StatusInternalServerError ,
307
+ Reason : metav1 .StatusReasonInternalError ,
269
308
Message : "preflight checks failed" ,
270
309
Details : & metav1.StatusDetails {
271
310
Causes : []metav1.StatusCause {
272
311
{
273
- Type : metav1 .CauseTypeInternal ,
274
- Message : "checker initialization error " ,
312
+ Type : metav1 .CauseTypeFieldValueInvalid ,
313
+ Message : "check failed " ,
275
314
},
276
315
{
277
316
Type : metav1 .CauseTypeInternal ,
278
- Message : "check result error" ,
279
- },
280
- {
281
- Type : metav1 .CauseTypeFieldValueInvalid ,
282
- Message : "check failed" ,
317
+ Message : "internal error" ,
283
318
},
284
319
},
285
320
},
@@ -291,7 +326,11 @@ func TestHandle(t *testing.T) {
291
326
292
327
for _ , tt := range tests {
293
328
t .Run (tt .name , func (t * testing.T ) {
329
+ // Default the decoder.
294
330
decoder := admission .NewDecoder (scheme )
331
+ if tt .decoder != nil {
332
+ decoder = tt .decoder
333
+ }
295
334
296
335
handler := New (fake .NewClientBuilder ().Build (), decoder , tt .checkers ... )
297
336
@@ -301,9 +340,15 @@ func TestHandle(t *testing.T) {
301
340
jsonCluster , err := json .Marshal (tt .cluster )
302
341
require .NoError (t , err )
303
342
343
+ // Default the operation.
344
+ operation := admissionv1 .Create
345
+ if tt .operation != "" {
346
+ operation = tt .operation
347
+ }
348
+
304
349
admissionReq := admission.Request {
305
350
AdmissionRequest : admissionv1.AdmissionRequest {
306
- Operation : admissionv1 . Create ,
351
+ Operation : operation ,
307
352
Object : runtime.RawExtension {
308
353
Raw : jsonCluster ,
309
354
},
@@ -321,13 +366,7 @@ func TestHandle(t *testing.T) {
321
366
322
367
if tt .expectedResponse .Result .Details != nil {
323
368
require .NotNil (t , got .Result .Details )
324
- assert .Len (t , got .Result .Details .Causes , len (tt .expectedResponse .Result .Details .Causes ))
325
-
326
- for i , expectedCause := range tt .expectedResponse .Result .Details .Causes {
327
- assert .Equal (t , expectedCause .Type , got .Result .Details .Causes [i ].Type )
328
- assert .Equal (t , expectedCause .Field , got .Result .Details .Causes [i ].Field )
329
- assert .Equal (t , expectedCause .Message , got .Result .Details .Causes [i ].Message )
330
- }
369
+ assert .ElementsMatch (t , tt .expectedResponse .Result .Details .Causes , got .Result .Details .Causes )
331
370
}
332
371
}
333
372
assert .Equal (t , tt .expectedResponse .Warnings , got .Warnings )
@@ -388,7 +427,8 @@ func TestHandleCancelledContext(t *testing.T) {
388
427
AdmissionResponse : admissionv1.AdmissionResponse {
389
428
Allowed : false ,
390
429
Result : & metav1.Status {
391
- Code : http .StatusForbidden ,
430
+ Code : http .StatusInternalServerError ,
431
+ Reason : metav1 .StatusReasonInternalError ,
392
432
Message : "preflight checks failed" ,
393
433
Details : & metav1.StatusDetails {
394
434
Causes : []metav1.StatusCause {
@@ -439,13 +479,7 @@ func TestHandleCancelledContext(t *testing.T) {
439
479
440
480
if expectedResponse .Result .Details != nil {
441
481
require .NotNil (t , got .Result .Details )
442
- assert .Len (t , got .Result .Details .Causes , len (expectedResponse .Result .Details .Causes ))
443
-
444
- for i , expectedCause := range expectedResponse .Result .Details .Causes {
445
- assert .Equal (t , expectedCause .Type , got .Result .Details .Causes [i ].Type )
446
- assert .Equal (t , expectedCause .Field , got .Result .Details .Causes [i ].Field )
447
- assert .Equal (t , expectedCause .Message , got .Result .Details .Causes [i ].Message )
448
- }
482
+ assert .ElementsMatch (t , expectedResponse .Result .Details .Causes , got .Result .Details .Causes )
449
483
}
450
484
}
451
485
assert .Equal (t , expectedResponse .Warnings , got .Warnings )
0 commit comments