From d85d8cc0e2f541117edaaea66caa7d8d1aedbd21 Mon Sep 17 00:00:00 2001 From: Elvand-Lie Date: Sat, 16 May 2026 01:04:36 +0700 Subject: [PATCH] fix(webhook): propagate GetResourceIfExist errors in validation webhooks (#373) Signed-off-by: Elvand-Lie --- service/cluster_webhook_validation.go | 6 +++- ...ervice_export_config_webhook_validation.go | 30 +++++++++++++++---- .../slice_qos_config_webhook_validation.go | 7 ++++- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/service/cluster_webhook_validation.go b/service/cluster_webhook_validation.go index d0a7f4a5b..5d24e949f 100644 --- a/service/cluster_webhook_validation.go +++ b/service/cluster_webhook_validation.go @@ -70,7 +70,11 @@ func ValidateClusterDelete(ctx context.Context, c *controllerv1alpha1.Cluster) ( // validateAppliedInProjectNamespace is a function to validate the if the cluster is applied in project namespace or not func validateAppliedInProjectNamespace(ctx context.Context, c *controllerv1alpha1.Cluster) *field.Error { namespace := &corev1.Namespace{} - exist, _ := util.GetResourceIfExist(ctx, client.ObjectKey{Name: c.Namespace}, namespace) + exist, err := util.GetResourceIfExist(ctx, client.ObjectKey{Name: c.Namespace}, namespace) + if err != nil { + return field.InternalError(field.NewPath("metadata").Child("namespace"), + fmt.Errorf("failed to look up namespace %s: %w", c.Namespace, err)) + } if !exist || !util.CheckForProjectNamespace(namespace) { return field.Invalid(field.NewPath("metadata").Child("namespace"), c.Namespace, "cluster must be applied on project namespace") } diff --git a/service/service_export_config_webhook_validation.go b/service/service_export_config_webhook_validation.go index 1281d07d6..0d5725cc8 100644 --- a/service/service_export_config_webhook_validation.go +++ b/service/service_export_config_webhook_validation.go @@ -62,9 +62,17 @@ func ValidateServiceExportConfigDelete(ctx context.Context, serviceExportConfig func validateServiceExportClusterAndSlice(ctx context.Context, serviceExport *controllerv1alpha1.ServiceExportConfig) *field.Error { cluster := &controllerv1alpha1.Cluster{} - clusterExist, _ := util.GetResourceIfExist(ctx, client.ObjectKey{Name: serviceExport.Spec.SourceCluster, Namespace: serviceExport.Namespace}, cluster) + clusterExist, err := util.GetResourceIfExist(ctx, client.ObjectKey{Name: serviceExport.Spec.SourceCluster, Namespace: serviceExport.Namespace}, cluster) + if err != nil { + return field.InternalError(field.NewPath("Spec").Child("SourceCluster"), + fmt.Errorf("failed to look up cluster %s: %w", serviceExport.Spec.SourceCluster, err)) + } sliceConfig := &controllerv1alpha1.SliceConfig{} - sliceExist, _ := util.GetResourceIfExist(ctx, client.ObjectKey{Name: serviceExport.Spec.SliceName, Namespace: serviceExport.Namespace}, sliceConfig) + sliceExist, err := util.GetResourceIfExist(ctx, client.ObjectKey{Name: serviceExport.Spec.SliceName, Namespace: serviceExport.Namespace}, sliceConfig) + if err != nil { + return field.InternalError(field.NewPath("Spec").Child("SliceName"), + fmt.Errorf("failed to look up slice %s: %w", serviceExport.Spec.SliceName, err)) + } if !sliceExist { return field.Invalid(field.NewPath("Spec").Child("SliceName"), serviceExport.Spec.SliceName, "There is no valid slice with this name") } @@ -90,9 +98,17 @@ func validateServiceEndpoint(ctx context.Context, serviceExport *controllerv1alp for _, serviceDiscoveryEndPoint := range serviceExport.Spec.ServiceDiscoveryEndpoints { clusterName := serviceDiscoveryEndPoint.Cluster cluster := &controllerv1alpha1.Cluster{} - clusterExist, _ := util.GetResourceIfExist(ctx, client.ObjectKey{Name: clusterName, Namespace: serviceExport.Namespace}, cluster) + clusterExist, err := util.GetResourceIfExist(ctx, client.ObjectKey{Name: clusterName, Namespace: serviceExport.Namespace}, cluster) + if err != nil { + return field.InternalError(field.NewPath("Spec").Child("ServiceDiscoveryEndpoints").Child("Cluster"), + fmt.Errorf("failed to look up cluster %s: %w", clusterName, err)) + } sliceConfig := &controllerv1alpha1.SliceConfig{} - sliceExist, _ := util.GetResourceIfExist(ctx, client.ObjectKey{Name: sliceName, Namespace: serviceExport.Namespace}, sliceConfig) + sliceExist, err := util.GetResourceIfExist(ctx, client.ObjectKey{Name: sliceName, Namespace: serviceExport.Namespace}, sliceConfig) + if err != nil { + return field.InternalError(field.NewPath("Spec").Child("SliceName"), + fmt.Errorf("failed to look up slice %s: %w", sliceName, err)) + } if !sliceExist { return field.Invalid(field.NewPath("Spec").Child("SliceName"), serviceExport.Spec.SliceName, "There is no valid slice with this name") } @@ -116,7 +132,11 @@ func validateServiceEndpoint(ctx context.Context, serviceExport *controllerv1alp func validateServiceExportConfigNamespace(ctx context.Context, serviceExport *controllerv1alpha1.ServiceExportConfig) *field.Error { namespace := &corev1.Namespace{} - exist, _ := util.GetResourceIfExist(ctx, client.ObjectKey{Name: serviceExport.Namespace}, namespace) + exist, err := util.GetResourceIfExist(ctx, client.ObjectKey{Name: serviceExport.Namespace}, namespace) + if err != nil { + return field.InternalError(field.NewPath("metadata").Child("namespace"), + fmt.Errorf("failed to look up namespace %s: %w", serviceExport.Namespace, err)) + } if !exist || !util.CheckForProjectNamespace(namespace) { return field.Invalid(field.NewPath("metadata").Child("namespace"), serviceExport.Namespace, "ServiceExportConfig must be applied on project namespace") } diff --git a/service/slice_qos_config_webhook_validation.go b/service/slice_qos_config_webhook_validation.go index a9c1952a1..dcf272fda 100644 --- a/service/slice_qos_config_webhook_validation.go +++ b/service/slice_qos_config_webhook_validation.go @@ -2,6 +2,7 @@ package service import ( "context" + "fmt" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" controllerv1alpha1 "github.com/kubeslice/kubeslice-controller/apis/controller/v1alpha1" @@ -57,7 +58,11 @@ func validateSliceQosConfigSpec(ctx context.Context, sliceQosConfig *controllerv // validateAppliedInProjectNamespace is a function to validate the if the SliceQosConfig is applied in project namespace or not func validateSliceQosConfigAppliedInProjectNamespace(ctx context.Context, sliceQoSConfig *controllerv1alpha1.SliceQoSConfig) *field.Error { namespace := &corev1.Namespace{} - exist, _ := util.GetResourceIfExist(ctx, client.ObjectKey{Name: sliceQoSConfig.Namespace}, namespace) + exist, err := util.GetResourceIfExist(ctx, client.ObjectKey{Name: sliceQoSConfig.Namespace}, namespace) + if err != nil { + return field.InternalError(field.NewPath("metadata").Child("namespace"), + fmt.Errorf("failed to look up namespace %s: %w", sliceQoSConfig.Namespace, err)) + } if !exist || !util.CheckForProjectNamespace(namespace) { return field.Invalid(field.NewPath("metadata").Child("namespace"), sliceQoSConfig.Name, "SliceQosConfig must be applied on project namespace") }