Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rewerite former Defaulter webhooks #3745

Merged
merged 2 commits into from
Jan 22, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading