44package v1alpha1
55
66import (
7+ "context"
78 "fmt"
89
910 apierrors "k8s.io/apimachinery/pkg/api/errors"
@@ -30,55 +31,99 @@ var DefaultSecurityConfig = SecurityConfig{
3031
3132var pmonLog = logf .Log .WithName ("power-monitor-resource" )
3233
33- func (r * PowerMonitor ) SetupWebhookWithManager (mgr ctrl.Manager ) error {
34- return ctrl .NewWebhookManagedBy (mgr ).
35- For (r ).
34+ // SetupWebhookWithManager registers the webhook for PowerMonitor in the manager.
35+ func SetupWebhookWithManager (mgr ctrl.Manager ) error {
36+ return ctrl .NewWebhookManagedBy (mgr ).For (& PowerMonitor {}).
37+ WithValidator (& PowerMonitorCustomValidator {}).
38+ WithDefaulter (& PowerMonitorCustomDefaulter {}).
3639 Complete ()
3740}
3841
3942// +kubebuilder:webhook:path=/mutate-kepler-system-sustainable-computing-io-v1alpha1-powermonitor,mutating=true,failurePolicy=fail,sideEffects=None,groups=kepler.system.sustainable.computing.io,resources=powermonitors,verbs=create;update,versions=v1alpha1,name=mpowermonitor.kb.io,admissionReviewVersions=v1
4043
41- var _ webhook.Defaulter = & PowerMonitor {}
44+ // PowerMonitorCustomDefaulter struct is responsible for setting default values on the custom resource of the
45+ // Kind PowerMonitor when those are created or updated.
46+ //
47+ // NOTE: The +kubebuilder:object:generate=false marker prevents controller-gen from generating DeepCopy methods,
48+ // as it is used only for temporary operations and does not need to be deeply copied.
49+ type PowerMonitorCustomDefaulter struct {
50+ // TODO(user): Add more fields as needed for defaulting
51+ }
52+
53+ var _ webhook.CustomDefaulter = & PowerMonitorCustomDefaulter {}
4254
43- // Default implements webhook.Defaulter so a webhook will be registered for the type
44- func (r * PowerMonitor ) Default () {
45- pmonLog .Info ("default" , "name" , r .Name )
46- if r .Spec .Kepler .Deployment .Security .Mode == "" {
55+ // Default implements webhook.CustomDefaulter so a webhook will be registered for the Kind PowerMonitor.
56+ func (d * PowerMonitorCustomDefaulter ) Default (_ context.Context , obj runtime.Object ) error {
57+ powerMonitor , ok := obj .(* PowerMonitor )
58+
59+ if ! ok {
60+ return fmt .Errorf ("expected a PowerMonitor object but got %T" , obj )
61+ }
62+ pmonLog .Info ("Defaulting for PowerMonitor" , "name" , powerMonitor .GetName ())
63+
64+ if powerMonitor .Spec .Kepler .Deployment .Security .Mode == "" {
4765 pmonLog .Info ("default" , "mode" , DefaultSecurityConfig .Mode )
48- r .Spec .Kepler .Deployment .Security .Mode = DefaultSecurityConfig .Mode
66+ powerMonitor .Spec .Kepler .Deployment .Security .Mode = DefaultSecurityConfig .Mode
4967 }
50- if r .Spec .Kepler .Deployment .Security .AllowedSANames == nil {
68+ if powerMonitor .Spec .Kepler .Deployment .Security .AllowedSANames == nil {
5169 pmonLog .Info ("default" , "allowed sa" , DefaultSecurityConfig .AllowedSANames )
52- r .Spec .Kepler .Deployment .Security .AllowedSANames = DefaultSecurityConfig .AllowedSANames
70+ powerMonitor .Spec .Kepler .Deployment .Security .AllowedSANames = DefaultSecurityConfig .AllowedSANames
5371 }
72+
73+ return nil
5474}
5575
5676// +kubebuilder:webhook:path=/validate-kepler-system-sustainable-computing-io-v1alpha1-powermonitor,mutating=false,failurePolicy=fail,sideEffects=None,groups=kepler.system.sustainable.computing.io,resources=powermonitors,verbs=create;update;delete,versions=v1alpha1,name=vpowermonitor.kb.io,admissionReviewVersions=v1
5777
58- var _ webhook.Validator = & PowerMonitor {}
78+ // PowerMonitorCustomValidator struct is responsible for validating the PowerMonitor resource
79+ // when it is created, updated, or deleted.
80+ //
81+ // NOTE: The +kubebuilder:object:generate=false marker prevents controller-gen from generating DeepCopy methods,
82+ // as this struct is used only for temporary operations and does not need to be deeply copied.
83+ type PowerMonitorCustomValidator struct {
84+ // TODO(user): Add more fields as needed for validation
85+ }
5986
60- // ValidateCreate implements webhook.Validator so a webhook will be registered for the type
61- func (r * PowerMonitor ) ValidateCreate () (admission.Warnings , error ) {
62- pmonLog .Info ("validate create" , "name" , r .Name )
87+ var _ webhook.CustomValidator = & PowerMonitorCustomValidator {}
6388
64- // Example: Enforce a specific name if needed
65- if r .Name != PowerMonitorInstanceName {
66- return nil , apierrors .NewBadRequest (fmt .Sprintf ("invalid name %q; name must be %q" , r .Name , PowerMonitorInstanceName ))
89+ // ValidateCreate implements webhook.CustomValidator so a webhook will be registered for the type PowerMonitor.
90+ func (v * PowerMonitorCustomValidator ) ValidateCreate (_ context.Context , obj runtime.Object ) (admission.Warnings , error ) {
91+ powerMonitor , ok := obj .(* PowerMonitor )
92+ if ! ok {
93+ return nil , fmt .Errorf ("expected a PowerMonitor object but got %T" , obj )
94+ }
95+ pmonLog .Info ("Validation for PowerMonitor upon creation" , "name" , powerMonitor .GetName ())
96+
97+ // Enforce a specific name if needed
98+ if powerMonitor .Name != PowerMonitorInstanceName {
99+ return nil , apierrors .NewBadRequest (fmt .Sprintf ("invalid name %q; name must be %q" , powerMonitor .Name , PowerMonitorInstanceName ))
67100 }
68101
69102 return nil , nil
70103}
71104
72- // ValidateUpdate implements webhook.Validator so a webhook will be registered for the type
73- func (r * PowerMonitor ) ValidateUpdate (old runtime.Object ) (admission.Warnings , error ) {
74- pmonLog .Info ("validate update" , "name" , r .Name )
105+ // ValidateUpdate implements webhook.CustomValidator so a webhook will be registered for the type PowerMonitor.
106+ func (v * PowerMonitorCustomValidator ) ValidateUpdate (_ context.Context , oldObj , newObj runtime.Object ) (admission.Warnings , error ) {
107+ powerMonitor , ok := newObj .(* PowerMonitor )
108+ if ! ok {
109+ return nil , fmt .Errorf ("expected a PowerMonitor object for the newObj but got %T" , newObj )
110+ }
111+ pmonLog .Info ("Validation for PowerMonitor upon update" , "name" , powerMonitor .GetName ())
112+
113+ // TODO(user): fill in your validation logic upon object update.
75114
76115 return nil , nil
77116}
78117
79- // ValidateDelete implements webhook.Validator so a webhook will be registered for the type
80- func (r * PowerMonitor ) ValidateDelete () (admission.Warnings , error ) {
81- pmonLog .Info ("validate delete" , "name" , r .Name )
118+ // ValidateDelete implements webhook.CustomValidator so a webhook will be registered for the type PowerMonitor.
119+ func (v * PowerMonitorCustomValidator ) ValidateDelete (_ context.Context , obj runtime.Object ) (admission.Warnings , error ) {
120+ powerMonitor , ok := obj .(* PowerMonitor )
121+ if ! ok {
122+ return nil , fmt .Errorf ("expected a PowerMonitor object but got %T" , obj )
123+ }
124+ pmonLog .Info ("Validation for PowerMonitor upon deletion" , "name" , powerMonitor .GetName ())
125+
126+ // TODO(user): fill in your validation logic upon object deletion.
82127
83128 return nil , nil
84129}
0 commit comments