From b2f7965f46af2a13a338167c0c0baa51a9353f9d Mon Sep 17 00:00:00 2001 From: damienmulder Date: Tue, 17 Feb 2026 10:03:04 +0100 Subject: [PATCH 1/2] Enable WMS and WFS validation without k8s client --- api/v3/shared_validation.go | 62 +++++++++++++++++++++++-------------- api/v3/wfs_validation.go | 10 ++++++ api/v3/wms_validation.go | 10 ++++++ 3 files changed, 59 insertions(+), 23 deletions(-) diff --git a/api/v3/shared_validation.go b/api/v3/shared_validation.go index bd87685..90c3576 100644 --- a/api/v3/shared_validation.go +++ b/api/v3/shared_validation.go @@ -19,34 +19,53 @@ func ValidateCreate[W WMSWFS](c client.Client, obj W, validate func(W, *[]string warnings := []string{} allErrs := field.ErrorList{} + validateCreateWMSWFS(c, obj, &warnings, &allErrs, validate) + + if len(allErrs) == 0 { + return warnings, nil + } + + return warnings, apierrors.NewInvalid( + obj.GroupKind(), + obj.GetName(), allErrs) +} + +func validateCreateWMSWFS[W WMSWFS](c client.Client, obj W, warnings *[]string, allErrs *field.ErrorList, validate func(W, *[]string, *field.ErrorList)) { err := sharedValidation.ValidateLabelsOnCreate(obj.GetLabels()) if err != nil { - allErrs = append(allErrs, err) + *allErrs = append(*allErrs, err) } err = sharedValidation.ValidateIngressRouteURLsContainsBaseURL(obj.IngressRouteURLs(false), obj.URL(), nil) if err != nil { - allErrs = append(allErrs, err) + *allErrs = append(*allErrs, err) } - validate(obj, &warnings, &allErrs) - ValidateOwnerInfo(c, obj, &allErrs) + validate(obj, warnings, allErrs) - if len(allErrs) == 0 { - return warnings, nil + // Only validate ower info if k8s client is available + if c != nil { + ValidateOwnerInfo(c, obj, allErrs) } - - return warnings, apierrors.NewInvalid( - obj.GroupKind(), - obj.GetName(), allErrs) } func ValidateUpdate[W WMSWFS](c client.Client, newW, oldW W, validate func(W, *[]string, *field.ErrorList)) ([]string, error) { warnings := []string{} allErrs := field.ErrorList{} + validateUpdateWMSWFS(c, newW, oldW, &warnings, &allErrs, validate) + + if len(allErrs) == 0 { + return warnings, nil + } + return warnings, apierrors.NewInvalid( + newW.GroupKind(), + newW.GetName(), allErrs) +} + +func validateUpdateWMSWFS[W WMSWFS](c client.Client, newW, oldW W, warnings *[]string, allErrs *field.ErrorList, validate func(W, *[]string, *field.ErrorList)) { // Make sure no ingressRouteURLs have been removed - sharedValidation.ValidateIngressRouteURLsNotRemoved(oldW.IngressRouteURLs(false), newW.IngressRouteURLs(true), &allErrs, nil) + sharedValidation.ValidateIngressRouteURLsNotRemoved(oldW.IngressRouteURLs(false), newW.IngressRouteURLs(true), allErrs, nil) if len(newW.IngressRouteURLs(false)) == 0 { // There are no ingressRouteURLs given, spec.service.url is immutable is that case. @@ -54,37 +73,34 @@ func ValidateUpdate[W WMSWFS](c client.Client, newW, oldW W, validate func(W, *[ sharedValidation.CheckURLImmutability( oldW.URL(), newW.URL(), - &allErrs, + allErrs, path, ) } else if oldW.URL().String() != newW.URL().String() { // Make sure both the old spec.service.url and the new one are included in the ingressRouteURLs list. err := sharedValidation.ValidateIngressRouteURLsContainsBaseURL(newW.IngressRouteURLs(true), oldW.URL(), nil) if err != nil { - allErrs = append(allErrs, err) + *allErrs = append(*allErrs, err) } err = sharedValidation.ValidateIngressRouteURLsContainsBaseURL(newW.IngressRouteURLs(true), newW.URL(), nil) if err != nil { - allErrs = append(allErrs, err) + *allErrs = append(*allErrs, err) } } - sharedValidation.ValidateLabelsOnUpdate(oldW.GetLabels(), newW.GetLabels(), &allErrs) + sharedValidation.ValidateLabelsOnUpdate(oldW.GetLabels(), newW.GetLabels(), allErrs) if (newW.Inspire() == nil && oldW.Inspire() != nil) || (newW.Inspire() != nil && oldW.Inspire() == nil) { - allErrs = append(allErrs, field.Forbidden(field.NewPath("spec").Child("service").Child("inspire"), "cannot change from inspire to not inspire or the other way around")) + *allErrs = append(*allErrs, field.Forbidden(field.NewPath("spec").Child("service").Child("inspire"), "cannot change from inspire to not inspire or the other way around")) } - validate(newW, &warnings, &allErrs) - ValidateOwnerInfo(c, newW, &allErrs) + validate(newW, warnings, allErrs) - if len(allErrs) == 0 { - return warnings, nil + // Only validate owner info if k8s client is available + if c != nil { + ValidateOwnerInfo(c, newW, allErrs) } - return warnings, apierrors.NewInvalid( - newW.GroupKind(), - newW.GetName(), allErrs) } func ValidateHorizontalPodAutoscalerPatch(patch HorizontalPodAutoscalerPatch, allErrs *field.ErrorList) { diff --git a/api/v3/wfs_validation.go b/api/v3/wfs_validation.go index 62eee7a..9e9980f 100644 --- a/api/v3/wfs_validation.go +++ b/api/v3/wfs_validation.go @@ -19,6 +19,16 @@ func (wfs *WFS) ValidateUpdate(c client.Client, wfsOld *WFS) ([]string, error) { return ValidateUpdate(c, wfs, wfsOld, ValidateWFS) } +// ValidateCreateWFS validates WFS creation without k8s client +func ValidateCreateWFS(wfs *WFS, warnings *[]string, allErrs *field.ErrorList) { + validateCreateWMSWFS(nil, wfs, warnings, allErrs, ValidateWFS) +} + +// ValidateUpdateWFS validates WFS update without k8s client +func ValidateUpdateWFS(wfs *WFS, wfsOld *WFS, warnings *[]string, allErrs *field.ErrorList) { + validateUpdateWMSWFS(nil, wfs, wfsOld, warnings, allErrs, ValidateWFS) +} + func ValidateWFS(wfs *WFS, warnings *[]string, allErrs *field.ErrorList) { if strings.Contains(wfs.GetName(), "wfs") { sharedValidation.AddWarning( diff --git a/api/v3/wms_validation.go b/api/v3/wms_validation.go index ae02f98..d910d70 100644 --- a/api/v3/wms_validation.go +++ b/api/v3/wms_validation.go @@ -19,6 +19,16 @@ func (wms *WMS) ValidateUpdate(c client.Client, wmsOld *WMS) ([]string, error) { return ValidateUpdate(c, wms, wmsOld, ValidateWMS) } +// ValidateCreateWMS validates WMS creation without k8s client +func ValidateCreateWMS(wms *WMS, warnings *[]string, allErrs *field.ErrorList) { + validateCreateWMSWFS(nil, wms, warnings, allErrs, ValidateWMS) +} + +// ValidateUpdateWMS validates WMS update without k8s client +func ValidateUpdateWMS(wms *WMS, wmsOld *WMS, warnings *[]string, allErrs *field.ErrorList) { + validateUpdateWMSWFS(nil, wms, wmsOld, warnings, allErrs, ValidateWMS) +} + func ValidateWMS(wms *WMS, warnings *[]string, allErrs *field.ErrorList) { if strings.Contains(wms.GetName(), "wms") { sharedValidation.AddWarning( From 57aa2ff1c08f201d7997d2b6d6f0fb859f77890c Mon Sep 17 00:00:00 2001 From: damienmulder Date: Tue, 17 Feb 2026 14:14:01 +0100 Subject: [PATCH 2/2] Fix typo --- api/v3/shared_validation.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/v3/shared_validation.go b/api/v3/shared_validation.go index 90c3576..375e173 100644 --- a/api/v3/shared_validation.go +++ b/api/v3/shared_validation.go @@ -43,7 +43,7 @@ func validateCreateWMSWFS[W WMSWFS](c client.Client, obj W, warnings *[]string, validate(obj, warnings, allErrs) - // Only validate ower info if k8s client is available + // Only validate owner info if k8s client is available if c != nil { ValidateOwnerInfo(c, obj, allErrs) }