Skip to content

Commit 692244e

Browse files
committed
Controller runtime stopped injecting decoders
1 parent 4026e7f commit 692244e

File tree

7 files changed

+27
-37
lines changed

7 files changed

+27
-37
lines changed

main.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"sigs.k8s.io/controller-runtime/pkg/healthz"
1818
"sigs.k8s.io/controller-runtime/pkg/log/zap"
1919
"sigs.k8s.io/controller-runtime/pkg/webhook"
20+
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
2021

2122
agentv1 "github.com/appuio/appuio-cloud-agent/api/v1"
2223
"github.com/appuio/appuio-cloud-agent/controllers"
@@ -179,8 +180,10 @@ func main() {
179180

180181
mgr.GetWebhookServer().Register("/validate-namespace-quota", &webhook.Admission{
181182
Handler: &webhooks.NamespaceQuotaValidator{
182-
Skipper: psk,
183183
Client: mgr.GetClient(),
184+
Decoder: admission.NewDecoder(mgr.GetScheme()),
185+
186+
Skipper: psk,
184187

185188
OrganizationLabel: conf.OrganizationLabel,
186189
UserDefaultOrganizationAnnotation: conf.UserDefaultOrganizationAnnotation,
@@ -220,8 +223,11 @@ func main() {
220223
func registerNodeSelectorValidationWebhooks(mgr ctrl.Manager, conf Config) {
221224
mgr.GetWebhookServer().Register("/mutate-pod-node-selector", &webhook.Admission{
222225
Handler: &webhooks.PodNodeSelectorMutator{
223-
Skipper: skipper.StaticSkipper{ShouldSkip: false},
224-
Client: mgr.GetClient(),
226+
Client: mgr.GetClient(),
227+
Decoder: admission.NewDecoder(mgr.GetScheme()),
228+
229+
Skipper: skipper.StaticSkipper{ShouldSkip: false},
230+
225231
DefaultNodeSelector: conf.DefaultNodeSelector,
226232
DefaultNamespaceNodeSelectorAnnotation: conf.DefaultNamespaceNodeSelectorAnnotation,
227233
},
@@ -248,7 +254,9 @@ func registerRatioController(mgr ctrl.Manager, conf Config, orgLabel string) {
248254
DefaultNodeSelector: conf.DefaultNodeSelector,
249255
DefaultNamespaceNodeSelectorAnnotation: conf.DefaultNamespaceNodeSelectorAnnotation,
250256

251-
Client: mgr.GetClient(),
257+
Decoder: admission.NewDecoder(mgr.GetScheme()),
258+
Client: mgr.GetClient(),
259+
252260
RatioLimits: conf.MemoryPerCoreLimits,
253261
Ratio: &ratio.Fetcher{
254262
Client: mgr.GetClient(),

webhooks/namespace_quota_validator.go

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import (
2727

2828
// NamespaceQuotaValidator checks namespaces for allowed node selectors.
2929
type NamespaceQuotaValidator struct {
30-
decoder *admission.Decoder
30+
Decoder *admission.Decoder
3131

3232
// Client is used to fetch namespace counts
3333
Client client.Reader
@@ -64,7 +64,7 @@ func (v *NamespaceQuotaValidator) Handle(ctx context.Context, req admission.Requ
6464

6565
// try to get the organization name from the namespace/projectrequest
6666
var rawObject unstructured.Unstructured
67-
if err := v.decoder.Decode(req, &rawObject); err != nil {
67+
if err := v.Decoder.Decode(req, &rawObject); err != nil {
6868
l.Error(err, "failed to decode request")
6969
return admission.Errored(http.StatusBadRequest, err)
7070
}
@@ -131,9 +131,3 @@ func (v *NamespaceQuotaValidator) Handle(ctx context.Context, req admission.Requ
131131

132132
return admission.Allowed("allowed")
133133
}
134-
135-
// InjectDecoder injects a Admission request decoder
136-
func (v *NamespaceQuotaValidator) InjectDecoder(d *admission.Decoder) error {
137-
v.decoder = d
138-
return nil
139-
}

webhooks/namespace_quota_validator_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ func TestNamespaceQuotaValidator_Handle(t *testing.T) {
164164
t.Run(name, func(t *testing.T) {
165165
c, scheme, dec := prepareClient(t, test.initObjects...)
166166
subject := &NamespaceQuotaValidator{
167+
Decoder: dec,
167168
Client: c,
168169
Skipper: skipper.StaticSkipper{ShouldSkip: false},
169170

@@ -173,7 +174,6 @@ func TestNamespaceQuotaValidator_Handle(t *testing.T) {
173174
SelectedProfile: "test",
174175
QuotaOverrideNamespace: "test",
175176
}
176-
subject.InjectDecoder(dec)
177177

178178
require.NoError(t, c.Create(ctx, &cloudagentv1.ZoneUsageProfile{
179179
ObjectMeta: metav1.ObjectMeta{

webhooks/pod_node_selector_mutator.go

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import (
2020

2121
// PodNodeSelectorMutator checks namespaces for allowed node selectors.
2222
type PodNodeSelectorMutator struct {
23-
decoder *admission.Decoder
23+
Decoder *admission.Decoder
2424

2525
// Client is used to fetch namespace metadata
2626
Client client.Reader
@@ -63,7 +63,7 @@ func (v *PodNodeSelectorMutator) Handle(ctx context.Context, req admission.Reque
6363
}
6464

6565
var rawPod unstructured.Unstructured
66-
if err := v.decoder.Decode(req, &rawPod); err != nil {
66+
if err := v.Decoder.Decode(req, &rawPod); err != nil {
6767
l.Error(err, "failed to decode request")
6868
return admission.Errored(400, err)
6969
}
@@ -103,12 +103,6 @@ func (v *PodNodeSelectorMutator) Handle(ctx context.Context, req admission.Reque
103103
return admission.Patched("added default node selector", patches...)
104104
}
105105

106-
// InjectDecoder injects a Admission request decoder
107-
func (v *PodNodeSelectorMutator) InjectDecoder(d *admission.Decoder) error {
108-
v.decoder = d
109-
return nil
110-
}
111-
112106
func (v *PodNodeSelectorMutator) defaultLabels(ns corev1.Namespace) (labels.Set, error) {
113107
rawDefaults := ns.Annotations[v.DefaultNamespaceNodeSelectorAnnotation]
114108
if v.DefaultNamespaceNodeSelectorAnnotation == "" || rawDefaults == "" {

webhooks/pod_node_selector_mutator_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,12 @@ func Test_PodNodeSelectorMutator_Handle(t *testing.T) {
8686
for _, tc := range testCases {
8787
t.Run(tc.name, func(t *testing.T) {
8888
subject := PodNodeSelectorMutator{
89+
Decoder: decoder,
8990
Client: c,
9091
Skipper: skipper.StaticSkipper{},
9192
DefaultNodeSelector: tc.defaultNodeSelector,
9293
DefaultNamespaceNodeSelectorAnnotation: nodeSelAnnotation,
9394
}
94-
subject.InjectDecoder(decoder)
9595

9696
pod := newPod(tc.namespace, "test", tc.nodeSelector)
9797
resp := subject.Handle(context.Background(), admissionRequestForObject(t, pod, scheme))

webhooks/ratio_validator.go

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import (
2727

2828
// RatioValidator checks for every action in a namespace whether the Memory to CPU ratio limit is exceeded and will return a warning if it is.
2929
type RatioValidator struct {
30-
decoder *admission.Decoder
30+
Decoder *admission.Decoder
3131
Client client.Client
3232

3333
Ratio ratioFetcher
@@ -135,19 +135,19 @@ func (v *RatioValidator) recordObject(ctx context.Context, r *ratio.Ratio, req a
135135
switch req.Kind.Kind {
136136
case "Pod":
137137
pod := corev1.Pod{}
138-
if err := v.decoder.Decode(req, &pod); err != nil {
138+
if err := v.Decoder.Decode(req, &pod); err != nil {
139139
return r, err
140140
}
141141
r = r.RecordPod(pod)
142142
case "Deployment":
143143
deploy := appsv1.Deployment{}
144-
if err := v.decoder.Decode(req, &deploy); err != nil {
144+
if err := v.Decoder.Decode(req, &deploy); err != nil {
145145
return r, err
146146
}
147147
r = r.RecordDeployment(deploy)
148148
case "StatefulSet":
149149
sts := appsv1.StatefulSet{}
150-
if err := v.decoder.Decode(req, &sts); err != nil {
150+
if err := v.Decoder.Decode(req, &sts); err != nil {
151151
return r, err
152152
}
153153
r = r.RecordStatefulSet(sts)
@@ -159,19 +159,19 @@ func (v *RatioValidator) getNodeSelector(req admission.Request) (map[string]stri
159159
switch req.Kind.Kind {
160160
case "Pod":
161161
pod := corev1.Pod{}
162-
if err := v.decoder.Decode(req, &pod); err != nil {
162+
if err := v.Decoder.Decode(req, &pod); err != nil {
163163
return nil, err
164164
}
165165
return pod.Spec.NodeSelector, nil
166166
case "Deployment":
167167
deploy := appsv1.Deployment{}
168-
if err := v.decoder.Decode(req, &deploy); err != nil {
168+
if err := v.Decoder.Decode(req, &deploy); err != nil {
169169
return nil, err
170170
}
171171
return deploy.Spec.Template.Spec.NodeSelector, nil
172172
case "StatefulSet":
173173
sts := appsv1.StatefulSet{}
174-
if err := v.decoder.Decode(req, &sts); err != nil {
174+
if err := v.Decoder.Decode(req, &sts); err != nil {
175175
return nil, err
176176
}
177177
return sts.Spec.Template.Spec.NodeSelector, nil
@@ -188,12 +188,6 @@ func (v *RatioValidator) getDefaultNodeSelectorFromNamespace(ctx context.Context
188188
return labels.ConvertSelectorToLabelsMap(ns.Annotations[v.DefaultNamespaceNodeSelectorAnnotation])
189189
}
190190

191-
// InjectDecoder injects a Admission request decoder
192-
func (v *RatioValidator) InjectDecoder(d *admission.Decoder) error {
193-
v.decoder = d
194-
return nil
195-
}
196-
197191
func errored(code int32, err error) admission.Response {
198192
return admission.Response{
199193
AdmissionResponse: admissionv1.AdmissionResponse{

webhooks/ratio_validator_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -413,13 +413,13 @@ func prepareTest(t *testing.T, initObjs ...client.Object) *RatioValidator {
413413
uv := &RatioValidator{
414414
DefaultNamespaceNodeSelectorAnnotation: defaultNodeSelectorAnnotation,
415415

416-
Client: failingClient{client},
416+
Decoder: decoder,
417+
Client: failingClient{client},
417418

418419
Ratio: ratio.Fetcher{
419420
Client: failingClient{client},
420421
},
421422
}
422-
uv.InjectDecoder(decoder)
423423
return uv
424424
}
425425

0 commit comments

Comments
 (0)