From a3d902f68f8900cb29537287a807aa2c35b7dde5 Mon Sep 17 00:00:00 2001 From: ivan katliarchuk Date: Wed, 30 Jul 2025 12:16:02 +0100 Subject: [PATCH] chore(source): use types instead of strings Signed-off-by: ivan katliarchuk --- source/store.go | 50 ++++++++++++++++++++++--------------------- source/store_test.go | 24 +++++++++++++-------- source/types/types.go | 46 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 33 deletions(-) create mode 100644 source/types/types.go diff --git a/source/store.go b/source/store.go index c77e89c3b..9dbc56872 100644 --- a/source/store.go +++ b/source/store.go @@ -37,6 +37,8 @@ import ( "k8s.io/client-go/tools/clientcmd" 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" "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. func BuildWithConfig(ctx context.Context, source string, p ClientGenerator, cfg *Config) (Source, error) { switch source { - case "node": + case types.Node: return buildNodeSource(ctx, p, cfg) - case "service": + case types.Service: return buildServiceSource(ctx, p, cfg) - case "ingress": + case types.Ingress: return buildIngressSource(ctx, p, cfg) - case "pod": + case types.Pod: return buildPodSource(ctx, p, cfg) - case "gateway-httproute": + case types.GatewayHttpRoute: return NewGatewayHTTPRouteSource(p, cfg) - case "gateway-grpcroute": + case types.GatewayGrpcRoute: return NewGatewayGRPCRouteSource(p, cfg) - case "gateway-tlsroute": + case types.GatewayTlsRoute: return NewGatewayTLSRouteSource(p, cfg) - case "gateway-tcproute": + case types.GatewayTcpRoute: return NewGatewayTCPRouteSource(p, cfg) - case "gateway-udproute": + case types.GatewayUdpRoute: return NewGatewayUDPRouteSource(p, cfg) - case "istio-gateway": + case types.IstioGateway: return buildIstioGatewaySource(ctx, p, cfg) - case "istio-virtualservice": + case types.IstioVirtualService: return buildIstioVirtualServiceSource(ctx, p, cfg) - case "cloudfoundry": + case types.Cloudfoundry: return buildCloudFoundrySource(ctx, p, cfg) - case "ambassador-host": + case types.AmbassadorHost: return buildAmbassadorHostSource(ctx, p, cfg) - case "contour-httpproxy": + case types.ContourHTTPProxy: return buildContourHTTPProxySource(ctx, p, cfg) - case "gloo-proxy": + case types.GlooProxy: return buildGlooProxySource(ctx, p, cfg) - case "traefik-proxy": + case types.TraefikProxy: return buildTraefikProxySource(ctx, p, cfg) - case "openshift-route": + case types.OpenShiftRoute: return buildOpenShiftRouteSource(ctx, p, cfg) - case "fake": + case types.Fake: return NewFakeSource(cfg.FQDNTemplate) - case "connector": + case types.Connector: return NewConnectorSource(cfg.ConnectorServer) - case "crd": + case types.CRD: return buildCRDSource(ctx, p, cfg) - case "skipper-routegroup": + case types.SkipperRouteGroup: return buildSkipperRouteGroupSource(ctx, cfg) - case "kong-tcpingress": + case types.KongTCPIngress: return buildKongTCPIngressSource(ctx, p, cfg) - case "f5-virtualserver": + case types.F5VirtualServer: return buildF5VirtualServerSource(ctx, p, cfg) - case "f5-transportserver": + case types.F5TransportServer: return buildF5TransportServerSource(ctx, p, cfg) } return nil, ErrSourceNotFound diff --git a/source/store_test.go b/source/store_test.go index 3b9c38498..77e29fa50 100644 --- a/source/store_test.go +++ b/source/store_test.go @@ -21,7 +21,7 @@ import ( "errors" "testing" - cfclient "github.com/cloudfoundry-community/go-cfclient" + "github.com/cloudfoundry-community/go-cfclient" openshift "github.com/openshift/client-go/route/clientset/versioned" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/suite" @@ -34,6 +34,7 @@ import ( fakeDynamic "k8s.io/client-go/dynamic/fake" "k8s.io/client-go/kubernetes" fakeKube "k8s.io/client-go/kubernetes/fake" + "sigs.k8s.io/external-dns/source/types" gateway "sigs.k8s.io/gateway-api/pkg/client/clientset/versioned" ) @@ -168,7 +169,10 @@ func (suite *ByNamesTestSuite) TestAllInitialized() { }: "IngressRouteUDPList", }), 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.Len(sources, 9, "should generate all nine sources") } @@ -177,7 +181,7 @@ func (suite *ByNamesTestSuite) TestOnlyFake() { mockClientGenerator := new(MockClientGenerator) 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.Len(sources, 1, "should generate fake source") 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")) sourcesDependentOnKubeClient := []string{ - "node", "service", "ingress", "pod", "istio-gateway", "istio-virtualservice", - "ambassador-host", "gloo-proxy", "traefik-proxy", "crd", "kong-tcpingress", - "f5-virtualserver", "f5-transportserver", + types.Node, types.Service, types.Ingress, types.Pod, types.IstioGateway, types.IstioVirtualService, + types.AmbassadorHost, types.GlooProxy, types.TraefikProxy, types.CRD, types.KongTCPIngress, + types.F5VirtualServer, types.F5TransportServer, } for _, source := range sourcesDependentOnKubeClient { @@ -214,7 +218,7 @@ func (suite *ByNamesTestSuite) TestIstioClientFails() { mockClientGenerator.On("IstioClient").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 { _, 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("DynamicKubernetesClient").Return(nil, errors.New("foo")) - sourcesDependentOnDynamicKubernetesClient := []string{"ambassador-host", "contour-httpproxy", "gloo-proxy", "traefik-proxy", - "kong-tcpingress", "f5-virtualserver", "f5-transportserver"} + sourcesDependentOnDynamicKubernetesClient := []string{ + types.AmbassadorHost, types.ContourHTTPProxy, types.GlooProxy, types.TraefikProxy, + types.KongTCPIngress, types.F5VirtualServer, types.F5TransportServer, + } for _, source := range sourcesDependentOnDynamicKubernetesClient { _, err := ByNames(context.TODO(), mockClientGenerator, []string{source}, &Config{}) diff --git a/source/types/types.go b/source/types/types.go new file mode 100644 index 000000000..bf95491b3 --- /dev/null +++ b/source/types/types.go @@ -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" +)