...
1
16
17 package validatingadmissionpolicybinding
18
19 import (
20 "context"
21
22 apiequality "k8s.io/apimachinery/pkg/api/equality"
23 "k8s.io/apimachinery/pkg/runtime"
24 "k8s.io/apimachinery/pkg/util/validation/field"
25 "k8s.io/apiserver/pkg/authorization/authorizer"
26 "k8s.io/apiserver/pkg/storage/names"
27 "k8s.io/kubernetes/pkg/api/legacyscheme"
28 "k8s.io/kubernetes/pkg/apis/admissionregistration"
29 "k8s.io/kubernetes/pkg/apis/admissionregistration/validation"
30 "k8s.io/kubernetes/pkg/registry/admissionregistration/resolver"
31 )
32
33
34 type validatingAdmissionPolicyBindingStrategy struct {
35 runtime.ObjectTyper
36 names.NameGenerator
37 authorizer authorizer.Authorizer
38 policyGetter PolicyGetter
39 resourceResolver resolver.ResourceResolver
40 }
41
42 type PolicyGetter interface {
43
44
45 GetValidatingAdmissionPolicy(ctx context.Context, name string) (*admissionregistration.ValidatingAdmissionPolicy, error)
46 }
47
48
49 func NewStrategy(authorizer authorizer.Authorizer, policyGetter PolicyGetter, resourceResolver resolver.ResourceResolver) *validatingAdmissionPolicyBindingStrategy {
50 return &validatingAdmissionPolicyBindingStrategy{
51 ObjectTyper: legacyscheme.Scheme,
52 NameGenerator: names.SimpleNameGenerator,
53 authorizer: authorizer,
54 policyGetter: policyGetter,
55 resourceResolver: resourceResolver,
56 }
57 }
58
59
60 func (v *validatingAdmissionPolicyBindingStrategy) NamespaceScoped() bool {
61 return false
62 }
63
64
65 func (v *validatingAdmissionPolicyBindingStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) {
66 ic := obj.(*admissionregistration.ValidatingAdmissionPolicyBinding)
67 ic.Generation = 1
68 }
69
70
71 func (v *validatingAdmissionPolicyBindingStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) {
72 newIC := obj.(*admissionregistration.ValidatingAdmissionPolicyBinding)
73 oldIC := old.(*admissionregistration.ValidatingAdmissionPolicyBinding)
74
75
76
77
78 if !apiequality.Semantic.DeepEqual(oldIC.Spec, newIC.Spec) {
79 newIC.Generation = oldIC.Generation + 1
80 }
81 }
82
83
84 func (v *validatingAdmissionPolicyBindingStrategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList {
85 errs := validation.ValidateValidatingAdmissionPolicyBinding(obj.(*admissionregistration.ValidatingAdmissionPolicyBinding))
86 if len(errs) == 0 {
87
88 if err := v.authorizeCreate(ctx, obj); err != nil {
89 errs = append(errs, field.Forbidden(field.NewPath("spec", "paramRef"), err.Error()))
90 }
91 }
92 return errs
93 }
94
95
96 func (v *validatingAdmissionPolicyBindingStrategy) WarningsOnCreate(ctx context.Context, obj runtime.Object) []string {
97 return nil
98 }
99
100
101 func (v *validatingAdmissionPolicyBindingStrategy) Canonicalize(obj runtime.Object) {
102 }
103
104
105 func (v *validatingAdmissionPolicyBindingStrategy) AllowCreateOnUpdate() bool {
106 return false
107 }
108
109
110 func (v *validatingAdmissionPolicyBindingStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList {
111 errs := validation.ValidateValidatingAdmissionPolicyBindingUpdate(obj.(*admissionregistration.ValidatingAdmissionPolicyBinding), old.(*admissionregistration.ValidatingAdmissionPolicyBinding))
112 if len(errs) == 0 {
113
114 if err := v.authorizeUpdate(ctx, obj, old); err != nil {
115 errs = append(errs, field.Forbidden(field.NewPath("spec", "paramRef"), err.Error()))
116 }
117 }
118 return errs
119 }
120
121
122 func (v *validatingAdmissionPolicyBindingStrategy) WarningsOnUpdate(ctx context.Context, obj, old runtime.Object) []string {
123 return nil
124 }
125
126
127
128 func (v *validatingAdmissionPolicyBindingStrategy) AllowUnconditionalUpdate() bool {
129 return false
130 }
131
View as plain text