@@ -17,6 +17,7 @@ limitations under the License.
1717package v1alpha1
1818
1919import (
20+ "context"
2021 "fmt"
2122 "reflect"
2223
@@ -33,89 +34,113 @@ import (
3334var helmreleaseproxylog = logf .Log .WithName ("helmreleaseproxy-resource" )
3435
3536func (r * HelmReleaseProxy ) SetupWebhookWithManager (mgr ctrl.Manager ) error {
37+ w := new (helmReleaseProxyWebhook )
38+
3639 return ctrl .NewWebhookManagedBy (mgr ).
3740 For (r ).
41+ WithDefaulter (w ).
42+ WithValidator (w ).
3843 Complete ()
3944}
4045
41- // TODO(user): EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN!
42-
4346//+kubebuilder:webhook:path=/mutate-addons-cluster-x-k8s-io-v1alpha1-helmreleaseproxy,mutating=true,failurePolicy=fail,sideEffects=None,groups=addons.cluster.x-k8s.io,resources=helmreleaseproxies,verbs=create;update,versions=v1alpha1,name=helmreleaseproxy.kb.io,admissionReviewVersions=v1
4447
45- var _ webhook.Defaulter = & HelmReleaseProxy {}
48+ type helmReleaseProxyWebhook struct {}
49+
50+ var (
51+ _ webhook.CustomValidator = & helmReleaseProxyWebhook {}
52+ _ webhook.CustomDefaulter = & helmReleaseProxyWebhook {}
53+ )
4654
4755// Default implements webhook.Defaulter so a webhook will be registered for the type.
48- func (p * HelmReleaseProxy ) Default () {
49- helmreleaseproxylog .Info ("default" , "name" , p .Name )
56+ func (* helmReleaseProxyWebhook ) Default (_ context.Context , objRaw runtime.Object ) error {
57+ obj , ok := objRaw .(* HelmReleaseProxy )
58+ if ! ok {
59+ return apierrors .NewBadRequest (fmt .Sprintf ("expected a HelmReleaseProxy but got a %T" , objRaw ))
60+ }
61+ helmreleaseproxylog .Info ("default" , "name" , obj .Name )
5062
51- if p .Spec .ReleaseNamespace == "" {
52- p .Spec .ReleaseNamespace = "default"
63+ if obj .Spec .ReleaseNamespace == "" {
64+ obj .Spec .ReleaseNamespace = "default"
5365 }
66+
67+ return nil
5468}
5569
5670// TODO(user): change verbs to "verbs=create;update;delete" if you want to enable deletion validation.
5771//+kubebuilder:webhook:path=/validate-addons-cluster-x-k8s-io-v1alpha1-helmreleaseproxy,mutating=false,failurePolicy=fail,sideEffects=None,groups=addons.cluster.x-k8s.io,resources=helmreleaseproxies,verbs=create;update,versions=v1alpha1,name=vhelmreleaseproxy.kb.io,admissionReviewVersions=v1
5872
59- var _ webhook.Validator = & HelmReleaseProxy {}
60-
6173// ValidateCreate implements webhook.Validator so a webhook will be registered for the type.
62- func (p * HelmReleaseProxy ) ValidateCreate () (admission.Warnings , error ) {
63- helmreleaseproxylog .Info ("validate create" , "name" , p .Name )
74+ func (* helmReleaseProxyWebhook ) ValidateCreate (_ context.Context , objRaw runtime.Object ) (admission.Warnings , error ) {
75+ newObj , ok := objRaw .(* HelmReleaseProxy )
76+ if ! ok {
77+ return nil , apierrors .NewBadRequest (fmt .Sprintf ("expected a HelmReleaseProxy but got a %T" , objRaw ))
78+ }
79+
80+ helmreleaseproxylog .Info ("validate create" , "name" , newObj .Name )
6481
6582 // TODO(user): fill in your validation logic upon object creation.
6683 return nil , nil
6784}
6885
6986// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type.
70- func (p * HelmReleaseProxy ) ValidateUpdate (oldRaw runtime.Object ) (admission.Warnings , error ) {
71- helmreleaseproxylog .Info ("validate update" , "name" , p .Name )
72-
87+ func (* helmReleaseProxyWebhook ) ValidateUpdate (_ context.Context , oldRaw , newRaw runtime.Object ) (admission.Warnings , error ) {
7388 var allErrs field.ErrorList
74- old , ok := oldRaw .(* HelmReleaseProxy )
89+ oldObj , ok := oldRaw .(* HelmReleaseProxy )
90+ if ! ok {
91+ return nil , apierrors .NewBadRequest (fmt .Sprintf ("expected a HelmReleaseProxy but got a %T" , oldRaw ))
92+ }
93+ newObj , ok := newRaw .(* HelmReleaseProxy )
7594 if ! ok {
76- return nil , apierrors .NewBadRequest (fmt .Sprintf ("expected a HelmReleaseProxy but got a %T" , old ))
95+ return nil , apierrors .NewBadRequest (fmt .Sprintf ("expected a HelmReleaseProxy but got a %T" , newRaw ))
7796 }
7897
79- if ! reflect .DeepEqual (p .Spec .RepoURL , old .Spec .RepoURL ) {
98+ helmreleaseproxylog .Info ("validate update" , "name" , newObj .Name )
99+
100+ if ! reflect .DeepEqual (newObj .Spec .RepoURL , oldObj .Spec .RepoURL ) {
80101 allErrs = append (allErrs ,
81102 field .Invalid (field .NewPath ("spec" , "RepoURL" ),
82- p .Spec .RepoURL , "field is immutable" ),
103+ newObj .Spec .RepoURL , "field is immutable" ),
83104 )
84105 }
85106
86- if ! reflect .DeepEqual (p .Spec .ChartName , old .Spec .ChartName ) {
107+ if ! reflect .DeepEqual (newObj .Spec .ChartName , oldObj .Spec .ChartName ) {
87108 allErrs = append (allErrs ,
88109 field .Invalid (field .NewPath ("spec" , "ChartName" ),
89- p .Spec .ChartName , "field is immutable" ),
110+ newObj .Spec .ChartName , "field is immutable" ),
90111 )
91112 }
92113
93- if ! reflect .DeepEqual (p .Spec .ReleaseNamespace , old .Spec .ReleaseNamespace ) {
114+ if ! reflect .DeepEqual (newObj .Spec .ReleaseNamespace , oldObj .Spec .ReleaseNamespace ) {
94115 allErrs = append (allErrs ,
95116 field .Invalid (field .NewPath ("spec" , "ReleaseNamespace" ),
96- p .Spec .ReleaseNamespace , "field is immutable" ),
117+ newObj .Spec .ReleaseNamespace , "field is immutable" ),
97118 )
98119 }
99120
100- if p .Spec .ReconcileStrategy != old .Spec .ReconcileStrategy {
121+ if newObj .Spec .ReconcileStrategy != oldObj .Spec .ReconcileStrategy {
101122 allErrs = append (allErrs ,
102123 field .Invalid (field .NewPath ("spec" , "ReconcileStrategy" ),
103- p .Spec .ReconcileStrategy , "field is immutable" ),
124+ newObj .Spec .ReconcileStrategy , "field is immutable" ),
104125 )
105126 }
106127
107128 // TODO: add webhook for ReleaseName. Currently it's being set if the release name is generated.
108129
109130 if len (allErrs ) > 0 {
110- return nil , apierrors .NewInvalid (GroupVersion .WithKind ("HelmReleaseProxy" ).GroupKind (), p .Name , allErrs )
131+ return nil , apierrors .NewInvalid (GroupVersion .WithKind ("HelmReleaseProxy" ).GroupKind (), newObj .Name , allErrs )
111132 }
112133
113134 return nil , nil
114135}
115136
116137// ValidateDelete implements webhook.Validator so a webhook will be registered for the type.
117- func (r * HelmReleaseProxy ) ValidateDelete () (admission.Warnings , error ) {
118- helmreleaseproxylog .Info ("validate delete" , "name" , r .Name )
138+ func (* helmReleaseProxyWebhook ) ValidateDelete (_ context.Context , objRaw runtime.Object ) (admission.Warnings , error ) {
139+ obj , ok := objRaw .(* HelmReleaseProxy )
140+ if ! ok {
141+ return nil , fmt .Errorf ("expected a HelmReleaseProxy object but got %T" , objRaw )
142+ }
143+ helmreleaseproxylog .Info ("validate delete" , "name" , obj .Name )
119144
120145 // TODO(user): fill in your validation logic upon object deletion.
121146 return nil , nil
0 commit comments