@@ -19,55 +19,100 @@ package v1alpha1
1919import (
2020 "context"
2121 "fmt"
22+ "net/url"
2223
2324 "k8s.io/apimachinery/pkg/runtime"
2425 ctrl "sigs.k8s.io/controller-runtime"
2526 logf "sigs.k8s.io/controller-runtime/pkg/log"
2627 "sigs.k8s.io/controller-runtime/pkg/webhook/admission"
2728
2829 metal3api "github.com/metal3-io/ironic-standalone-operator/api/v1alpha1"
29- validation "github.com/metal3-io/ironic-standalone-operator/pkg/ironic"
30+ "github.com/metal3-io/ironic-standalone-operator/pkg/ironic"
3031)
3132
33+ var deployBaseURL = url.URL {
34+ Scheme : "file" ,
35+ Path : "/shared/html" ,
36+ }
37+
3238// log is for logging in this package.
3339var ironiclog = logf .Log .WithName ("webhooks" ).WithName ("Ironic" )
3440
3541func SetupIronicWebhookWithManager (mgr ctrl.Manager ) error {
3642 return ctrl .NewWebhookManagedBy (mgr ).
3743 For (& metal3api.Ironic {}).
44+ WithDefaulter (& IronicCustomDefaulter {}).
3845 WithValidator (& IronicCustomValidator {}).
3946 Complete ()
4047}
4148
49+ // +kubebuilder:webhook:path=/mutate-ironic-metal3-io-v1alpha1-ironic,mutating=true,failurePolicy=fail,sideEffects=None,groups=ironic.metal3.io,resources=ironics,verbs=create;update,versions=v1alpha1,name=mutate-ironic.ironic.metal3.io,admissionReviewVersions=v1
50+
51+ type IronicCustomDefaulter struct {}
52+
53+ // Default implements webhook.Defaulter.
54+ func (r * IronicCustomDefaulter ) Default (_ context.Context , obj runtime.Object ) error {
55+ ir , ok := obj .(* metal3api.Ironic )
56+ if ! ok {
57+ return fmt .Errorf ("expected an Ironic, got %T" , obj )
58+ }
59+
60+ ironiclog .Info ("default" , "name" , ir .Name )
61+
62+ // Set default DeployKernel if neither DeployKernel nor DeployKernelByArch is set
63+ if ir .Spec .DeployRamdisk .DeployKernel == "" && ir .Spec .DeployRamdisk .DeployKernelByArch == "" {
64+ ir .Spec .DeployRamdisk .DeployKernel = deployBaseURL .JoinPath (ironic .DefaultKernelPath ).String ()
65+ }
66+
67+ // Set default DeployRamdisk if neither DeployRamdisk nor DeployRamdiskByArch is set
68+ if ir .Spec .DeployRamdisk .DeployRamdisk == "" && ir .Spec .DeployRamdisk .DeployRamdiskByArch == "" {
69+ ir .Spec .DeployRamdisk .DeployRamdisk = deployBaseURL .JoinPath (ironic .DefaultRamdiskPath ).String ()
70+ }
71+
72+ // Set default probes when using default IPA paths (not multi-arch)
73+ if ir .Spec .DeployRamdisk .DeployKernelByArch == "" && ir .Spec .DeployRamdisk .DeployRamdiskByArch == "" {
74+ defaultProbe := ironic .BuildDefaultHttpdProbe (& ir .Spec )
75+
76+ if ir .Spec .DeployRamdisk .LivenessProbe == nil {
77+ ir .Spec .DeployRamdisk .LivenessProbe = defaultProbe
78+ }
79+ if ir .Spec .DeployRamdisk .ReadinessProbe == nil {
80+ ir .Spec .DeployRamdisk .ReadinessProbe = defaultProbe
81+ }
82+ }
83+
84+ return nil
85+ }
86+
4287// +kubebuilder:webhook:path=/validate-ironic-metal3-io-v1alpha1-ironic,mutating=false,failurePolicy=fail,sideEffects=None,groups=ironic.metal3.io,resources=ironics,verbs=create;update,versions=v1alpha1,name=validate-ironic.ironic.metal3.io,admissionReviewVersions=v1
4388
4489type IronicCustomValidator struct {}
4590
4691// ValidateCreate implements webhook.Validator so a webhook will be registered for the type.
4792func (r * IronicCustomValidator ) ValidateCreate (_ context.Context , obj runtime.Object ) (admission.Warnings , error ) {
48- ironic , ok := obj .(* metal3api.Ironic )
93+ ir , ok := obj .(* metal3api.Ironic )
4994 if ! ok {
5095 return nil , fmt .Errorf ("expected an Ironic, got %T" , obj )
5196 }
5297
53- ironiclog .Info ("validate create" , "name" , ironic .Name )
54- return nil , validation .ValidateIronic (& ironic .Spec , nil )
98+ ironiclog .Info ("validate create" , "name" , ir .Name )
99+ return nil , ironic .ValidateIronic (& ir .Spec , nil )
55100}
56101
57102// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type.
58103func (r * IronicCustomValidator ) ValidateUpdate (_ context.Context , oldObj , newObj runtime.Object ) (admission.Warnings , error ) {
59- ironic , ok := newObj .(* metal3api.Ironic )
104+ ir , ok := newObj .(* metal3api.Ironic )
60105 if ! ok {
61106 return nil , fmt .Errorf ("expected an Ironic for newObj, got %T" , newObj )
62107 }
63108
64- oldIronic , ok := oldObj .(* metal3api.Ironic )
109+ oldIr , ok := oldObj .(* metal3api.Ironic )
65110 if ! ok {
66111 return nil , fmt .Errorf ("expected an Ironic for oldObj, got %T" , oldObj )
67112 }
68113
69- ironiclog .Info ("validate update" , "name" , ironic .Name )
70- return nil , validation .ValidateIronic (& ironic .Spec , & oldIronic .Spec )
114+ ironiclog .Info ("validate update" , "name" , ir .Name )
115+ return nil , ironic .ValidateIronic (& ir .Spec , & oldIr .Spec )
71116}
72117
73118// ValidateDelete implements webhook.Validator so a webhook will be registered for the type.
0 commit comments