mirror of
https://github.com/kubernetes-sigs/external-dns.git
synced 2025-08-06 17:46:57 +02:00
source: add gateway client
This commit is contained in:
parent
b1ccdfed77
commit
48203e64c9
5
go.mod
5
go.mod
@ -11,6 +11,8 @@ require (
|
|||||||
github.com/Azure/go-autorest/autorest/to v0.4.0
|
github.com/Azure/go-autorest/autorest/to v0.4.0
|
||||||
github.com/StackExchange/dnscontrol v0.2.8
|
github.com/StackExchange/dnscontrol v0.2.8
|
||||||
github.com/akamai/AkamaiOPEN-edgegrid-golang v1.1.1
|
github.com/akamai/AkamaiOPEN-edgegrid-golang v1.1.1
|
||||||
|
github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 // indirect
|
||||||
|
github.com/alecthomas/colour v0.1.0 // indirect
|
||||||
github.com/alecthomas/kingpin v2.2.5+incompatible
|
github.com/alecthomas/kingpin v2.2.5+incompatible
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go v1.61.1483
|
github.com/aliyun/alibaba-cloud-sdk-go v1.61.1483
|
||||||
github.com/aws/aws-sdk-go v1.42.52
|
github.com/aws/aws-sdk-go v1.42.52
|
||||||
@ -73,8 +75,6 @@ require (
|
|||||||
github.com/Azure/go-autorest/logger v0.2.1 // indirect
|
github.com/Azure/go-autorest/logger v0.2.1 // indirect
|
||||||
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
|
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
|
||||||
github.com/Masterminds/semver v1.4.2 // indirect
|
github.com/Masterminds/semver v1.4.2 // indirect
|
||||||
github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 // indirect
|
|
||||||
github.com/alecthomas/colour v0.1.0 // indirect
|
|
||||||
github.com/alecthomas/repr v0.0.0-20200325044227-4184120f674c // indirect
|
github.com/alecthomas/repr v0.0.0-20200325044227-4184120f674c // indirect
|
||||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
|
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
|
||||||
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect
|
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect
|
||||||
@ -157,6 +157,7 @@ require (
|
|||||||
k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 // indirect
|
k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 // indirect
|
||||||
k8s.io/utils v0.0.0-20211116205334-6203023598ed // indirect
|
k8s.io/utils v0.0.0-20211116205334-6203023598ed // indirect
|
||||||
sigs.k8s.io/controller-runtime v0.11.0 // indirect
|
sigs.k8s.io/controller-runtime v0.11.0 // indirect
|
||||||
|
sigs.k8s.io/gateway-api v0.4.1
|
||||||
sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 // indirect
|
sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 // indirect
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect
|
sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect
|
||||||
sigs.k8s.io/yaml v1.3.0 // indirect
|
sigs.k8s.io/yaml v1.3.0 // indirect
|
||||||
|
1
go.sum
1
go.sum
@ -2086,6 +2086,7 @@ sigs.k8s.io/controller-tools v0.5.0/go.mod h1:JTsstrMpxs+9BUj6eGuAaEb6SDSPTeVtUy
|
|||||||
sigs.k8s.io/controller-tools v0.6.0/go.mod h1:baRMVPrctU77F+rfAuH2uPqW93k6yQnZA2dhUOr7ihc=
|
sigs.k8s.io/controller-tools v0.6.0/go.mod h1:baRMVPrctU77F+rfAuH2uPqW93k6yQnZA2dhUOr7ihc=
|
||||||
sigs.k8s.io/controller-tools v0.6.2/go.mod h1:oaeGpjXn6+ZSEIQkUe/+3I40PNiDYp9aeawbt3xTgJ8=
|
sigs.k8s.io/controller-tools v0.6.2/go.mod h1:oaeGpjXn6+ZSEIQkUe/+3I40PNiDYp9aeawbt3xTgJ8=
|
||||||
sigs.k8s.io/gateway-api v0.3.0/go.mod h1:Wb8bx7QhGVZxOSEU3i9vw/JqTB5Nlai9MLMYVZeDmRQ=
|
sigs.k8s.io/gateway-api v0.3.0/go.mod h1:Wb8bx7QhGVZxOSEU3i9vw/JqTB5Nlai9MLMYVZeDmRQ=
|
||||||
|
sigs.k8s.io/gateway-api v0.4.1 h1:Tof9/PNSZXyfDuTTe1XFvaTlvBRE6bKq1kmV6jj6rQE=
|
||||||
sigs.k8s.io/gateway-api v0.4.1/go.mod h1:r3eiNP+0el+NTLwaTfOrCNXy8TukC+dIM3ggc+fbNWk=
|
sigs.k8s.io/gateway-api v0.4.1/go.mod h1:r3eiNP+0el+NTLwaTfOrCNXy8TukC+dIM3ggc+fbNWk=
|
||||||
sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s=
|
sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s=
|
||||||
sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs=
|
sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs=
|
||||||
|
102
source/store.go
102
source/store.go
@ -35,6 +35,7 @@ import (
|
|||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/client-go/rest"
|
"k8s.io/client-go/rest"
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
"k8s.io/client-go/tools/clientcmd"
|
||||||
|
gateway "sigs.k8s.io/gateway-api/pkg/client/clientset/gateway/versioned"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ErrSourceNotFound is returned when a requested source doesn't exist.
|
// ErrSourceNotFound is returned when a requested source doesn't exist.
|
||||||
@ -74,6 +75,7 @@ type Config struct {
|
|||||||
// ClientGenerator provides clients
|
// ClientGenerator provides clients
|
||||||
type ClientGenerator interface {
|
type ClientGenerator interface {
|
||||||
KubeClient() (kubernetes.Interface, error)
|
KubeClient() (kubernetes.Interface, error)
|
||||||
|
GatewayClient() (gateway.Interface, error)
|
||||||
IstioClient() (istioclient.Interface, error)
|
IstioClient() (istioclient.Interface, error)
|
||||||
CloudFoundryClient(cfAPPEndpoint string, cfUsername string, cfPassword string) (*cfclient.Client, error)
|
CloudFoundryClient(cfAPPEndpoint string, cfUsername string, cfPassword string) (*cfclient.Client, error)
|
||||||
DynamicKubernetesClient() (dynamic.Interface, error)
|
DynamicKubernetesClient() (dynamic.Interface, error)
|
||||||
@ -87,11 +89,13 @@ type SingletonClientGenerator struct {
|
|||||||
APIServerURL string
|
APIServerURL string
|
||||||
RequestTimeout time.Duration
|
RequestTimeout time.Duration
|
||||||
kubeClient kubernetes.Interface
|
kubeClient kubernetes.Interface
|
||||||
|
gatewayClient gateway.Interface
|
||||||
istioClient *istioclient.Clientset
|
istioClient *istioclient.Clientset
|
||||||
cfClient *cfclient.Client
|
cfClient *cfclient.Client
|
||||||
dynKubeClient dynamic.Interface
|
dynKubeClient dynamic.Interface
|
||||||
openshiftClient openshift.Interface
|
openshiftClient openshift.Interface
|
||||||
kubeOnce sync.Once
|
kubeOnce sync.Once
|
||||||
|
gatewayOnce sync.Once
|
||||||
istioOnce sync.Once
|
istioOnce sync.Once
|
||||||
cfOnce sync.Once
|
cfOnce sync.Once
|
||||||
dynCliOnce sync.Once
|
dynCliOnce sync.Once
|
||||||
@ -107,6 +111,28 @@ func (p *SingletonClientGenerator) KubeClient() (kubernetes.Interface, error) {
|
|||||||
return p.kubeClient, err
|
return p.kubeClient, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GatewayClient generates a gateway client if it was not created before
|
||||||
|
func (p *SingletonClientGenerator) GatewayClient() (gateway.Interface, error) {
|
||||||
|
var err error
|
||||||
|
p.gatewayOnce.Do(func() {
|
||||||
|
p.gatewayClient, err = newGatewayClient(p.KubeConfig, p.APIServerURL, p.RequestTimeout)
|
||||||
|
})
|
||||||
|
return p.gatewayClient, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func newGatewayClient(kubeConfig, apiServerURL string, requestTimeout time.Duration) (gateway.Interface, error) {
|
||||||
|
config, err := instrumentedRESTConfig(kubeConfig, apiServerURL, requestTimeout)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
client, err := gateway.NewForConfig(config)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
log.Infof("Created GatewayAPI client %s", config.Host)
|
||||||
|
return client, nil
|
||||||
|
}
|
||||||
|
|
||||||
// IstioClient generates an istio go client if it was not created before
|
// IstioClient generates an istio go client if it was not created before
|
||||||
func (p *SingletonClientGenerator) IstioClient() (istioclient.Interface, error) {
|
func (p *SingletonClientGenerator) IstioClient() (istioclient.Interface, error) {
|
||||||
var err error
|
var err error
|
||||||
@ -296,6 +322,23 @@ func BuildWithConfig(ctx context.Context, source string, p ClientGenerator, cfg
|
|||||||
return nil, ErrSourceNotFound
|
return nil, ErrSourceNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func instrumentedRESTConfig(kubeConfig, apiServerURL string, requestTimeout time.Duration) (*rest.Config, error) {
|
||||||
|
config, err := GetRestConfig(kubeConfig, apiServerURL)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
config.WrapTransport = func(rt http.RoundTripper) http.RoundTripper {
|
||||||
|
return instrumented_http.NewTransport(rt, &instrumented_http.Callbacks{
|
||||||
|
PathProcessor: func(path string) string {
|
||||||
|
parts := strings.Split(path, "/")
|
||||||
|
return parts[len(parts)-1]
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
config.Timeout = requestTimeout
|
||||||
|
return config, nil
|
||||||
|
}
|
||||||
|
|
||||||
// GetRestConfig returns the rest clients config to get automatically
|
// GetRestConfig returns the rest clients config to get automatically
|
||||||
// data if you run inside a cluster or by passing flags.
|
// data if you run inside a cluster or by passing flags.
|
||||||
func GetRestConfig(kubeConfig, apiServerURL string) (*rest.Config, error) {
|
func GetRestConfig(kubeConfig, apiServerURL string) (*rest.Config, error) {
|
||||||
@ -331,28 +374,15 @@ func GetRestConfig(kubeConfig, apiServerURL string) (*rest.Config, error) {
|
|||||||
// KubeConfig isn't provided it defaults to using the recommended default.
|
// KubeConfig isn't provided it defaults to using the recommended default.
|
||||||
func NewKubeClient(kubeConfig, apiServerURL string, requestTimeout time.Duration) (*kubernetes.Clientset, error) {
|
func NewKubeClient(kubeConfig, apiServerURL string, requestTimeout time.Duration) (*kubernetes.Clientset, error) {
|
||||||
log.Infof("Instantiating new Kubernetes client")
|
log.Infof("Instantiating new Kubernetes client")
|
||||||
config, err := GetRestConfig(kubeConfig, apiServerURL)
|
config, err := instrumentedRESTConfig(kubeConfig, apiServerURL, requestTimeout)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
config.Timeout = requestTimeout
|
|
||||||
config.WrapTransport = func(rt http.RoundTripper) http.RoundTripper {
|
|
||||||
return instrumented_http.NewTransport(rt, &instrumented_http.Callbacks{
|
|
||||||
PathProcessor: func(path string) string {
|
|
||||||
parts := strings.Split(path, "/")
|
|
||||||
return parts[len(parts)-1]
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
client, err := kubernetes.NewForConfig(config)
|
client, err := kubernetes.NewForConfig(config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Infof("Created Kubernetes client %s", config.Host)
|
log.Infof("Created Kubernetes client %s", config.Host)
|
||||||
|
|
||||||
return client, nil
|
return client, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -388,35 +418,15 @@ func NewIstioClient(kubeConfig string, apiServerURL string) (*istioclient.Client
|
|||||||
// uses APIServerURL and KubeConfig attributes to connect to the cluster. If
|
// uses APIServerURL and KubeConfig attributes to connect to the cluster. If
|
||||||
// KubeConfig isn't provided it defaults to using the recommended default.
|
// KubeConfig isn't provided it defaults to using the recommended default.
|
||||||
func NewDynamicKubernetesClient(kubeConfig, apiServerURL string, requestTimeout time.Duration) (dynamic.Interface, error) {
|
func NewDynamicKubernetesClient(kubeConfig, apiServerURL string, requestTimeout time.Duration) (dynamic.Interface, error) {
|
||||||
if kubeConfig == "" {
|
config, err := instrumentedRESTConfig(kubeConfig, apiServerURL, requestTimeout)
|
||||||
if _, err := os.Stat(clientcmd.RecommendedHomeFile); err == nil {
|
|
||||||
kubeConfig = clientcmd.RecommendedHomeFile
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
config, err := clientcmd.BuildConfigFromFlags(apiServerURL, kubeConfig)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
config.WrapTransport = func(rt http.RoundTripper) http.RoundTripper {
|
|
||||||
return instrumented_http.NewTransport(rt, &instrumented_http.Callbacks{
|
|
||||||
PathProcessor: func(path string) string {
|
|
||||||
parts := strings.Split(path, "/")
|
|
||||||
return parts[len(parts)-1]
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
config.Timeout = requestTimeout
|
|
||||||
|
|
||||||
client, err := dynamic.NewForConfig(config)
|
client, err := dynamic.NewForConfig(config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Infof("Created Dynamic Kubernetes client %s", config.Host)
|
log.Infof("Created Dynamic Kubernetes client %s", config.Host)
|
||||||
|
|
||||||
return client, nil
|
return client, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -424,34 +434,14 @@ func NewDynamicKubernetesClient(kubeConfig, apiServerURL string, requestTimeout
|
|||||||
// uses APIServerURL and KubeConfig attributes to connect to the cluster. If
|
// uses APIServerURL and KubeConfig attributes to connect to the cluster. If
|
||||||
// KubeConfig isn't provided it defaults to using the recommended default.
|
// KubeConfig isn't provided it defaults to using the recommended default.
|
||||||
func NewOpenShiftClient(kubeConfig, apiServerURL string, requestTimeout time.Duration) (*openshift.Clientset, error) {
|
func NewOpenShiftClient(kubeConfig, apiServerURL string, requestTimeout time.Duration) (*openshift.Clientset, error) {
|
||||||
if kubeConfig == "" {
|
config, err := instrumentedRESTConfig(kubeConfig, apiServerURL, requestTimeout)
|
||||||
if _, err := os.Stat(clientcmd.RecommendedHomeFile); err == nil {
|
|
||||||
kubeConfig = clientcmd.RecommendedHomeFile
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
config, err := clientcmd.BuildConfigFromFlags(apiServerURL, kubeConfig)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
config.WrapTransport = func(rt http.RoundTripper) http.RoundTripper {
|
|
||||||
return instrumented_http.NewTransport(rt, &instrumented_http.Callbacks{
|
|
||||||
PathProcessor: func(path string) string {
|
|
||||||
parts := strings.Split(path, "/")
|
|
||||||
return parts[len(parts)-1]
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
config.Timeout = requestTimeout
|
|
||||||
|
|
||||||
client, err := openshift.NewForConfig(config)
|
client, err := openshift.NewForConfig(config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Infof("Created OpenShift client %s", config.Host)
|
log.Infof("Created OpenShift client %s", config.Host)
|
||||||
|
|
||||||
return client, nil
|
return client, nil
|
||||||
}
|
}
|
||||||
|
@ -33,11 +33,13 @@ 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"
|
||||||
|
gateway "sigs.k8s.io/gateway-api/pkg/client/clientset/gateway/versioned"
|
||||||
)
|
)
|
||||||
|
|
||||||
type MockClientGenerator struct {
|
type MockClientGenerator struct {
|
||||||
mock.Mock
|
mock.Mock
|
||||||
kubeClient kubernetes.Interface
|
kubeClient kubernetes.Interface
|
||||||
|
gatewayClient gateway.Interface
|
||||||
istioClient istioclient.Interface
|
istioClient istioclient.Interface
|
||||||
cloudFoundryClient *cfclient.Client
|
cloudFoundryClient *cfclient.Client
|
||||||
dynamicKubernetesClient dynamic.Interface
|
dynamicKubernetesClient dynamic.Interface
|
||||||
@ -53,6 +55,15 @@ func (m *MockClientGenerator) KubeClient() (kubernetes.Interface, error) {
|
|||||||
return nil, args.Error(1)
|
return nil, args.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *MockClientGenerator) GatewayClient() (gateway.Interface, error) {
|
||||||
|
args := m.Called()
|
||||||
|
if args.Error(1) != nil {
|
||||||
|
return nil, args.Error(1)
|
||||||
|
}
|
||||||
|
m.gatewayClient = args.Get(0).(gateway.Interface)
|
||||||
|
return m.gatewayClient, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (m *MockClientGenerator) IstioClient() (istioclient.Interface, error) {
|
func (m *MockClientGenerator) IstioClient() (istioclient.Interface, error) {
|
||||||
args := m.Called()
|
args := m.Called()
|
||||||
if args.Error(1) == nil {
|
if args.Error(1) == nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user