Skip to content

Commit

Permalink
Rewerite former Defaulter webhooks
Browse files Browse the repository at this point in the history
controller runtime 0.20.0 removes thos interfaces as they are deprecated

Co-authored-by: Georgi Sabev <[email protected]>
  • Loading branch information
uzabanov and georgethebeatle committed Jan 22, 2025
1 parent be5826a commit b979308
Show file tree
Hide file tree
Showing 7 changed files with 168 additions and 81 deletions.
54 changes: 29 additions & 25 deletions controllers/api/v1alpha1/cfapp_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,12 @@ limitations under the License.
package v1alpha1

import (
"context"

"code.cloudfoundry.org/korifi/tools"
"k8s.io/apimachinery/pkg/runtime"
ctrl "sigs.k8s.io/controller-runtime"
logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/webhook"
)

const (
Expand All @@ -29,41 +32,42 @@ const (
// log is for logging in this package.
var cfapplog = logf.Log.WithName("cfapp-resource")

func (r *CFApp) SetupWebhookWithManager(mgr ctrl.Manager) error {
//+kubebuilder:webhook:path=/mutate-korifi-cloudfoundry-org-v1alpha1-cfapp,mutating=true,failurePolicy=fail,sideEffects=None,groups=korifi.cloudfoundry.org,resources=cfapps,verbs=create;update,versions=v1alpha1,name=mcfapp.korifi.cloudfoundry.org,admissionReviewVersions={v1,v1beta1}

type CFAppDefaulter struct{}

func NewCFAppDefaulter() *CFAppDefaulter {
return &CFAppDefaulter{}
}

func (d *CFAppDefaulter) SetupWebhookWithManager(mgr ctrl.Manager) error {
return ctrl.NewWebhookManagedBy(mgr).
For(r).
For(&CFApp{}).
WithDefaulter(d).
Complete()
}

//+kubebuilder:webhook:path=/mutate-korifi-cloudfoundry-org-v1alpha1-cfapp,mutating=true,failurePolicy=fail,sideEffects=None,groups=korifi.cloudfoundry.org,resources=cfapps,verbs=create;update,versions=v1alpha1,name=mcfapp.korifi.cloudfoundry.org,admissionReviewVersions={v1,v1beta1}

var _ webhook.Defaulter = &CFApp{}

// Default implements webhook.Defaulter so a webhook will be registered for the type
func (r *CFApp) Default() {
cfapplog.V(1).Info("mutating CFApp webhook handler", "name", r.Name)
r.SetLabels(r.defaultLabels(r.GetLabels()))
r.SetAnnotations(r.defaultAnnotations(r.GetAnnotations()))
}
func (r *CFAppDefaulter) Default(ctx context.Context, obj runtime.Object) error {
cfApp := obj.(*CFApp)
cfapplog.V(1).Info("mutating CFApp webhook handler", "name", cfApp.Name)

func (r *CFApp) defaultLabels(appLabels map[string]string) map[string]string {
if appLabels == nil {
appLabels = make(map[string]string)
}
appLabels[CFAppGUIDLabelKey] = r.Name
r.defaultLabels(cfApp)
r.defaultAnnotations(cfApp)

return appLabels
return nil
}

func (r *CFApp) defaultAnnotations(appAnnotations map[string]string) map[string]string {
if appAnnotations == nil {
appAnnotations = make(map[string]string)
}
func (r *CFAppDefaulter) defaultLabels(cfApp *CFApp) {
cfApp.SetLabels(tools.SetMapValue(cfApp.GetLabels(), CFAppGUIDLabelKey, cfApp.Name))
}

func (r *CFAppDefaulter) defaultAnnotations(cfApp *CFApp) {
appAnnotations := cfApp.GetAnnotations()
_, hasRevAnnotation := appAnnotations[CFAppRevisionKey]

if !hasRevAnnotation {
appAnnotations[CFAppRevisionKey] = CFAppRevisionKeyDefault
appAnnotations = tools.SetMapValue(appAnnotations, CFAppRevisionKey, CFAppRevisionKeyDefault)
}

return appAnnotations
cfApp.SetAnnotations(appAnnotations)
}
40 changes: 25 additions & 15 deletions controllers/api/v1alpha1/cfbuild_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,32 +17,42 @@ limitations under the License.
package v1alpha1

import (
"context"

"code.cloudfoundry.org/korifi/tools"
"k8s.io/apimachinery/pkg/runtime"
ctrl "sigs.k8s.io/controller-runtime"
logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/webhook"
)

// log is for logging in this package.
var cfbuildlog = logf.Log.WithName("cfbuild-resource")

func (r *CFBuild) SetupWebhookWithManager(mgr ctrl.Manager) error {
//+kubebuilder:webhook:path=/mutate-korifi-cloudfoundry-org-v1alpha1-cfbuild,mutating=true,failurePolicy=fail,sideEffects=None,groups=korifi.cloudfoundry.org,resources=cfbuilds,verbs=create;update,versions=v1alpha1,name=mcfbuild.korifi.cloudfoundry.org,admissionReviewVersions={v1,v1beta1}

type CFBuildDefaulter struct{}

func NewCFBuildDefaulter() *CFBuildDefaulter {
return &CFBuildDefaulter{}
}

func (d *CFBuildDefaulter) SetupWebhookWithManager(mgr ctrl.Manager) error {
return ctrl.NewWebhookManagedBy(mgr).
For(r).
For(&CFBuild{}).
WithDefaulter(d).
Complete()
}

//+kubebuilder:webhook:path=/mutate-korifi-cloudfoundry-org-v1alpha1-cfbuild,mutating=true,failurePolicy=fail,sideEffects=None,groups=korifi.cloudfoundry.org,resources=cfbuilds,verbs=create;update,versions=v1alpha1,name=mcfbuild.korifi.cloudfoundry.org,admissionReviewVersions={v1,v1beta1}
// Default implements webhook.Defaulter so a webhook will be registered for the type
func (r *CFBuildDefaulter) Default(ctx context.Context, obj runtime.Object) error {
cfBuild := obj.(*CFBuild)
cfbuildlog.V(1).Info("mutating Webhook for CFBuild", "name", cfBuild.Name)
buildLabels := cfBuild.GetLabels()

var _ webhook.Defaulter = &CFBuild{}
buildLabels = tools.SetMapValue(buildLabels, CFAppGUIDLabelKey, cfBuild.Spec.AppRef.Name)
buildLabels = tools.SetMapValue(buildLabels, CFPackageGUIDLabelKey, cfBuild.Spec.PackageRef.Name)

// Default implements webhook.Defaulter so a webhook will be registered for the type
func (r *CFBuild) Default() {
cfbuildlog.V(1).Info("mutating Webhook for CFBuild", "name", r.Name)
buildLabels := r.GetLabels()
if buildLabels == nil {
buildLabels = make(map[string]string)
}
buildLabels[CFAppGUIDLabelKey] = r.Spec.AppRef.Name
buildLabels[CFPackageGUIDLabelKey] = r.Spec.PackageRef.Name
r.SetLabels(buildLabels)
cfBuild.SetLabels(buildLabels)

return nil
}
37 changes: 22 additions & 15 deletions controllers/api/v1alpha1/cfpackage_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,31 +17,38 @@ limitations under the License.
package v1alpha1

import (
"context"

"code.cloudfoundry.org/korifi/tools"
ctrl "sigs.k8s.io/controller-runtime"

runtime "k8s.io/apimachinery/pkg/runtime"
logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/webhook"
)

// log is for logging in this package.
var cfpackagelog = logf.Log.WithName("cfpackage-resource")

func (r *CFPackage) SetupWebhookWithManager(mgr ctrl.Manager) error {
//+kubebuilder:webhook:path=/mutate-korifi-cloudfoundry-org-v1alpha1-cfpackage,mutating=true,failurePolicy=fail,sideEffects=None,groups=korifi.cloudfoundry.org,resources=cfpackages,verbs=create;update,versions=v1alpha1,name=mcfpackage.korifi.cloudfoundry.org,admissionReviewVersions={v1,v1beta1}

type CFPackageDefaulter struct{}

func NewCFPackageDefaulter() *CFPackageDefaulter {
return &CFPackageDefaulter{}
}

func (d *CFPackageDefaulter) SetupWebhookWithManager(mgr ctrl.Manager) error {
return ctrl.NewWebhookManagedBy(mgr).
For(r).
For(&CFPackage{}).
WithDefaulter(d).
Complete()
}

//+kubebuilder:webhook:path=/mutate-korifi-cloudfoundry-org-v1alpha1-cfpackage,mutating=true,failurePolicy=fail,sideEffects=None,groups=korifi.cloudfoundry.org,resources=cfpackages,verbs=create;update,versions=v1alpha1,name=mcfpackage.korifi.cloudfoundry.org,admissionReviewVersions={v1,v1beta1}
func (r *CFPackageDefaulter) Default(ctx context.Context, obj runtime.Object) error {
cfPackage := obj.(*CFPackage)
cfpackagelog.V(1).Info("mutating CFPackage webhook handler", "name", cfPackage.Name)

cfPackage.SetLabels(tools.SetMapValue(cfPackage.GetLabels(), CFAppGUIDLabelKey, cfPackage.Spec.AppRef.Name))

var _ webhook.Defaulter = &CFPackage{}

// Default implements webhook.Defaulter so a webhook will be registered for the type
func (r *CFPackage) Default() {
cfpackagelog.V(1).Info("mutating CFPackage webhook handler", "name", r.Name)
packageLabels := r.GetLabels()
if packageLabels == nil {
packageLabels = make(map[string]string)
}
packageLabels[CFAppGUIDLabelKey] = r.Spec.AppRef.Name
r.SetLabels(packageLabels)
return nil
}
42 changes: 24 additions & 18 deletions controllers/api/v1alpha1/cfroute_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,34 +17,40 @@ limitations under the License.
package v1alpha1

import (
"context"

"code.cloudfoundry.org/korifi/tools"
runtime "k8s.io/apimachinery/pkg/runtime"
ctrl "sigs.k8s.io/controller-runtime"
logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/webhook"
)

// log is for logging in this package.
var cfroutelog = logf.Log.WithName("cfroute-resource")

func (r *CFRoute) SetupWebhookWithManager(mgr ctrl.Manager) error {
return ctrl.NewWebhookManagedBy(mgr).
For(r).
Complete()
}

//+kubebuilder:webhook:path=/mutate-korifi-cloudfoundry-org-v1alpha1-cfroute,mutating=true,failurePolicy=fail,sideEffects=None,groups=korifi.cloudfoundry.org,resources=cfroutes,verbs=create;update,versions=v1alpha1,name=mcfroute.korifi.cloudfoundry.org,admissionReviewVersions={v1,v1beta1}

var _ webhook.Defaulter = &CFRoute{}
type CFRouteDefaulter struct{}

// Default implements webhook.Defaulter so a webhook will be registered for the type
func (r *CFRoute) Default() {
cfroutelog.V(1).Info("mutating CFRoute webhook handler", "name", r.Name)
routeLabels := r.GetLabels()
func NewCFRouteDefaulter() *CFRouteDefaulter {
return &CFRouteDefaulter{}
}

if routeLabels == nil {
routeLabels = make(map[string]string)
}
func (d *CFRouteDefaulter) SetupWebhookWithManager(mgr ctrl.Manager) error {
return ctrl.NewWebhookManagedBy(mgr).
For(&CFRoute{}).
WithDefaulter(d).
Complete()
}

routeLabels[CFDomainGUIDLabelKey] = r.Spec.DomainRef.Name
routeLabels[CFRouteGUIDLabelKey] = r.Name
r.SetLabels(routeLabels)
// Default implements webhook.Defaulter so a webhook will be registered for the type
func (r *CFRouteDefaulter) Default(ctx context.Context, obj runtime.Object) error {
cfRoute := obj.(*CFRoute)
cfroutelog.V(1).Info("mutating CFRoute webhook handler", "name", cfRoute.Name)
routeLabels := cfRoute.GetLabels()
routeLabels = tools.SetMapValue(routeLabels, CFDomainGUIDLabelKey, cfRoute.Spec.DomainRef.Name)
routeLabels = tools.SetMapValue(routeLabels, CFRouteGUIDLabelKey, cfRoute.Name)
cfRoute.SetLabels(routeLabels)

return nil
}
8 changes: 4 additions & 4 deletions controllers/api/v1alpha1/webhook_suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,12 +98,12 @@ var _ = BeforeSuite(func() {
adminClient, stopClientCache = helpers.NewCachedClient(testEnv.Config)

uncachedClient := helpers.NewUncachedClient(k8sManager.GetConfig())
Expect((&korifiv1alpha1.CFApp{}).SetupWebhookWithManager(k8sManager)).To(Succeed())
Expect(korifiv1alpha1.NewCFAppDefaulter().SetupWebhookWithManager(k8sManager)).To(Succeed())
Expect(apps.NewValidator(
validation.NewDuplicateValidator(coordination.NewNameRegistry(uncachedClient, apps.AppEntityType)),
).SetupWebhookWithManager(k8sManager)).To(Succeed())

Expect((&korifiv1alpha1.CFRoute{}).SetupWebhookWithManager(k8sManager)).To(Succeed())
Expect(korifiv1alpha1.NewCFRouteDefaulter().SetupWebhookWithManager(k8sManager)).To(Succeed())
Expect(routes.NewValidator(
validation.NewDuplicateValidator(coordination.NewNameRegistry(uncachedClient, routes.RouteEntityType)),
namespace,
Expand All @@ -112,12 +112,12 @@ var _ = BeforeSuite(func() {

Expect(domains.NewValidator(uncachedClient).SetupWebhookWithManager(k8sManager)).To(Succeed())

Expect((&korifiv1alpha1.CFPackage{}).SetupWebhookWithManager(k8sManager)).To(Succeed())
Expect(korifiv1alpha1.NewCFPackageDefaulter().SetupWebhookWithManager(k8sManager)).To(Succeed())

Expect(korifiv1alpha1.NewCFProcessDefaulter(defaultMemoryMB, defaultDiskQuotaMB, defaultTimeout).
SetupWebhookWithManager(k8sManager)).To(Succeed())

Expect((&korifiv1alpha1.CFBuild{}).SetupWebhookWithManager(k8sManager)).To(Succeed())
Expect(korifiv1alpha1.NewCFBuildDefaulter().SetupWebhookWithManager(k8sManager)).To(Succeed())

Expect(adminClient.Create(ctx, &corev1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Expand Down
60 changes: 60 additions & 0 deletions controllers/api/v1alpha1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit b979308

Please sign in to comment.