@@ -249,38 +249,26 @@ func Handler(client *k8s.Client, cache *wasm.ModuleCache, controllers *atc.Contr
249
249
250
250
addRequestAttrs (r .Context (), slog .String ("user" , review .Request .UserInfo .Username ))
251
251
252
- review .Response = & admissionv1.AdmissionResponse {
253
- UID : review .Request .UID ,
254
- Allowed : true ,
255
- Result : & metav1.Status {
256
- Status : metav1 .StatusSuccess ,
257
- Message : "validation passed" ,
258
- },
259
- }
260
-
261
- var prev unstructured.Unstructured
262
- if err := json .Unmarshal (review .Request .OldObject .Raw , & prev ); err != nil {
252
+ prev , err := UnstructuredFromRawExt (review .Request .OldObject )
253
+ if err != nil {
263
254
http .Error (w , err .Error (), http .StatusBadRequest )
264
255
return
265
256
}
266
257
267
- var next unstructured. Unstructured
268
- if err := json . Unmarshal ( review . Request . Object . Raw , & next ); err != nil {
258
+ next , err := UnstructuredFromRawExt ( review . Request . Object )
259
+ if err != nil {
269
260
http .Error (w , err .Error (), http .StatusBadRequest )
270
261
return
271
262
}
272
263
273
- addRequestAttrs (r .Context (), slog .String ("resourceId" , internal .Canonical (& next )))
274
-
275
- if internal .GetOwner (& prev ) != internal .GetOwner (& next ) {
276
- review .Response .Allowed = false
277
- review .Response .Result = & metav1.Status {
278
- Message : "cannot modify yoke labels" ,
279
- Status : metav1 .StatusFailure ,
280
- Reason : metav1 .StatusReasonBadRequest ,
281
- }
264
+ review .Response = & admissionv1.AdmissionResponse {
265
+ UID : review .Request .UID ,
266
+ Allowed : true ,
267
+ Result : & metav1.Status {
268
+ Status : metav1 .StatusSuccess ,
269
+ Message : "validation passed" ,
270
+ },
282
271
}
283
-
284
272
defer func () {
285
273
review .Request = nil
286
274
addRequestAttrs (r .Context (), slog .Group (
@@ -291,16 +279,24 @@ func Handler(client *k8s.Client, cache *wasm.ModuleCache, controllers *atc.Contr
291
279
json .NewEncoder (w ).Encode (review )
292
280
}()
293
281
294
- if ! review .Response .Allowed {
282
+ addRequestAttrs (r .Context (), slog .String ("resourceId" , internal .Canonical (prev )))
283
+
284
+ if next != nil && internal .GetOwner (prev ) != internal .GetOwner (next ) {
285
+ review .Response .Allowed = false
286
+ review .Response .Result = & metav1.Status {
287
+ Message : "cannot modify yoke labels" ,
288
+ Status : metav1 .StatusFailure ,
289
+ Reason : metav1 .StatusReasonBadRequest ,
290
+ }
295
291
return
296
292
}
297
293
298
- if ctrl .ResourcesAreEqual (& prev , & next ) {
294
+ if next != nil && ctrl .ResourcesAreEqual (prev , next ) {
299
295
addRequestAttrs (r .Context (), slog .String ("skipReason" , "resources are equal" ))
300
296
return
301
297
}
302
298
303
- owners := next .GetOwnerReferences ()
299
+ owners := prev .GetOwnerReferences ()
304
300
if len (owners ) == 0 {
305
301
addRequestAttrs (r .Context (), slog .String ("skipReason" , "no owner references" ))
306
302
return
@@ -328,30 +324,43 @@ func Handler(client *k8s.Client, cache *wasm.ModuleCache, controllers *atc.Contr
328
324
)
329
325
330
326
if ! ok {
327
+ addRequestAttrs (r .Context (), slog .String ("skipReason" , "no registered flight controller" ))
331
328
return
332
329
}
333
330
334
- labels := next .GetLabels ()
331
+ labels := prev .GetLabels ()
335
332
release := labels [internal .LabelYokeRelease ]
336
333
namespace := labels [internal .LabelYokeReleaseNS ]
337
334
338
- mode := controller .FlightMode (next .GetName (), namespace )
335
+ mode := controller .FlightMode (prev .GetName (), namespace )
339
336
340
337
addRequestAttrs (r .Context (), slog .String ("airwayMode" , string (mode )))
341
338
342
339
switch mode {
343
340
case v1alpha1 .AirwayModeStatic :
341
+ if next == nil || ! next .GetDeletionTimestamp ().IsZero () {
342
+ review .Response .Allowed = false
343
+ review .Response .Result = & metav1.Status {
344
+ Message : "cannot delete resources managed by Air-Traffic-Controller" ,
345
+ Status : metav1 .StatusFailure ,
346
+ Reason : metav1 .StatusReasonBadRequest ,
347
+ }
348
+ return
349
+ }
350
+
344
351
release , err := client .GetRelease (r .Context (), release , namespace )
345
352
if err != nil {
346
- // Handle?
353
+ addRequestAttrs ( r . Context (), slog . String ( "skipReason" , fmt . Sprintf ( "failed to get release: %v" , err )))
347
354
return
348
355
}
349
356
if len (release .History ) == 0 {
357
+ addRequestAttrs (r .Context (), slog .String ("skipReason" , "no release history found" ))
350
358
return
351
359
}
352
360
353
361
stages , err := client .GetRevisionResources (r .Context (), release .ActiveRevision ())
354
362
if err != nil {
363
+ addRequestAttrs (r .Context (), slog .String ("skipReason" , fmt .Sprintf ("failed to get release resources: %v" , err )))
355
364
return
356
365
}
357
366
@@ -363,12 +372,13 @@ func Handler(client *k8s.Client, cache *wasm.ModuleCache, controllers *atc.Contr
363
372
resource .GetName () == next .GetName ()
364
373
})
365
374
if ! ok {
375
+ addRequestAttrs (r .Context (), slog .String ("skipReason" , "could not find desired resource in release" ))
366
376
return
367
377
}
368
378
369
- internal .RemoveAdditions (desired , & next )
379
+ internal .RemoveAdditions (desired , next )
370
380
371
- if ! ctrl .ResourcesAreEqual (desired , & next ) {
381
+ if ! ctrl .ResourcesAreEqual (desired , next ) {
372
382
review .Response .Allowed = false
373
383
review .Response .Result = & metav1.Status {
374
384
Message : "cannot modify flight sub-resources" ,
@@ -511,3 +521,16 @@ func addRequestAttrs(ctx context.Context, attrs ...slog.Attr) {
511
521
}
512
522
* reqAttrs = append (* reqAttrs , attrs ... )
513
523
}
524
+
525
+ func UnstructuredFromRawExt (ext runtime.RawExtension ) (* unstructured.Unstructured , error ) {
526
+ if len (ext .Raw ) == 0 {
527
+ return nil , nil
528
+ }
529
+
530
+ var resource unstructured.Unstructured
531
+ if err := json .Unmarshal (ext .Raw , & resource ); err != nil {
532
+ return nil , err
533
+ }
534
+
535
+ return & resource , nil
536
+ }
0 commit comments