Skip to content

Commit 3bce6fa

Browse files
Merge pull request #571 from AshleyDumaine/controller-runtime-0.20
🌱 Bump controller-runtime to 0.20.1 and related changes
2 parents aa892ef + a075ace commit 3bce6fa

10 files changed

+269
-105
lines changed

bootstrap/api/v1beta1/rke2config_webhook.go

+50-16
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package v1beta1
1818

1919
import (
20+
"context"
2021
"fmt"
2122

2223
"github.com/coreos/butane/config/common"
@@ -37,20 +38,43 @@ var (
3738
rke2configlog = logf.Log.WithName("rke2config-resource")
3839
)
3940

40-
// SetupWebhookWithManager sets up and registers the webhook with the manager.
41-
func (r *RKE2Config) SetupWebhookWithManager(mgr ctrl.Manager) error {
41+
// RKE2ConfigCustomDefaulter struct is responsible for setting default values on the custom resource of the
42+
// Kind RKE2Config when those are created or updated.
43+
// NOTE: The +kubebuilder:object:generate=false marker prevents controller-gen from generating DeepCopy methods,
44+
// as it is used only for temporary operations and does not need to be deeply copied.
45+
// +kubebuilder:object:generate=false
46+
type RKE2ConfigCustomDefaulter struct{}
47+
48+
// RKE2ConfigCustomValidator struct is responsible for validating the RKE2Config resource
49+
// when it is created, updated, or deleted.
50+
// NOTE: The +kubebuilder:object:generate=false marker prevents controller-gen from generating DeepCopy methods,
51+
// as it is used only for temporary operations and does not need to be deeply copied.
52+
// +kubebuilder:object:generate=false
53+
type RKE2ConfigCustomValidator struct{}
54+
55+
// SetupRKE2ConfigWebhookWithManager sets up the Controller Manager for the Webhook for the RKE2ControlPlaneTemplate resource.
56+
func SetupRKE2ConfigWebhookWithManager(mgr ctrl.Manager) error {
4257
return ctrl.NewWebhookManagedBy(mgr).
43-
For(r).
58+
For(&RKE2Config{}).
59+
WithValidator(&RKE2ConfigCustomValidator{}).
60+
WithDefaulter(&RKE2ConfigCustomDefaulter{}).
4461
Complete()
4562
}
4663

4764
//+kubebuilder:webhook:path=/mutate-bootstrap-cluster-x-k8s-io-v1beta1-rke2config,mutating=true,failurePolicy=fail,sideEffects=None,groups=bootstrap.cluster.x-k8s.io,resources=rke2configs,verbs=create;update,versions=v1beta1,name=mrke2config.kb.io,admissionReviewVersions=v1
4865

49-
var _ webhook.Defaulter = &RKE2Config{}
66+
var _ webhook.CustomDefaulter = &RKE2ConfigCustomDefaulter{}
5067

5168
// Default implements webhook.Defaulter so a webhook will be registered for the type.
52-
func (r *RKE2Config) Default() {
53-
DefaultRKE2ConfigSpec(&r.Spec)
69+
func (r *RKE2ConfigCustomDefaulter) Default(_ context.Context, obj runtime.Object) error {
70+
rc, ok := obj.(*RKE2Config)
71+
if !ok {
72+
return apierrors.NewBadRequest(fmt.Sprintf("expected a RKE2Config but got a %T", obj))
73+
}
74+
75+
DefaultRKE2ConfigSpec(&rc.Spec)
76+
77+
return nil
5478
}
5579

5680
// DefaultRKE2ConfigSpec defaults the RKE2ConfigSpec.
@@ -62,40 +86,50 @@ func DefaultRKE2ConfigSpec(spec *RKE2ConfigSpec) {
6286

6387
//+kubebuilder:webhook:path=/validate-bootstrap-cluster-x-k8s-io-v1beta1-rke2config,mutating=false,failurePolicy=fail,sideEffects=None,groups=bootstrap.cluster.x-k8s.io,resources=rke2configs,verbs=create;update,versions=v1beta1,name=vrke2config.kb.io,admissionReviewVersions=v1
6488

65-
var _ webhook.Validator = &RKE2Config{}
89+
var _ webhook.CustomValidator = &RKE2ConfigCustomValidator{}
6690

6791
// ValidateCreate implements webhook.Validator so a webhook will be registered for the type.
68-
func (r *RKE2Config) ValidateCreate() (admission.Warnings, error) {
69-
rke2configlog.Info("RKE2Config validate create", "rke2config", klog.KObj(r))
92+
func (r *RKE2ConfigCustomValidator) ValidateCreate(_ context.Context, obj runtime.Object) (admission.Warnings, error) {
93+
rc, ok := obj.(*RKE2Config)
94+
if !ok {
95+
return nil, fmt.Errorf("expected a RKE2Config object but got %T", obj)
96+
}
97+
98+
rke2configlog.Info("RKE2Config validate create", "rke2config", klog.KObj(rc))
7099

71100
var allErrs field.ErrorList
72101

73-
allErrs = append(allErrs, ValidateRKE2ConfigSpec(r.Name, &r.Spec)...)
102+
allErrs = append(allErrs, ValidateRKE2ConfigSpec(rc.Name, &rc.Spec)...)
74103

75104
if len(allErrs) == 0 {
76105
return nil, nil
77106
}
78107

79-
return nil, apierrors.NewInvalid(GroupVersion.WithKind("RKE2Config").GroupKind(), r.Name, allErrs)
108+
return nil, apierrors.NewInvalid(GroupVersion.WithKind("RKE2Config").GroupKind(), rc.Name, allErrs)
80109
}
81110

82111
// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type.
83-
func (r *RKE2Config) ValidateUpdate(_ runtime.Object) (admission.Warnings, error) {
84-
rke2configlog.Info("RKE2Config validate update", "rke2config", klog.KObj(r))
112+
func (r *RKE2ConfigCustomValidator) ValidateUpdate(_ context.Context, _, newObj runtime.Object) (admission.Warnings, error) {
113+
newrc, ok := newObj.(*RKE2Config)
114+
if !ok {
115+
return nil, fmt.Errorf("expected a RKE2Config object but got %T", newObj)
116+
}
117+
118+
rke2configlog.Info("RKE2Config validate update", "rke2config", klog.KObj(newrc))
85119

86120
var allErrs field.ErrorList
87121

88-
allErrs = append(allErrs, ValidateRKE2ConfigSpec(r.Name, &r.Spec)...)
122+
allErrs = append(allErrs, ValidateRKE2ConfigSpec(newrc.Name, &newrc.Spec)...)
89123

90124
if len(allErrs) == 0 {
91125
return nil, nil
92126
}
93127

94-
return nil, apierrors.NewInvalid(GroupVersion.WithKind("RKE2Config").GroupKind(), r.Name, allErrs)
128+
return nil, apierrors.NewInvalid(GroupVersion.WithKind("RKE2Config").GroupKind(), newrc.Name, allErrs)
95129
}
96130

97131
// ValidateDelete implements webhook.Validator so a webhook will be registered for the type.
98-
func (r *RKE2Config) ValidateDelete() (admission.Warnings, error) {
132+
func (r *RKE2ConfigCustomValidator) ValidateDelete(_ context.Context, _ runtime.Object) (admission.Warnings, error) {
99133
return nil, nil
100134
}
101135

bootstrap/api/v1beta1/rke2config_webhook_test.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package v1beta1
1818

1919
import (
20+
"context"
2021
"testing"
2122

2223
. "github.com/onsi/gomega"
@@ -68,6 +69,7 @@ func TestRKE2Config_ValidateCreate(t *testing.T) {
6869
},
6970
}
7071

72+
validator := RKE2ConfigCustomValidator{}
7173
for _, tt := range tests {
7274
t.Run(tt.name, func(t *testing.T) {
7375
RegisterTestingT(t)
@@ -76,7 +78,7 @@ func TestRKE2Config_ValidateCreate(t *testing.T) {
7678
Spec: *tt.spec.DeepCopy(),
7779
}
7880

79-
_, err := config.ValidateCreate()
81+
_, err := validator.ValidateCreate(context.Background(), config)
8082

8183
if tt.expectErr {
8284
Expect(err).To(HaveOccurred())

bootstrap/api/v1beta1/rke2configtemplate_webhook.go

+55-13
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ limitations under the License.
1717
package v1beta1
1818

1919
import (
20+
"context"
21+
"fmt"
22+
23+
apierrors "k8s.io/apimachinery/pkg/api/errors"
2024
"k8s.io/apimachinery/pkg/runtime"
2125
ctrl "sigs.k8s.io/controller-runtime"
2226
logf "sigs.k8s.io/controller-runtime/pkg/log"
@@ -27,43 +31,81 @@ import (
2731
// RKE2configtemplatelog is for logging in this package.
2832
var RKE2configtemplatelog = logf.Log.WithName("RKE2configtemplate-resource")
2933

30-
// SetupWebhookWithManager sets up and registers the webhook with the manager.
31-
func (r *RKE2ConfigTemplate) SetupWebhookWithManager(mgr ctrl.Manager) error {
34+
// RKE2ConfigTemplateCustomDefaulter struct is responsible for setting default values on the custom resource of the
35+
// Kind RKE2ConfigTemplate when those are created or updated.
36+
// NOTE: The +kubebuilder:object:generate=false marker prevents controller-gen from generating DeepCopy methods,
37+
// as it is used only for temporary operations and does not need to be deeply copied.
38+
// +kubebuilder:object:generate=false
39+
type RKE2ConfigTemplateCustomDefaulter struct{}
40+
41+
// RKE2ConfigTemplateCustomValidator struct is responsible for validating the RKE2ConfigTemplate resource
42+
// when it is created, updated, or deleted.
43+
// NOTE: The +kubebuilder:object:generate=false marker prevents controller-gen from generating DeepCopy methods,
44+
// as it is used only for temporary operations and does not need to be deeply copied.
45+
// +kubebuilder:object:generate=false
46+
type RKE2ConfigTemplateCustomValidator struct{}
47+
48+
// SetupRKE2ConfigTemplateWebhookWithManager sets up the Controller Manager for the Webhook for the RKE2ControlPlaneTemplate resource.
49+
func SetupRKE2ConfigTemplateWebhookWithManager(mgr ctrl.Manager) error {
3250
return ctrl.NewWebhookManagedBy(mgr).
33-
For(r).
51+
For(&RKE2ConfigTemplate{}).
52+
WithValidator(&RKE2ConfigTemplateCustomValidator{}).
53+
WithDefaulter(&RKE2ConfigTemplateCustomDefaulter{}).
3454
Complete()
3555
}
3656

3757
//+kubebuilder:webhook:path=/mutate-bootstrap-cluster-x-k8s-io-v1beta1-rke2configtemplate,mutating=true,failurePolicy=fail,sideEffects=None,groups=bootstrap.cluster.x-k8s.io,resources=rke2configtemplates,verbs=create;update,versions=v1beta1,name=mrke2configtemplate.kb.io,admissionReviewVersions=v1
3858

39-
var _ webhook.Defaulter = &RKE2ConfigTemplate{}
59+
var _ webhook.CustomDefaulter = &RKE2ConfigTemplateCustomDefaulter{}
4060

4161
// Default implements webhook.Defaulter so a webhook will be registered for the type.
42-
func (r *RKE2ConfigTemplate) Default() {
43-
RKE2configtemplatelog.Info("default", "name", r.Name)
62+
func (r *RKE2ConfigTemplateCustomDefaulter) Default(_ context.Context, obj runtime.Object) error {
63+
rct, ok := obj.(*RKE2ConfigTemplate)
64+
if !ok {
65+
return apierrors.NewBadRequest(fmt.Sprintf("expected a RKE2ConfigTemplate but got a %T", obj))
66+
}
67+
68+
RKE2configtemplatelog.Info("default", "name", rct.Name)
69+
70+
return nil
4471
}
4572

4673
//+kubebuilder:webhook:path=/validate-bootstrap-cluster-x-k8s-io-v1beta1-rke2configtemplate,mutating=false,failurePolicy=fail,sideEffects=None,groups=bootstrap.cluster.x-k8s.io,resources=rke2configtemplates,verbs=create;update,versions=v1beta1,name=vrke2configtemplate.kb.io,admissionReviewVersions=v1
4774

48-
var _ webhook.Validator = &RKE2ConfigTemplate{}
75+
var _ webhook.CustomValidator = &RKE2ConfigTemplateCustomValidator{}
4976

5077
// ValidateCreate implements webhook.Validator so a webhook will be registered for the type.
51-
func (r *RKE2ConfigTemplate) ValidateCreate() (admission.Warnings, error) {
52-
RKE2configtemplatelog.Info("validate create", "name", r.Name)
78+
func (r *RKE2ConfigTemplateCustomValidator) ValidateCreate(_ context.Context, obj runtime.Object) (admission.Warnings, error) {
79+
rct, ok := obj.(*RKE2ConfigTemplate)
80+
if !ok {
81+
return nil, fmt.Errorf("expected a RKE2ConfigTemplate object but got %T", obj)
82+
}
83+
84+
RKE2configtemplatelog.Info("validate create", "name", rct.Name)
5385

5486
return nil, nil
5587
}
5688

5789
// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type.
58-
func (r *RKE2ConfigTemplate) ValidateUpdate(_ runtime.Object) (admission.Warnings, error) {
59-
RKE2configtemplatelog.Info("validate update", "name", r.Name)
90+
func (r *RKE2ConfigTemplateCustomValidator) ValidateUpdate(_ context.Context, oldObj, _ runtime.Object) (admission.Warnings, error) {
91+
rct, ok := oldObj.(*RKE2ConfigTemplate)
92+
if !ok {
93+
return nil, fmt.Errorf("expected a RKE2ConfigTemplate object but got %T", oldObj)
94+
}
95+
96+
RKE2configtemplatelog.Info("validate update", "name", rct.Name)
6097

6198
return nil, nil
6299
}
63100

64101
// ValidateDelete implements webhook.Validator so a webhook will be registered for the type.
65-
func (r *RKE2ConfigTemplate) ValidateDelete() (admission.Warnings, error) {
66-
RKE2configtemplatelog.Info("validate delete", "name", r.Name)
102+
func (r *RKE2ConfigTemplateCustomValidator) ValidateDelete(_ context.Context, obj runtime.Object) (admission.Warnings, error) {
103+
rct, ok := obj.(*RKE2ConfigTemplate)
104+
if !ok {
105+
return nil, fmt.Errorf("expected a RKE2ConfigTemplate object but got %T", obj)
106+
}
107+
108+
RKE2configtemplatelog.Info("validate delete", "name", rct.Name)
67109

68110
return nil, nil
69111
}

bootstrap/api/v1beta1/webhook_suite_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,10 @@ var _ = BeforeSuite(func() {
105105
})
106106
Expect(err).NotTo(HaveOccurred())
107107

108-
err = (&RKE2Config{}).SetupWebhookWithManager(mgr)
108+
err = SetupRKE2ConfigWebhookWithManager(mgr)
109109
Expect(err).NotTo(HaveOccurred())
110110

111-
err = (&RKE2ConfigTemplate{}).SetupWebhookWithManager(mgr)
111+
err = SetupRKE2ConfigTemplateWebhookWithManager(mgr)
112112
Expect(err).NotTo(HaveOccurred())
113113

114114
//+kubebuilder:scaffold:webhook

bootstrap/main.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -224,13 +224,13 @@ func setupReconcilers(mgr ctrl.Manager) {
224224
}
225225

226226
func setupWebhooks(mgr ctrl.Manager) {
227-
if err := (&bootstrapv1.RKE2Config{}).SetupWebhookWithManager(mgr); err != nil {
228-
setupLog.Error(err, "unable to create webhook", "webhook", "Rke2Config")
227+
if err := bootstrapv1.SetupRKE2ConfigTemplateWebhookWithManager(mgr); err != nil {
228+
setupLog.Error(err, "unable to create webhook", "webhook", "RKE2ConfigTemplate")
229229
os.Exit(1)
230230
}
231231

232-
if err := (&bootstrapv1.RKE2ConfigTemplate{}).SetupWebhookWithManager(mgr); err != nil {
233-
setupLog.Error(err, "unable to create webhook", "webhook", "Rke2ConfigTemplate")
232+
if err := bootstrapv1.SetupRKE2ConfigWebhookWithManager(mgr); err != nil {
233+
setupLog.Error(err, "unable to create webhook", "webhook", "RKE2Config")
234234
os.Exit(1)
235235
}
236236
}

0 commit comments

Comments
 (0)