Skip to content

Commit 1dc8cc4

Browse files
committed
⚠ Add AdmissionReviewVersions support for webhook
1 parent 04609bd commit 1dc8cc4

File tree

4 files changed

+51
-48
lines changed

4 files changed

+51
-48
lines changed

pkg/webhook/parser.go

Lines changed: 41 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ limitations under the License.
1919
//
2020
// The markers take the form:
2121
//
22-
// +kubebuilder:webhook:webhookVersions=<[]string>,failurePolicy=<string>,matchPolicy=<string>,groups=<[]string>,resources=<[]string>,verbs=<[]string>,versions=<[]string>,name=<string>,path=<string>,mutating=<bool>,sideEffects=<string>
22+
// +kubebuilder:webhook:webhookVersions=<[]string>,failurePolicy=<string>,matchPolicy=<string>,groups=<[]string>,resources=<[]string>,verbs=<[]string>,versions=<[]string>,name=<string>,path=<string>,mutating=<bool>,sideEffects=<string>,admissionReviewVersions=<[]string>
2323
package webhook
2424

2525
import (
@@ -107,6 +107,12 @@ type Config struct {
107107
// WebhookVersions specifies the target API versions of the {Mutating,Validating}WebhookConfiguration objects
108108
// itself to generate. Defaults to v1.
109109
WebhookVersions []string `marker:"webhookVersions,optional"`
110+
111+
// AdmissionReviewVersions is an ordered list of preferred `AdmissionReview`
112+
// versions the Webhook expects.
113+
// For generating v1 {Mutating,Validating}WebhookConfiguration, this is mandatory.
114+
// For generating v1beta1 {Mutating,Validating}WebhookConfiguration, this is optional, and default to v1beta1.
115+
AdmissionReviewVersions []string `marker:"admissionReviewVersions,optional"`
110116
}
111117

112118
// verbToAPIVariant converts a marker's verb to the proper value for the API.
@@ -140,15 +146,13 @@ func (c Config) ToMutatingWebhook() (admissionregv1.MutatingWebhook, error) {
140146
}
141147

142148
return admissionregv1.MutatingWebhook{
143-
Name: c.Name,
144-
Rules: c.rules(),
145-
FailurePolicy: c.failurePolicy(),
146-
MatchPolicy: matchPolicy,
147-
ClientConfig: c.clientConfig(),
148-
SideEffects: c.sideEffects(),
149-
// TODO(jiachengxu): AdmissionReviewVersions becomes required in admissionregistration/v1, here we default it
150-
// to `v1` and `v1beta1`, and we should support to config the `AdmissionReviewVersions` as a marker.
151-
AdmissionReviewVersions: []string{defaultWebhookVersion, "v1beta1"},
149+
Name: c.Name,
150+
Rules: c.rules(),
151+
FailurePolicy: c.failurePolicy(),
152+
MatchPolicy: matchPolicy,
153+
ClientConfig: c.clientConfig(),
154+
SideEffects: c.sideEffects(),
155+
AdmissionReviewVersions: c.AdmissionReviewVersions,
152156
}, nil
153157
}
154158

@@ -164,15 +168,13 @@ func (c Config) ToValidatingWebhook() (admissionregv1.ValidatingWebhook, error)
164168
}
165169

166170
return admissionregv1.ValidatingWebhook{
167-
Name: c.Name,
168-
Rules: c.rules(),
169-
FailurePolicy: c.failurePolicy(),
170-
MatchPolicy: matchPolicy,
171-
ClientConfig: c.clientConfig(),
172-
SideEffects: c.sideEffects(),
173-
// TODO(jiachengxu): AdmissionReviewVersions becomes required in admissionregistration/v1, here we default it
174-
// to `v1` and `v1beta1`, and we should support to config the `AdmissionReviewVersions` as a marker.
175-
AdmissionReviewVersions: []string{defaultWebhookVersion, "v1beta1"},
171+
Name: c.Name,
172+
Rules: c.rules(),
173+
FailurePolicy: c.failurePolicy(),
174+
MatchPolicy: matchPolicy,
175+
ClientConfig: c.clientConfig(),
176+
SideEffects: c.sideEffects(),
177+
AdmissionReviewVersions: c.AdmissionReviewVersions,
176178
}, nil
177179
}
178180

@@ -344,29 +346,26 @@ func (Generator) Generate(ctx *genall.GenerationContext) error {
344346
},
345347
Webhooks: cfgs,
346348
}
347-
// SideEffects in required in admissionregistration/v1, if this is not set or set to `Some` or `Known`,
348-
// we return an error
349349
if version == defaultWebhookVersion {
350350
for i := range objRaw.Webhooks {
351+
// SideEffects is required in admissionregistration/v1, if this is not set or set to `Some` or `Known`,
352+
// we return an error
351353
if err := checkSideEffectsForV1(objRaw.Webhooks[i].SideEffects); err != nil {
352354
return err
353355
}
356+
// AdmissionReviewVersions is required in admissionregistration/v1, if this is not set,
357+
// we return an error
358+
if len(objRaw.Webhooks[i].AdmissionReviewVersions) == 0 {
359+
return fmt.Errorf("AdmissionReviewVersions is mandatory for v1 {Mutating,Validating}WebhookConfiguration")
360+
}
354361
}
355-
}
356-
// AdmissionReviewVersions is optional in admissionregistration/v1beta1, so let kubernetes to default it.
357-
if version == "v1beta1" {
358-
for i := range objRaw.Webhooks {
359-
objRaw.Webhooks[i].AdmissionReviewVersions = nil
360-
}
361-
}
362-
if version != defaultWebhookVersion {
362+
versionedWebhooks[version] = append(versionedWebhooks[version], objRaw)
363+
} else {
363364
conv, err := MutatingWebhookConfigurationAsVersion(objRaw, schema.GroupVersion{Group: admissionregv1.SchemeGroupVersion.Group, Version: version})
364-
versionedWebhooks[version] = append(versionedWebhooks[version], conv)
365365
if err != nil {
366366
return err
367367
}
368-
} else {
369-
versionedWebhooks[version] = append(versionedWebhooks[version], objRaw)
368+
versionedWebhooks[version] = append(versionedWebhooks[version], conv)
370369
}
371370
}
372371

@@ -381,29 +380,26 @@ func (Generator) Generate(ctx *genall.GenerationContext) error {
381380
},
382381
Webhooks: cfgs,
383382
}
384-
// SideEffects in required in admissionregistration/v1, if this is not set or set to `Some` or `Known`,
385-
// we return an error
386383
if version == defaultWebhookVersion {
387384
for i := range objRaw.Webhooks {
385+
// SideEffects is required in admissionregistration/v1, if this is not set or set to `Some` or `Known`,
386+
// we return an error
388387
if err := checkSideEffectsForV1(objRaw.Webhooks[i].SideEffects); err != nil {
389388
return err
390389
}
390+
// AdmissionReviewVersions is required in admissionregistration/v1, if this is not set,
391+
// we return an error
392+
if len(objRaw.Webhooks[i].AdmissionReviewVersions) == 0 {
393+
return fmt.Errorf("AdmissionReviewVersions is mandatory for v1 {Mutating,Validating}WebhookConfiguration")
394+
}
391395
}
392-
}
393-
// AdmissionReviewVersions is optional in admissionregistration/v1beta1, so let kubernetes to default it.
394-
if version == "v1beta1" {
395-
for i := range objRaw.Webhooks {
396-
objRaw.Webhooks[i].AdmissionReviewVersions = nil
397-
}
398-
}
399-
if version != defaultWebhookVersion {
396+
versionedWebhooks[version] = append(versionedWebhooks[version], objRaw)
397+
} else {
400398
conv, err := ValidatingWebhookConfigurationAsVersion(objRaw, schema.GroupVersion{Group: admissionregv1.SchemeGroupVersion.Group, Version: version})
401-
versionedWebhooks[version] = append(versionedWebhooks[version], conv)
402399
if err != nil {
403400
return err
404401
}
405-
} else {
406-
versionedWebhooks[version] = append(versionedWebhooks[version], objRaw)
402+
versionedWebhooks[version] = append(versionedWebhooks[version], conv)
407403
}
408404
}
409405
}

pkg/webhook/testdata/manifests.v1beta1.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ metadata:
66
creationTimestamp: null
77
name: mutating-webhook-configuration
88
webhooks:
9-
- clientConfig:
9+
- admissionReviewVersions:
10+
- v1
11+
- v1beta1
12+
clientConfig:
1013
caBundle: Cg==
1114
service:
1215
name: webhook-service

pkg/webhook/testdata/webhook.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ func (c *CronJob) SetupWebhookWithManager(mgr ctrl.Manager) error {
2828
}
2929

3030
// +kubebuilder:webhook:webhookVersions=v1beta1,verbs=create;update,path=/validate-testdata-kubebuilder-io-v1-cronjob,mutating=false,failurePolicy=fail,matchPolicy=Equivalent,groups=testdata.kubebuiler.io,resources=cronjobs,versions=v1,name=validation.cronjob.testdata.kubebuilder.io,sideEffects=Some
31-
// +kubebuilder:webhook:verbs=create;update,path=/validate-testdata-kubebuilder-io-v1-cronjob,mutating=false,failurePolicy=fail,matchPolicy=Equivalent,groups=testdata.kubebuiler.io,resources=cronjobs,versions=v1,name=validation.cronjob.testdata.kubebuilder.io,sideEffects=NoneOnDryRun
32-
// +kubebuilder:webhook:webhookVersions=v1;v1beta1,verbs=create;update,path=/mutate-testdata-kubebuilder-io-v1-cronjob,mutating=true,failurePolicy=fail,matchPolicy=Equivalent,groups=testdata.kubebuiler.io,resources=cronjobs,versions=v1,name=default.cronjob.testdata.kubebuilder.io,sideEffects=None
31+
// +kubebuilder:webhook:verbs=create;update,path=/validate-testdata-kubebuilder-io-v1-cronjob,mutating=false,failurePolicy=fail,matchPolicy=Equivalent,groups=testdata.kubebuiler.io,resources=cronjobs,versions=v1,name=validation.cronjob.testdata.kubebuilder.io,sideEffects=NoneOnDryRun,admissionReviewVersions=v1;v1beta1
32+
// +kubebuilder:webhook:webhookVersions=v1;v1beta1,verbs=create;update,path=/mutate-testdata-kubebuilder-io-v1-cronjob,mutating=true,failurePolicy=fail,matchPolicy=Equivalent,groups=testdata.kubebuiler.io,resources=cronjobs,versions=v1,name=default.cronjob.testdata.kubebuilder.io,sideEffects=None,admissionReviewVersions=v1;v1beta1
3333

3434
var _ webhook.Defaulter = &CronJob{}
3535
var _ webhook.Validator = &CronJob{}

pkg/webhook/zz_generated.markerhelp.go

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)