@@ -23,12 +23,28 @@ import (
2323)
2424
2525type mockChecker struct {
26+ name string
2627 checks []Check
27- err error
2828}
2929
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
3248}
3349
3450func TestHandle (t * testing.T ) {
@@ -38,13 +54,16 @@ func TestHandle(t *testing.T) {
3854
3955 tests := []struct {
4056 name string
57+ operation admissionv1.Operation
58+ decoder admission.Decoder
4159 cluster * clusterv1.Cluster
4260 checkers []Checker
4361 checks []Check
4462 expectedResponse admission.Response
4563 }{
4664 {
47- name : "skip delete operations" ,
65+ name : "skip delete operations" ,
66+ operation : admissionv1 .Delete ,
4867 cluster : & clusterv1.Cluster {
4968 ObjectMeta : metav1.ObjectMeta {
5069 Name : "test-cluster" ,
@@ -76,7 +95,29 @@ func TestHandle(t *testing.T) {
7695 },
7796 },
7897 },
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+ },
80121 {
81122 name : "if no checks, then allowed" ,
82123 cluster : & clusterv1.Cluster {
@@ -214,7 +255,7 @@ func TestHandle(t *testing.T) {
214255 },
215256 },
216257 {
217- name : "run other checks, despite checker initialization error " ,
258+ name : "internal error takes precedence in response " ,
218259 cluster : & clusterv1.Cluster {
219260 ObjectMeta : metav1.ObjectMeta {
220261 Name : "test-cluster" ,
@@ -231,7 +272,9 @@ func TestHandle(t *testing.T) {
231272 checks : []Check {
232273 func (ctx context.Context ) CheckResult {
233274 return CheckResult {
234- Allowed : true ,
275+ Allowed : false ,
276+ Error : true ,
277+ Message : "internal error" ,
235278 }
236279 },
237280 },
@@ -250,36 +293,28 @@ func TestHandle(t *testing.T) {
250293 checks : []Check {
251294 func (ctx context.Context ) CheckResult {
252295 return CheckResult {
253- Allowed : false ,
254- Error : true ,
255- Message : "check result error" ,
296+ Allowed : true ,
256297 }
257298 },
258299 },
259300 },
260- & mockChecker {
261- err : fmt .Errorf ("checker initialization error" ),
262- },
263301 },
264302 expectedResponse : admission.Response {
265303 AdmissionResponse : admissionv1.AdmissionResponse {
266304 Allowed : false ,
267305 Result : & metav1.Status {
268- Code : http .StatusForbidden ,
306+ Code : http .StatusInternalServerError ,
307+ Reason : metav1 .StatusReasonInternalError ,
269308 Message : "preflight checks failed" ,
270309 Details : & metav1.StatusDetails {
271310 Causes : []metav1.StatusCause {
272311 {
273- Type : metav1 .CauseTypeInternal ,
274- Message : "checker initialization error " ,
312+ Type : metav1 .CauseTypeFieldValueInvalid ,
313+ Message : "check failed " ,
275314 },
276315 {
277316 Type : metav1 .CauseTypeInternal ,
278- Message : "check result error" ,
279- },
280- {
281- Type : metav1 .CauseTypeFieldValueInvalid ,
282- Message : "check failed" ,
317+ Message : "internal error" ,
283318 },
284319 },
285320 },
@@ -291,7 +326,11 @@ func TestHandle(t *testing.T) {
291326
292327 for _ , tt := range tests {
293328 t .Run (tt .name , func (t * testing.T ) {
329+ // Default the decoder.
294330 decoder := admission .NewDecoder (scheme )
331+ if tt .decoder != nil {
332+ decoder = tt .decoder
333+ }
295334
296335 handler := New (fake .NewClientBuilder ().Build (), decoder , tt .checkers ... )
297336
@@ -301,9 +340,15 @@ func TestHandle(t *testing.T) {
301340 jsonCluster , err := json .Marshal (tt .cluster )
302341 require .NoError (t , err )
303342
343+ // Default the operation.
344+ operation := admissionv1 .Create
345+ if tt .operation != "" {
346+ operation = tt .operation
347+ }
348+
304349 admissionReq := admission.Request {
305350 AdmissionRequest : admissionv1.AdmissionRequest {
306- Operation : admissionv1 . Create ,
351+ Operation : operation ,
307352 Object : runtime.RawExtension {
308353 Raw : jsonCluster ,
309354 },
@@ -321,13 +366,7 @@ func TestHandle(t *testing.T) {
321366
322367 if tt .expectedResponse .Result .Details != nil {
323368 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 )
331370 }
332371 }
333372 assert .Equal (t , tt .expectedResponse .Warnings , got .Warnings )
@@ -388,7 +427,8 @@ func TestHandleCancelledContext(t *testing.T) {
388427 AdmissionResponse : admissionv1.AdmissionResponse {
389428 Allowed : false ,
390429 Result : & metav1.Status {
391- Code : http .StatusForbidden ,
430+ Code : http .StatusInternalServerError ,
431+ Reason : metav1 .StatusReasonInternalError ,
392432 Message : "preflight checks failed" ,
393433 Details : & metav1.StatusDetails {
394434 Causes : []metav1.StatusCause {
@@ -439,13 +479,7 @@ func TestHandleCancelledContext(t *testing.T) {
439479
440480 if expectedResponse .Result .Details != nil {
441481 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 )
449483 }
450484 }
451485 assert .Equal (t , expectedResponse .Warnings , got .Warnings )
0 commit comments