11/*
2- Copyright 2023 Red Hat, Inc.
2+ Copyright 2025 Red Hat, Inc.
33
44Licensed under the Apache License, Version 2.0 (the "License");
55you may not use this file except in compliance with the License.
@@ -19,24 +19,34 @@ package v1beta1
1919import (
2020 "context"
2121 "errors"
22+ "fmt"
2223
23- runtime "k8s.io/apimachinery/pkg/runtime"
24+ "k8s.io/apimachinery/pkg/runtime"
2425 ctrl "sigs.k8s.io/controller-runtime"
26+ "sigs.k8s.io/controller-runtime/pkg/client"
27+ "sigs.k8s.io/controller-runtime/pkg/webhook"
2528 "sigs.k8s.io/controller-runtime/pkg/webhook/admission"
2629)
2730
28- // +kubebuilder:webhook:path=/validate-multiarch-openshift-io-v1beta1-clusterpodplacementconfig,mutating=false,failurePolicy=fail,sideEffects=None,groups=multiarch.openshift.io,resources=clusterpodplacementconfigs,verbs=create;update,versions=v1beta1,name=validate-clusterpodplacementconfig.multiarch.openshift.io,admissionReviewVersions=v1
31+ // +kubebuilder:webhook:path=/validate-multiarch-openshift-io-v1beta1-clusterpodplacementconfig,mutating=false,failurePolicy=fail,sideEffects=None,groups=multiarch.openshift.io,resources=clusterpodplacementconfigs,verbs=create;update;delete ,versions=v1beta1,name=validate-clusterpodplacementconfig.multiarch.openshift.io,admissionReviewVersions=v1
2932
3033func (c * ClusterPodPlacementConfig ) SetupWebhookWithManager (mgr ctrl.Manager ) error {
3134 return ctrl .NewWebhookManagedBy (mgr ).
3235 For (c ).
33- WithValidator (& ClusterPodPlacementConfigValidator {}).
36+ WithValidator (& ClusterPodPlacementConfigValidator {
37+ Client : mgr .GetClient (),
38+ }).
3439 Complete ()
3540}
3641
42+ // ClusterPodPlacementConfigValidator validates ClusterPodPlacementConfig resources
43+ // +kubebuilder:object:generate=false
3744type ClusterPodPlacementConfigValidator struct {
45+ Client client.Client
3846}
3947
48+ var _ webhook.CustomValidator = & ClusterPodPlacementConfigValidator {}
49+
4050func (v * ClusterPodPlacementConfigValidator ) ValidateCreate (ctx context.Context , obj runtime.Object ) (warnings admission.Warnings , err error ) {
4151 return v .validate (obj )
4252}
@@ -46,6 +56,14 @@ func (v *ClusterPodPlacementConfigValidator) ValidateUpdate(ctx context.Context,
4656}
4757
4858func (v * ClusterPodPlacementConfigValidator ) ValidateDelete (ctx context.Context , obj runtime.Object ) (warnings admission.Warnings , err error ) {
59+ // Check if any local PodPlacementConfig exists. If exists, deny deletion of ClusterPodPlacementConfig.
60+ existingPPCs := & PodPlacementConfigList {}
61+ if err := v .Client .List (ctx , existingPPCs ); err != nil {
62+ return nil , fmt .Errorf ("failed to list existing PodPlacementConfigs: %w" , err )
63+ }
64+ if len (existingPPCs .Items ) != 0 {
65+ return nil , fmt .Errorf ("cannot delete ClusterPodPlacementConfig while local PodPlacementConfigs still exist" )
66+ }
4967 return nil , nil
5068}
5169
0 commit comments