mirror of
https://github.com/kubernetes-sigs/external-dns.git
synced 2025-08-07 10:06:57 +02:00
Merge branch 'master' into egoscale-v0.11
This commit is contained in:
commit
bbd0cad38f
18
Gopkg.lock
generated
18
Gopkg.lock
generated
@ -107,14 +107,6 @@
|
|||||||
pruneopts = ""
|
pruneopts = ""
|
||||||
revision = "4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9"
|
revision = "4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9"
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
digest = "1:e62a9159a86473538057a322c49b65824cc32da865ace6cfc5ef1cacf3245226"
|
|
||||||
name = "github.com/chiefy/linodego"
|
|
||||||
packages = ["."]
|
|
||||||
pruneopts = ""
|
|
||||||
revision = "e7bd44d89fc5db41b43b8bce7278550a589d7ab6"
|
|
||||||
version = "v0.2.0"
|
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:85fd00554a6ed5b33687684b76635d532c74141508b5bce2843d85e8a3c9dc91"
|
digest = "1:85fd00554a6ed5b33687684b76635d532c74141508b5bce2843d85e8a3c9dc91"
|
||||||
name = "github.com/cloudflare/cloudflare-go"
|
name = "github.com/cloudflare/cloudflare-go"
|
||||||
@ -359,6 +351,14 @@
|
|||||||
revision = "508103cfb3b315fa9752b5bcd4fb2d97bbc26d89"
|
revision = "508103cfb3b315fa9752b5bcd4fb2d97bbc26d89"
|
||||||
version = "v0.2.0"
|
version = "v0.2.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:1c41354ef11c9dbae2fe1ceee8369fcb2634977ba07e701e19ea53e8742c5420"
|
||||||
|
name = "github.com/linode/linodego"
|
||||||
|
packages = ["."]
|
||||||
|
pruneopts = ""
|
||||||
|
revision = "7edbc87f0140b7561dbc20458877a56bdded5eb8"
|
||||||
|
version = "v0.3.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
digest = "1:63722a4b1e1717be7b98fc686e0b30d5e7f734b9e93d7dee86293b6deab7ea28"
|
digest = "1:63722a4b1e1717be7b98fc686e0b30d5e7f734b9e93d7dee86293b6deab7ea28"
|
||||||
@ -838,7 +838,6 @@
|
|||||||
"github.com/aws/aws-sdk-go/aws/session",
|
"github.com/aws/aws-sdk-go/aws/session",
|
||||||
"github.com/aws/aws-sdk-go/service/route53",
|
"github.com/aws/aws-sdk-go/service/route53",
|
||||||
"github.com/aws/aws-sdk-go/service/servicediscovery",
|
"github.com/aws/aws-sdk-go/service/servicediscovery",
|
||||||
"github.com/chiefy/linodego",
|
|
||||||
"github.com/cloudflare/cloudflare-go",
|
"github.com/cloudflare/cloudflare-go",
|
||||||
"github.com/coreos/etcd/client",
|
"github.com/coreos/etcd/client",
|
||||||
"github.com/digitalocean/godo",
|
"github.com/digitalocean/godo",
|
||||||
@ -854,6 +853,7 @@
|
|||||||
"github.com/infobloxopen/infoblox-go-client",
|
"github.com/infobloxopen/infoblox-go-client",
|
||||||
"github.com/kubernetes/repo-infra/verify/boilerplate/test",
|
"github.com/kubernetes/repo-infra/verify/boilerplate/test",
|
||||||
"github.com/linki/instrumented_http",
|
"github.com/linki/instrumented_http",
|
||||||
|
"github.com/linode/linodego",
|
||||||
"github.com/nesv/go-dynect/dynect",
|
"github.com/nesv/go-dynect/dynect",
|
||||||
"github.com/oracle/oci-go-sdk/common",
|
"github.com/oracle/oci-go-sdk/common",
|
||||||
"github.com/oracle/oci-go-sdk/dns",
|
"github.com/oracle/oci-go-sdk/dns",
|
||||||
|
@ -77,5 +77,5 @@ ignored = ["github.com/kubernetes/repo-infra/kazel"]
|
|||||||
version = "1.8.0"
|
version = "1.8.0"
|
||||||
|
|
||||||
[[constraint]]
|
[[constraint]]
|
||||||
name = "github.com/chiefy/linodego"
|
name = "github.com/linode/linodego"
|
||||||
version = "0.2.0"
|
version = "0.3.0"
|
7
main.go
7
main.go
@ -79,8 +79,9 @@ func main() {
|
|||||||
|
|
||||||
// Lookup all the selected sources by names and pass them the desired configuration.
|
// Lookup all the selected sources by names and pass them the desired configuration.
|
||||||
sources, err := source.ByNames(&source.SingletonClientGenerator{
|
sources, err := source.ByNames(&source.SingletonClientGenerator{
|
||||||
KubeConfig: cfg.KubeConfig,
|
KubeConfig: cfg.KubeConfig,
|
||||||
KubeMaster: cfg.Master,
|
KubeMaster: cfg.Master,
|
||||||
|
RequestTimeout: cfg.RequestTimeout,
|
||||||
}, cfg.Sources, sourceCfg)
|
}, cfg.Sources, sourceCfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
@ -122,7 +123,7 @@ func main() {
|
|||||||
case "digitalocean":
|
case "digitalocean":
|
||||||
p, err = provider.NewDigitalOceanProvider(domainFilter, cfg.DryRun)
|
p, err = provider.NewDigitalOceanProvider(domainFilter, cfg.DryRun)
|
||||||
case "linode":
|
case "linode":
|
||||||
p, err = provider.NewLinodeProvider(domainFilter, cfg.DryRun)
|
p, err = provider.NewLinodeProvider(domainFilter, cfg.DryRun, externaldns.Version)
|
||||||
case "dnsimple":
|
case "dnsimple":
|
||||||
p, err = provider.NewDnsimpleProvider(domainFilter, zoneIDFilter, cfg.DryRun)
|
p, err = provider.NewDnsimpleProvider(domainFilter, zoneIDFilter, cfg.DryRun)
|
||||||
case "infoblox":
|
case "infoblox":
|
||||||
|
@ -38,6 +38,7 @@ var (
|
|||||||
type Config struct {
|
type Config struct {
|
||||||
Master string
|
Master string
|
||||||
KubeConfig string
|
KubeConfig string
|
||||||
|
RequestTimeout time.Duration
|
||||||
Sources []string
|
Sources []string
|
||||||
Namespace string
|
Namespace string
|
||||||
AnnotationFilter string
|
AnnotationFilter string
|
||||||
@ -95,6 +96,7 @@ type Config struct {
|
|||||||
var defaultConfig = &Config{
|
var defaultConfig = &Config{
|
||||||
Master: "",
|
Master: "",
|
||||||
KubeConfig: "",
|
KubeConfig: "",
|
||||||
|
RequestTimeout: time.Second * 30,
|
||||||
Sources: nil,
|
Sources: nil,
|
||||||
Namespace: "",
|
Namespace: "",
|
||||||
AnnotationFilter: "",
|
AnnotationFilter: "",
|
||||||
@ -183,6 +185,7 @@ func (cfg *Config) ParseFlags(args []string) error {
|
|||||||
// Flags related to Kubernetes
|
// Flags related to Kubernetes
|
||||||
app.Flag("master", "The Kubernetes API server to connect to (default: auto-detect)").Default(defaultConfig.Master).StringVar(&cfg.Master)
|
app.Flag("master", "The Kubernetes API server to connect to (default: auto-detect)").Default(defaultConfig.Master).StringVar(&cfg.Master)
|
||||||
app.Flag("kubeconfig", "Retrieve target cluster configuration from a Kubernetes configuration file (default: auto-detect)").Default(defaultConfig.KubeConfig).StringVar(&cfg.KubeConfig)
|
app.Flag("kubeconfig", "Retrieve target cluster configuration from a Kubernetes configuration file (default: auto-detect)").Default(defaultConfig.KubeConfig).StringVar(&cfg.KubeConfig)
|
||||||
|
app.Flag("request-timeout", "Request timeout when calling Kubernetes APIs. 0s means no timeout").Default(defaultConfig.RequestTimeout.String()).DurationVar(&cfg.RequestTimeout)
|
||||||
|
|
||||||
// Flags related to processing sources
|
// Flags related to processing sources
|
||||||
app.Flag("source", "The resource types that are queried for endpoints; specify multiple times for multiple sources (required, options: service, ingress, fake, connector)").Required().PlaceHolder("source").EnumsVar(&cfg.Sources, "service", "ingress", "fake", "connector")
|
app.Flag("source", "The resource types that are queried for endpoints; specify multiple times for multiple sources (required, options: service, ingress, fake, connector)").Required().PlaceHolder("source").EnumsVar(&cfg.Sources, "service", "ingress", "fake", "connector")
|
||||||
|
@ -31,6 +31,7 @@ var (
|
|||||||
minimalConfig = &Config{
|
minimalConfig = &Config{
|
||||||
Master: "",
|
Master: "",
|
||||||
KubeConfig: "",
|
KubeConfig: "",
|
||||||
|
RequestTimeout: time.Second * 30,
|
||||||
Sources: []string{"service"},
|
Sources: []string{"service"},
|
||||||
Namespace: "",
|
Namespace: "",
|
||||||
FQDNTemplate: "",
|
FQDNTemplate: "",
|
||||||
@ -76,6 +77,7 @@ var (
|
|||||||
overriddenConfig = &Config{
|
overriddenConfig = &Config{
|
||||||
Master: "http://127.0.0.1:8080",
|
Master: "http://127.0.0.1:8080",
|
||||||
KubeConfig: "/some/path",
|
KubeConfig: "/some/path",
|
||||||
|
RequestTimeout: time.Second * 77,
|
||||||
Sources: []string{"service", "ingress", "connector"},
|
Sources: []string{"service", "ingress", "connector"},
|
||||||
Namespace: "namespace",
|
Namespace: "namespace",
|
||||||
FQDNTemplate: "{{.Name}}.service.example.com",
|
FQDNTemplate: "{{.Name}}.service.example.com",
|
||||||
@ -144,6 +146,7 @@ func TestParseFlags(t *testing.T) {
|
|||||||
args: []string{
|
args: []string{
|
||||||
"--master=http://127.0.0.1:8080",
|
"--master=http://127.0.0.1:8080",
|
||||||
"--kubeconfig=/some/path",
|
"--kubeconfig=/some/path",
|
||||||
|
"--request-timeout=77s",
|
||||||
"--source=service",
|
"--source=service",
|
||||||
"--source=ingress",
|
"--source=ingress",
|
||||||
"--source=connector",
|
"--source=connector",
|
||||||
@ -203,6 +206,7 @@ func TestParseFlags(t *testing.T) {
|
|||||||
envVars: map[string]string{
|
envVars: map[string]string{
|
||||||
"EXTERNAL_DNS_MASTER": "http://127.0.0.1:8080",
|
"EXTERNAL_DNS_MASTER": "http://127.0.0.1:8080",
|
||||||
"EXTERNAL_DNS_KUBECONFIG": "/some/path",
|
"EXTERNAL_DNS_KUBECONFIG": "/some/path",
|
||||||
|
"EXTERNAL_DNS_REQUEST_TIMEOUT": "77s",
|
||||||
"EXTERNAL_DNS_SOURCE": "service\ningress\nconnector",
|
"EXTERNAL_DNS_SOURCE": "service\ningress\nconnector",
|
||||||
"EXTERNAL_DNS_NAMESPACE": "namespace",
|
"EXTERNAL_DNS_NAMESPACE": "namespace",
|
||||||
"EXTERNAL_DNS_FQDN_TEMPLATE": "{{.Name}}.service.example.com",
|
"EXTERNAL_DNS_FQDN_TEMPLATE": "{{.Name}}.service.example.com",
|
||||||
|
@ -143,10 +143,10 @@ func NewGoogleProvider(project string, domainFilter DomainFilter, zoneIDFilter Z
|
|||||||
}
|
}
|
||||||
|
|
||||||
provider := &GoogleProvider{
|
provider := &GoogleProvider{
|
||||||
project: project,
|
project: project,
|
||||||
domainFilter: domainFilter,
|
domainFilter: domainFilter,
|
||||||
zoneIDFilter: zoneIDFilter,
|
zoneIDFilter: zoneIDFilter,
|
||||||
dryRun: dryRun,
|
dryRun: dryRun,
|
||||||
resourceRecordSetsClient: resourceRecordSetsService{dnsClient.ResourceRecordSets},
|
resourceRecordSetsClient: resourceRecordSetsService{dnsClient.ResourceRecordSets},
|
||||||
managedZonesClient: managedZonesService{dnsClient.ManagedZones},
|
managedZonesClient: managedZonesService{dnsClient.ManagedZones},
|
||||||
changesClient: changesService{dnsClient.Changes},
|
changesClient: changesService{dnsClient.Changes},
|
||||||
|
@ -569,10 +569,10 @@ func validateChangeRecord(t *testing.T, record *dns.ResourceRecordSet, expected
|
|||||||
|
|
||||||
func newGoogleProvider(t *testing.T, domainFilter DomainFilter, zoneIDFilter ZoneIDFilter, dryRun bool, records []*endpoint.Endpoint) *GoogleProvider {
|
func newGoogleProvider(t *testing.T, domainFilter DomainFilter, zoneIDFilter ZoneIDFilter, dryRun bool, records []*endpoint.Endpoint) *GoogleProvider {
|
||||||
provider := &GoogleProvider{
|
provider := &GoogleProvider{
|
||||||
project: "zalando-external-dns-test",
|
project: "zalando-external-dns-test",
|
||||||
domainFilter: domainFilter,
|
domainFilter: domainFilter,
|
||||||
zoneIDFilter: zoneIDFilter,
|
zoneIDFilter: zoneIDFilter,
|
||||||
dryRun: false,
|
dryRun: false,
|
||||||
resourceRecordSetsClient: &mockResourceRecordSetsClient{},
|
resourceRecordSetsClient: &mockResourceRecordSetsClient{},
|
||||||
managedZonesClient: &mockManagedZonesClient{},
|
managedZonesClient: &mockManagedZonesClient{},
|
||||||
changesClient: &mockChangesClient{},
|
changesClient: &mockChangesClient{},
|
||||||
|
@ -23,7 +23,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/chiefy/linodego"
|
"github.com/linode/linodego"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
|
|
||||||
@ -76,7 +76,7 @@ type LinodeChangeDelete struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewLinodeProvider initializes a new Linode DNS based Provider.
|
// NewLinodeProvider initializes a new Linode DNS based Provider.
|
||||||
func NewLinodeProvider(domainFilter DomainFilter, dryRun bool) (*LinodeProvider, error) {
|
func NewLinodeProvider(domainFilter DomainFilter, dryRun bool, appVersion string) (*LinodeProvider, error) {
|
||||||
token, ok := os.LookupEnv("LINODE_TOKEN")
|
token, ok := os.LookupEnv("LINODE_TOKEN")
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf("no token found")
|
return nil, fmt.Errorf("no token found")
|
||||||
@ -91,6 +91,7 @@ func NewLinodeProvider(domainFilter DomainFilter, dryRun bool) (*LinodeProvider,
|
|||||||
}
|
}
|
||||||
|
|
||||||
linodeClient := linodego.NewClient(oauth2Client)
|
linodeClient := linodego.NewClient(oauth2Client)
|
||||||
|
linodeClient.SetUserAgent(fmt.Sprintf("ExternalDNS/%s linodego/%s", appVersion, linodego.Version))
|
||||||
|
|
||||||
provider := &LinodeProvider{
|
provider := &LinodeProvider{
|
||||||
Client: &linodeClient,
|
Client: &linodeClient,
|
||||||
|
@ -21,9 +21,9 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/chiefy/linodego"
|
|
||||||
"github.com/kubernetes-incubator/external-dns/endpoint"
|
"github.com/kubernetes-incubator/external-dns/endpoint"
|
||||||
"github.com/kubernetes-incubator/external-dns/plan"
|
"github.com/kubernetes-incubator/external-dns/plan"
|
||||||
|
"github.com/linode/linodego"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/mock"
|
"github.com/stretchr/testify/mock"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
@ -137,11 +137,11 @@ func TestLinodeConvertRecordType(t *testing.T) {
|
|||||||
|
|
||||||
func TestNewLinodeProvider(t *testing.T) {
|
func TestNewLinodeProvider(t *testing.T) {
|
||||||
_ = os.Setenv("LINODE_TOKEN", "xxxxxxxxxxxxxxxxx")
|
_ = os.Setenv("LINODE_TOKEN", "xxxxxxxxxxxxxxxxx")
|
||||||
_, err := NewLinodeProvider(NewDomainFilter([]string{"ext-dns-test.zalando.to."}), true)
|
_, err := NewLinodeProvider(NewDomainFilter([]string{"ext-dns-test.zalando.to."}), true, "1.0")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
_ = os.Unsetenv("LINODE_TOKEN")
|
_ = os.Unsetenv("LINODE_TOKEN")
|
||||||
_, err = NewLinodeProvider(NewDomainFilter([]string{"ext-dns-test.zalando.to."}), true)
|
_, err = NewLinodeProvider(NewDomainFilter([]string{"ext-dns-test.zalando.to."}), true, "1.0")
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
@ -53,9 +54,10 @@ type ClientGenerator interface {
|
|||||||
// SingletonClientGenerator stores provider clients and guarantees that only one instance of client
|
// SingletonClientGenerator stores provider clients and guarantees that only one instance of client
|
||||||
// will be generated
|
// will be generated
|
||||||
type SingletonClientGenerator struct {
|
type SingletonClientGenerator struct {
|
||||||
KubeConfig string
|
KubeConfig string
|
||||||
KubeMaster string
|
KubeMaster string
|
||||||
client kubernetes.Interface
|
RequestTimeout time.Duration
|
||||||
|
client kubernetes.Interface
|
||||||
sync.Once
|
sync.Once
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,7 +65,7 @@ type SingletonClientGenerator struct {
|
|||||||
func (p *SingletonClientGenerator) KubeClient() (kubernetes.Interface, error) {
|
func (p *SingletonClientGenerator) KubeClient() (kubernetes.Interface, error) {
|
||||||
var err error
|
var err error
|
||||||
p.Once.Do(func() {
|
p.Once.Do(func() {
|
||||||
p.client, err = NewKubeClient(p.KubeConfig, p.KubeMaster)
|
p.client, err = NewKubeClient(p.KubeConfig, p.KubeMaster, p.RequestTimeout)
|
||||||
})
|
})
|
||||||
return p.client, err
|
return p.client, err
|
||||||
}
|
}
|
||||||
@ -108,7 +110,7 @@ func BuildWithConfig(source string, p ClientGenerator, cfg *Config) (Source, err
|
|||||||
// NewKubeClient returns a new Kubernetes client object. It takes a Config and
|
// NewKubeClient returns a new Kubernetes client object. It takes a Config and
|
||||||
// uses KubeMaster and KubeConfig attributes to connect to the cluster. If
|
// uses KubeMaster 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 NewKubeClient(kubeConfig, kubeMaster string) (*kubernetes.Clientset, error) {
|
func NewKubeClient(kubeConfig, kubeMaster string, requestTimeout time.Duration) (*kubernetes.Clientset, error) {
|
||||||
if kubeConfig == "" {
|
if kubeConfig == "" {
|
||||||
if _, err := os.Stat(clientcmd.RecommendedHomeFile); err == nil {
|
if _, err := os.Stat(clientcmd.RecommendedHomeFile); err == nil {
|
||||||
kubeConfig = clientcmd.RecommendedHomeFile
|
kubeConfig = clientcmd.RecommendedHomeFile
|
||||||
@ -129,6 +131,8 @@ func NewKubeClient(kubeConfig, kubeMaster string) (*kubernetes.Clientset, error)
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
config.Timeout = requestTimeout
|
||||||
|
|
||||||
client, err := kubernetes.NewForConfig(config)
|
client, err := kubernetes.NewForConfig(config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
Loading…
Reference in New Issue
Block a user