From 83cc8fee5d1300ab9d2e4e30730c5abb41d60219 Mon Sep 17 00:00:00 2001 From: Kevin Pollet Date: Mon, 11 May 2026 11:14:06 +0200 Subject: [PATCH] Make resolveReference method as a function --- pkg/provider/kubernetes/crd/kubernetes.go | 54 +++++++++---------- .../kubernetes/crd/kubernetes_http.go | 4 +- pkg/provider/kubernetes/crd/kubernetes_tcp.go | 4 +- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/pkg/provider/kubernetes/crd/kubernetes.go b/pkg/provider/kubernetes/crd/kubernetes.go index 39e96938a..0ee1d37e0 100644 --- a/pkg/provider/kubernetes/crd/kubernetes.go +++ b/pkg/provider/kubernetes/crd/kubernetes.go @@ -434,32 +434,6 @@ func (p *Provider) loadConfigurationFromCRD(ctx context.Context, client Client) return conf } -func (p *Provider) resolveReference(ctx context.Context, parentNs, ns, name string) (string, error) { - if strings.Contains(name, providerNamespaceSeparator) { - if !p.AllowCrossNamespace && strings.HasSuffix(name, providerNamespaceSeparator+providerName) { - return "", errors.New("when allowCrossNamespace is disabled, @kubernetescrd references are disallowed") - } - - if !isCrossProviderNamespaceAllowed(p.CrossProviderNamespaces, parentNs) { - return "", fmt.Errorf("namespace %q is not in crossProviderNamespaces", parentNs) - } - - if ns != "" { - log.FromContext(ctx).Warnf("Namespace %q is ignored in cross-provider context", ns) - } - - return name, nil - } - - ns = namespaceOrParentNamespace(ns, parentNs) - - if !isNamespaceAllowed(p.AllowCrossNamespace, parentNs, ns) { - return "", errors.New("allowCrossNamespace is disabled, cross-namespace are disallowed") - } - - return provider.Normalize(ns + "-" + name), nil -} - func (p *Provider) createErrorPageMiddleware(ctx context.Context, client Client, namespace string, errorPage *traefikv1alpha1.ErrorPage) (string, *dynamic.ErrorPage, *dynamic.Service, error) { if errorPage == nil { return "", nil, nil, nil @@ -493,7 +467,7 @@ func (p *Provider) createChainMiddleware(ctx context.Context, parentNamespace st for _, mi := range chain.Middlewares { ctxMid := log.With(ctx, log.Str("middlewareRef", mi.Namespace+"/"+mi.Name)) - middlewareRef, err := p.resolveReference(ctxMid, parentNamespace, mi.Namespace, mi.Name) + middlewareRef, err := resolveReference(ctxMid, parentNamespace, mi.Namespace, mi.Name, p.CrossProviderNamespaces, p.AllowCrossNamespace) if err != nil { return nil, fmt.Errorf("invalid reference to middleware %s: %w", mi.Name, err) } @@ -1234,3 +1208,29 @@ func isCrossProviderNamespaceAllowed(allowList []string, namespace string) bool return slices.Contains(allowList, namespace) } + +func resolveReference(ctx context.Context, parentNs, ns, name string, crossProviderNamespaces []string, allowCrossNamespace bool) (string, error) { + if strings.Contains(name, providerNamespaceSeparator) { + if !allowCrossNamespace && strings.HasSuffix(name, providerNamespaceSeparator+providerName) { + return "", errors.New("when allowCrossNamespace is disabled, @kubernetescrd references are disallowed") + } + + if !isCrossProviderNamespaceAllowed(crossProviderNamespaces, parentNs) { + return "", fmt.Errorf("namespace %q is not in crossProviderNamespaces", parentNs) + } + + if ns != "" { + log.FromContext(ctx).Warnf("Namespace %q is ignored in cross-provider context", ns) + } + + return name, nil + } + + ns = namespaceOrParentNamespace(ns, parentNs) + + if !isNamespaceAllowed(allowCrossNamespace, parentNs, ns) { + return "", errors.New("allowCrossNamespace is disabled, cross-namespace are disallowed") + } + + return provider.Normalize(ns + "-" + name), nil +} diff --git a/pkg/provider/kubernetes/crd/kubernetes_http.go b/pkg/provider/kubernetes/crd/kubernetes_http.go index 96b15eb2e..008b61d3a 100644 --- a/pkg/provider/kubernetes/crd/kubernetes_http.go +++ b/pkg/provider/kubernetes/crd/kubernetes_http.go @@ -128,7 +128,7 @@ func (p *Provider) loadIngressRouteConfiguration(ctx context.Context, client Cli tlsOptions := ingressRoute.Spec.TLS.Options ctxTLSOption := log.With(ctx, log.Str("TLSOption", tlsOptions.Name)) - r.TLS.Options, err = p.resolveReference(ctxTLSOption, ingressRoute.Namespace, tlsOptions.Namespace, tlsOptions.Name) + r.TLS.Options, err = resolveReference(ctxTLSOption, ingressRoute.Namespace, tlsOptions.Namespace, tlsOptions.Name, p.CrossProviderNamespaces, p.AllowCrossNamespace) if err != nil { logger.WithError(err).Errorf("Invalid reference to TLSOption %q", ingressRoute.Spec.TLS.Options.Name) continue @@ -151,7 +151,7 @@ func (p *Provider) makeMiddlewareKeys(ctx context.Context, ingRouteNamespace str for _, mi := range middlewares { ctxMid := log.With(ctx, log.Str(log.MiddlewareName, mi.Name)) - middlewareRef, err := p.resolveReference(ctxMid, ingRouteNamespace, mi.Namespace, mi.Name) + middlewareRef, err := resolveReference(ctxMid, ingRouteNamespace, mi.Namespace, mi.Name, p.CrossProviderNamespaces, p.AllowCrossNamespace) if err != nil { return nil, fmt.Errorf("invalid reference to middleware %s: %w", mi.Name, err) } diff --git a/pkg/provider/kubernetes/crd/kubernetes_tcp.go b/pkg/provider/kubernetes/crd/kubernetes_tcp.go index 903a09fb0..3c0644b65 100644 --- a/pkg/provider/kubernetes/crd/kubernetes_tcp.go +++ b/pkg/provider/kubernetes/crd/kubernetes_tcp.go @@ -111,7 +111,7 @@ func (p *Provider) loadIngressRouteTCPConfiguration(ctx context.Context, client tlsOptions := ingressRouteTCP.Spec.TLS.Options ctxTLSOption := log.With(ctx, log.Str("TLSOption", tlsOptions.Name)) - r.TLS.Options, err = p.resolveReference(ctxTLSOption, ingressRouteTCP.Namespace, tlsOptions.Namespace, tlsOptions.Name) + r.TLS.Options, err = resolveReference(ctxTLSOption, ingressRouteTCP.Namespace, tlsOptions.Namespace, tlsOptions.Name, p.CrossProviderNamespaces, p.AllowCrossNamespace) if err != nil { logger.WithError(err).Errorf("Invalid reference to TLSOption %q", ingressRouteTCP.Spec.TLS.Options.Name) continue @@ -132,7 +132,7 @@ func (p *Provider) makeMiddlewareTCPKeys(ctx context.Context, ingRouteTCPNamespa for _, mi := range middlewares { ctxMid := log.With(ctx, log.Str(log.MiddlewareName, mi.Name)) - middlewareRef, err := p.resolveReference(ctxMid, ingRouteTCPNamespace, mi.Namespace, mi.Name) + middlewareRef, err := resolveReference(ctxMid, ingRouteTCPNamespace, mi.Namespace, mi.Name, p.CrossProviderNamespaces, p.AllowCrossNamespace) if err != nil { return nil, fmt.Errorf("invalid reference to middleware %s: %w", mi.Name, err) }