@@ -42,8 +42,10 @@ func (r *AWSMachinePool) SetupWebhookWithManager(mgr ctrl.Manager) error {
4242// +kubebuilder:webhook:verbs=create;update,path=/validate-infrastructure-cluster-x-k8s-io-v1beta2-awsmachinepool,mutating=false,failurePolicy=fail,matchPolicy=Equivalent,groups=infrastructure.cluster.x-k8s.io,resources=awsmachinepools,versions=v1beta2,name=validation.awsmachinepool.infrastructure.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta1
4343// +kubebuilder:webhook:verbs=create;update,path=/mutate-infrastructure-cluster-x-k8s-io-v1beta2-awsmachinepool,mutating=true,failurePolicy=fail,matchPolicy=Equivalent,groups=infrastructure.cluster.x-k8s.io,resources=awsmachinepools,versions=v1beta2,name=default.awsmachinepool.infrastructure.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta1
4444
45- var _ webhook.Defaulter = & AWSMachinePool {}
46- var _ webhook.Validator = & AWSMachinePool {}
45+ var (
46+ _ webhook.Defaulter = & AWSMachinePool {}
47+ _ webhook.Validator = & AWSMachinePool {}
48+ )
4749
4850func (r * AWSMachinePool ) validateDefaultCoolDown () field.ErrorList {
4951 var allErrs field.ErrorList
@@ -108,6 +110,7 @@ func (r *AWSMachinePool) validateAdditionalSecurityGroups() field.ErrorList {
108110 }
109111 return allErrs
110112}
113+
111114func (r * AWSMachinePool ) validateSpotInstances () field.ErrorList {
112115 var allErrs field.ErrorList
113116 if r .Spec .AWSLaunchTemplate .SpotMarketOptions != nil && r .Spec .MixedInstancesPolicy != nil {
@@ -116,6 +119,37 @@ func (r *AWSMachinePool) validateSpotInstances() field.ErrorList {
116119 return allErrs
117120}
118121
122+ func (r * AWSMachinePool ) validateLifecycleHooks () field.ErrorList {
123+ return validateLifecycleHooks (r .Spec .AWSLifecycleHooks )
124+ }
125+
126+ func validateLifecycleHooks (hooks []AWSLifecycleHook ) field.ErrorList {
127+ var allErrs field.ErrorList
128+
129+ for _ , hook := range hooks {
130+ if hook .Name == "" {
131+ allErrs = append (allErrs , field .Required (field .NewPath ("spec.lifecycleHooks.name" ), "Name is required" ))
132+ }
133+ if hook .NotificationTargetARN != nil && hook .RoleARN == nil {
134+ allErrs = append (allErrs , field .Required (field .NewPath ("spec.lifecycleHooks.roleARN" ), "RoleARN is required if NotificationTargetARN is provided" ))
135+ }
136+ if hook .RoleARN != nil && hook .NotificationTargetARN == nil {
137+ allErrs = append (allErrs , field .Required (field .NewPath ("spec.lifecycleHooks.notificationTargetARN" ), "NotificationTargetARN is required if RoleARN is provided" ))
138+ }
139+ if hook .LifecycleTransition != LifecycleTransitionInstanceLaunch && hook .LifecycleTransition != LifecycleTransitionInstanceTerminate {
140+ allErrs = append (allErrs , field .Invalid (field .NewPath ("spec.lifecycleHooks.lifecycleTransition" ), hook .LifecycleTransition , "LifecycleTransition must be either EC2_INSTANCE_LAUNCHING or EC2_INSTANCE_TERMINATING" ))
141+ }
142+ if hook .DefaultResult != nil && (* hook .DefaultResult != DefaultResultContinue && * hook .DefaultResult != DefaultResultAbandon ) {
143+ allErrs = append (allErrs , field .Invalid (field .NewPath ("spec.lifecycleHooks.defaultResult" ), * hook .DefaultResult , "DefaultResult must be either CONTINUE or ABANDON" ))
144+ }
145+ if hook .HeartbeatTimeout != nil && (hook .HeartbeatTimeout .Seconds () < float64 (30 ) || hook .HeartbeatTimeout .Seconds () > float64 (172800 )) {
146+ allErrs = append (allErrs , field .Invalid (field .NewPath ("spec.lifecycleHooks.heartbeatTimeout" ), * hook .HeartbeatTimeout , "HeartbeatTimeout must be between 30 and 172800 seconds" ))
147+ }
148+ }
149+
150+ return allErrs
151+ }
152+
119153// ValidateCreate will do any extra validation when creating a AWSMachinePool.
120154func (r * AWSMachinePool ) ValidateCreate () (admission.Warnings , error ) {
121155 log .Info ("AWSMachinePool validate create" , "machine-pool" , klog .KObj (r ))
@@ -128,6 +162,7 @@ func (r *AWSMachinePool) ValidateCreate() (admission.Warnings, error) {
128162 allErrs = append (allErrs , r .validateSubnets ()... )
129163 allErrs = append (allErrs , r .validateAdditionalSecurityGroups ()... )
130164 allErrs = append (allErrs , r .validateSpotInstances ()... )
165+ allErrs = append (allErrs , r .validateLifecycleHooks ()... )
131166
132167 if len (allErrs ) == 0 {
133168 return nil , nil
@@ -149,6 +184,7 @@ func (r *AWSMachinePool) ValidateUpdate(_ runtime.Object) (admission.Warnings, e
149184 allErrs = append (allErrs , r .validateSubnets ()... )
150185 allErrs = append (allErrs , r .validateAdditionalSecurityGroups ()... )
151186 allErrs = append (allErrs , r .validateSpotInstances ()... )
187+ allErrs = append (allErrs , r .validateLifecycleHooks ()... )
152188
153189 if len (allErrs ) == 0 {
154190 return nil , nil
0 commit comments