chore(source): use types instead of strings

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
This commit is contained in:
ivan katliarchuk 2025-07-30 12:16:02 +01:00
parent 1b9d7cddc0
commit a3d902f68f
No known key found for this signature in database
GPG Key ID: 601CDBBBB76E47BE
3 changed files with 87 additions and 33 deletions

View File

@ -37,6 +37,8 @@ import (
"k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/clientcmd"
gateway "sigs.k8s.io/gateway-api/pkg/client/clientset/versioned" gateway "sigs.k8s.io/gateway-api/pkg/client/clientset/versioned"
"sigs.k8s.io/external-dns/source/types"
extdnshttp "sigs.k8s.io/external-dns/pkg/http" extdnshttp "sigs.k8s.io/external-dns/pkg/http"
"sigs.k8s.io/external-dns/pkg/apis/externaldns" "sigs.k8s.io/external-dns/pkg/apis/externaldns"
@ -332,53 +334,53 @@ func ByNames(ctx context.Context, p ClientGenerator, names []string, cfg *Config
// because they have simpler initialization requirements. // because they have simpler initialization requirements.
func BuildWithConfig(ctx context.Context, source string, p ClientGenerator, cfg *Config) (Source, error) { func BuildWithConfig(ctx context.Context, source string, p ClientGenerator, cfg *Config) (Source, error) {
switch source { switch source {
case "node": case types.Node:
return buildNodeSource(ctx, p, cfg) return buildNodeSource(ctx, p, cfg)
case "service": case types.Service:
return buildServiceSource(ctx, p, cfg) return buildServiceSource(ctx, p, cfg)
case "ingress": case types.Ingress:
return buildIngressSource(ctx, p, cfg) return buildIngressSource(ctx, p, cfg)
case "pod": case types.Pod:
return buildPodSource(ctx, p, cfg) return buildPodSource(ctx, p, cfg)
case "gateway-httproute": case types.GatewayHttpRoute:
return NewGatewayHTTPRouteSource(p, cfg) return NewGatewayHTTPRouteSource(p, cfg)
case "gateway-grpcroute": case types.GatewayGrpcRoute:
return NewGatewayGRPCRouteSource(p, cfg) return NewGatewayGRPCRouteSource(p, cfg)
case "gateway-tlsroute": case types.GatewayTlsRoute:
return NewGatewayTLSRouteSource(p, cfg) return NewGatewayTLSRouteSource(p, cfg)
case "gateway-tcproute": case types.GatewayTcpRoute:
return NewGatewayTCPRouteSource(p, cfg) return NewGatewayTCPRouteSource(p, cfg)
case "gateway-udproute": case types.GatewayUdpRoute:
return NewGatewayUDPRouteSource(p, cfg) return NewGatewayUDPRouteSource(p, cfg)
case "istio-gateway": case types.IstioGateway:
return buildIstioGatewaySource(ctx, p, cfg) return buildIstioGatewaySource(ctx, p, cfg)
case "istio-virtualservice": case types.IstioVirtualService:
return buildIstioVirtualServiceSource(ctx, p, cfg) return buildIstioVirtualServiceSource(ctx, p, cfg)
case "cloudfoundry": case types.Cloudfoundry:
return buildCloudFoundrySource(ctx, p, cfg) return buildCloudFoundrySource(ctx, p, cfg)
case "ambassador-host": case types.AmbassadorHost:
return buildAmbassadorHostSource(ctx, p, cfg) return buildAmbassadorHostSource(ctx, p, cfg)
case "contour-httpproxy": case types.ContourHTTPProxy:
return buildContourHTTPProxySource(ctx, p, cfg) return buildContourHTTPProxySource(ctx, p, cfg)
case "gloo-proxy": case types.GlooProxy:
return buildGlooProxySource(ctx, p, cfg) return buildGlooProxySource(ctx, p, cfg)
case "traefik-proxy": case types.TraefikProxy:
return buildTraefikProxySource(ctx, p, cfg) return buildTraefikProxySource(ctx, p, cfg)
case "openshift-route": case types.OpenShiftRoute:
return buildOpenShiftRouteSource(ctx, p, cfg) return buildOpenShiftRouteSource(ctx, p, cfg)
case "fake": case types.Fake:
return NewFakeSource(cfg.FQDNTemplate) return NewFakeSource(cfg.FQDNTemplate)
case "connector": case types.Connector:
return NewConnectorSource(cfg.ConnectorServer) return NewConnectorSource(cfg.ConnectorServer)
case "crd": case types.CRD:
return buildCRDSource(ctx, p, cfg) return buildCRDSource(ctx, p, cfg)
case "skipper-routegroup": case types.SkipperRouteGroup:
return buildSkipperRouteGroupSource(ctx, cfg) return buildSkipperRouteGroupSource(ctx, cfg)
case "kong-tcpingress": case types.KongTCPIngress:
return buildKongTCPIngressSource(ctx, p, cfg) return buildKongTCPIngressSource(ctx, p, cfg)
case "f5-virtualserver": case types.F5VirtualServer:
return buildF5VirtualServerSource(ctx, p, cfg) return buildF5VirtualServerSource(ctx, p, cfg)
case "f5-transportserver": case types.F5TransportServer:
return buildF5TransportServerSource(ctx, p, cfg) return buildF5TransportServerSource(ctx, p, cfg)
} }
return nil, ErrSourceNotFound return nil, ErrSourceNotFound

View File

@ -21,7 +21,7 @@ import (
"errors" "errors"
"testing" "testing"
cfclient "github.com/cloudfoundry-community/go-cfclient" "github.com/cloudfoundry-community/go-cfclient"
openshift "github.com/openshift/client-go/route/clientset/versioned" openshift "github.com/openshift/client-go/route/clientset/versioned"
"github.com/stretchr/testify/mock" "github.com/stretchr/testify/mock"
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
@ -34,6 +34,7 @@ import (
fakeDynamic "k8s.io/client-go/dynamic/fake" fakeDynamic "k8s.io/client-go/dynamic/fake"
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
fakeKube "k8s.io/client-go/kubernetes/fake" fakeKube "k8s.io/client-go/kubernetes/fake"
"sigs.k8s.io/external-dns/source/types"
gateway "sigs.k8s.io/gateway-api/pkg/client/clientset/versioned" gateway "sigs.k8s.io/gateway-api/pkg/client/clientset/versioned"
) )
@ -168,7 +169,10 @@ func (suite *ByNamesTestSuite) TestAllInitialized() {
}: "IngressRouteUDPList", }: "IngressRouteUDPList",
}), nil) }), nil)
sources, err := ByNames(context.TODO(), mockClientGenerator, []string{"service", "ingress", "istio-gateway", "contour-httpproxy", "kong-tcpingress", "f5-virtualserver", "f5-transportserver", "traefik-proxy", "fake"}, &Config{}) sources, err := ByNames(context.TODO(), mockClientGenerator, []string{
types.Service, types.Ingress, types.IstioGateway, types.ContourHTTPProxy,
types.KongTCPIngress, types.F5VirtualServer, types.F5TransportServer, types.TraefikProxy, types.Fake,
}, &Config{})
suite.NoError(err, "should not generate errors") suite.NoError(err, "should not generate errors")
suite.Len(sources, 9, "should generate all nine sources") suite.Len(sources, 9, "should generate all nine sources")
} }
@ -177,7 +181,7 @@ func (suite *ByNamesTestSuite) TestOnlyFake() {
mockClientGenerator := new(MockClientGenerator) mockClientGenerator := new(MockClientGenerator)
mockClientGenerator.On("KubeClient").Return(fakeKube.NewSimpleClientset(), nil) mockClientGenerator.On("KubeClient").Return(fakeKube.NewSimpleClientset(), nil)
sources, err := ByNames(context.TODO(), mockClientGenerator, []string{"fake"}, &Config{}) sources, err := ByNames(context.TODO(), mockClientGenerator, []string{types.Fake}, &Config{})
suite.NoError(err, "should not generate errors") suite.NoError(err, "should not generate errors")
suite.Len(sources, 1, "should generate fake source") suite.Len(sources, 1, "should generate fake source")
suite.Nil(mockClientGenerator.kubeClient, "client should not be created") suite.Nil(mockClientGenerator.kubeClient, "client should not be created")
@ -197,9 +201,9 @@ func (suite *ByNamesTestSuite) TestKubeClientFails() {
mockClientGenerator.On("KubeClient").Return(nil, errors.New("foo")) mockClientGenerator.On("KubeClient").Return(nil, errors.New("foo"))
sourcesDependentOnKubeClient := []string{ sourcesDependentOnKubeClient := []string{
"node", "service", "ingress", "pod", "istio-gateway", "istio-virtualservice", types.Node, types.Service, types.Ingress, types.Pod, types.IstioGateway, types.IstioVirtualService,
"ambassador-host", "gloo-proxy", "traefik-proxy", "crd", "kong-tcpingress", types.AmbassadorHost, types.GlooProxy, types.TraefikProxy, types.CRD, types.KongTCPIngress,
"f5-virtualserver", "f5-transportserver", types.F5VirtualServer, types.F5TransportServer,
} }
for _, source := range sourcesDependentOnKubeClient { for _, source := range sourcesDependentOnKubeClient {
@ -214,7 +218,7 @@ func (suite *ByNamesTestSuite) TestIstioClientFails() {
mockClientGenerator.On("IstioClient").Return(nil, errors.New("foo")) mockClientGenerator.On("IstioClient").Return(nil, errors.New("foo"))
mockClientGenerator.On("DynamicKubernetesClient").Return(nil, errors.New("foo")) mockClientGenerator.On("DynamicKubernetesClient").Return(nil, errors.New("foo"))
sourcesDependentOnIstioClient := []string{"istio-gateway", "istio-virtualservice"} sourcesDependentOnIstioClient := []string{types.IstioGateway, types.IstioVirtualService}
for _, source := range sourcesDependentOnIstioClient { for _, source := range sourcesDependentOnIstioClient {
_, err := ByNames(context.TODO(), mockClientGenerator, []string{source}, &Config{}) _, err := ByNames(context.TODO(), mockClientGenerator, []string{source}, &Config{})
@ -228,8 +232,10 @@ func (suite *ByNamesTestSuite) TestDynamicKubernetesClientFails() {
mockClientGenerator.On("IstioClient").Return(istiofake.NewSimpleClientset(), nil) mockClientGenerator.On("IstioClient").Return(istiofake.NewSimpleClientset(), nil)
mockClientGenerator.On("DynamicKubernetesClient").Return(nil, errors.New("foo")) mockClientGenerator.On("DynamicKubernetesClient").Return(nil, errors.New("foo"))
sourcesDependentOnDynamicKubernetesClient := []string{"ambassador-host", "contour-httpproxy", "gloo-proxy", "traefik-proxy", sourcesDependentOnDynamicKubernetesClient := []string{
"kong-tcpingress", "f5-virtualserver", "f5-transportserver"} types.AmbassadorHost, types.ContourHTTPProxy, types.GlooProxy, types.TraefikProxy,
types.KongTCPIngress, types.F5VirtualServer, types.F5TransportServer,
}
for _, source := range sourcesDependentOnDynamicKubernetesClient { for _, source := range sourcesDependentOnDynamicKubernetesClient {
_, err := ByNames(context.TODO(), mockClientGenerator, []string{source}, &Config{}) _, err := ByNames(context.TODO(), mockClientGenerator, []string{source}, &Config{})

46
source/types/types.go Normal file
View File

@ -0,0 +1,46 @@
/*
Copyright 2025 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package types
type Type = string
const (
Node Type = "node"
Service Type = "service"
Ingress Type = "ingress"
Pod Type = "pod"
GatewayHttpRoute Type = "gateway-httproute"
GatewayGrpcRoute Type = "gateway-grpcroute"
GatewayTlsRoute Type = "gateway-tlsroute"
GatewayTcpRoute Type = "gateway-tcproute"
GatewayUdpRoute Type = "gateway-udproute"
IstioGateway Type = "istio-gateway"
IstioVirtualService Type = "istio-virtualservice"
Cloudfoundry Type = "cloudfoundry"
AmbassadorHost Type = "ambassador-host"
ContourHTTPProxy Type = "contour-httpproxy"
GlooProxy Type = "gloo-proxy"
TraefikProxy Type = "traefik-proxy"
OpenShiftRoute Type = "openshift-route"
Fake Type = "fake"
Connector Type = "connector"
CRD Type = "crd"
SkipperRouteGroup Type = "skipper-routegroup"
KongTCPIngress Type = "kong-tcpingress"
F5VirtualServer Type = "f5-virtualserver"
F5TransportServer Type = "f5-transportserver"
)