...
1
16
17 package admission
18
19 import (
20 "context"
21 "encoding/json"
22 "net/http"
23
24 admissionv1 "k8s.io/api/admission/v1"
25 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26 "k8s.io/apimachinery/pkg/runtime"
27 )
28
29
30
31 type Defaulter interface {
32 runtime.Object
33 Default()
34 }
35
36
37
38 func DefaultingWebhookFor(scheme *runtime.Scheme, defaulter Defaulter) *Webhook {
39 return &Webhook{
40 Handler: &mutatingHandler{defaulter: defaulter, decoder: NewDecoder(scheme)},
41 }
42 }
43
44 type mutatingHandler struct {
45 defaulter Defaulter
46 decoder Decoder
47 }
48
49
50 func (h *mutatingHandler) Handle(ctx context.Context, req Request) Response {
51 if h.decoder == nil {
52 panic("decoder should never be nil")
53 }
54 if h.defaulter == nil {
55 panic("defaulter should never be nil")
56 }
57
58
59
60 if req.Operation == admissionv1.Delete {
61 return Response{AdmissionResponse: admissionv1.AdmissionResponse{
62 Allowed: true,
63 Result: &metav1.Status{
64 Code: http.StatusOK,
65 },
66 }}
67 }
68
69
70 obj := h.defaulter.DeepCopyObject().(Defaulter)
71 if err := h.decoder.Decode(req, obj); err != nil {
72 return Errored(http.StatusBadRequest, err)
73 }
74
75
76 obj.Default()
77 marshalled, err := json.Marshal(obj)
78 if err != nil {
79 return Errored(http.StatusInternalServerError, err)
80 }
81
82
83 return PatchResponseFromRaw(req.Object.Raw, marshalled)
84 }
85
View as plain text