...
1
16
17 package main
18
19 import (
20 "context"
21 "fmt"
22
23 corev1 "k8s.io/api/core/v1"
24 "k8s.io/apimachinery/pkg/runtime"
25
26 logf "sigs.k8s.io/controller-runtime/pkg/log"
27 "sigs.k8s.io/controller-runtime/pkg/webhook/admission"
28 )
29
30
31
32
33 type podValidator struct{}
34
35
36 func (v *podValidator) validate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) {
37 log := logf.FromContext(ctx)
38 pod, ok := obj.(*corev1.Pod)
39 if !ok {
40 return nil, fmt.Errorf("expected a Pod but got a %T", obj)
41 }
42
43 log.Info("Validating Pod")
44 key := "example-mutating-admission-webhook"
45 anno, found := pod.Annotations[key]
46 if !found {
47 return nil, fmt.Errorf("missing annotation %s", key)
48 }
49 if anno != "foo" {
50 return nil, fmt.Errorf("annotation %s did not have value %q", key, "foo")
51 }
52
53 return nil, nil
54 }
55
56 func (v *podValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) {
57 return v.validate(ctx, obj)
58 }
59
60 func (v *podValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) {
61 return v.validate(ctx, newObj)
62 }
63
64 func (v *podValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) {
65 return v.validate(ctx, obj)
66 }
67
View as plain text