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 = ""
|
||||
revision = "4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:e62a9159a86473538057a322c49b65824cc32da865ace6cfc5ef1cacf3245226"
|
||||
name = "github.com/chiefy/linodego"
|
||||
packages = ["."]
|
||||
pruneopts = ""
|
||||
revision = "e7bd44d89fc5db41b43b8bce7278550a589d7ab6"
|
||||
version = "v0.2.0"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:85fd00554a6ed5b33687684b76635d532c74141508b5bce2843d85e8a3c9dc91"
|
||||
name = "github.com/cloudflare/cloudflare-go"
|
||||
@ -359,6 +351,14 @@
|
||||
revision = "508103cfb3b315fa9752b5bcd4fb2d97bbc26d89"
|
||||
version = "v0.2.0"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:1c41354ef11c9dbae2fe1ceee8369fcb2634977ba07e701e19ea53e8742c5420"
|
||||
name = "github.com/linode/linodego"
|
||||
packages = ["."]
|
||||
pruneopts = ""
|
||||
revision = "7edbc87f0140b7561dbc20458877a56bdded5eb8"
|
||||
version = "v0.3.0"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:63722a4b1e1717be7b98fc686e0b30d5e7f734b9e93d7dee86293b6deab7ea28"
|
||||
@ -838,7 +838,6 @@
|
||||
"github.com/aws/aws-sdk-go/aws/session",
|
||||
"github.com/aws/aws-sdk-go/service/route53",
|
||||
"github.com/aws/aws-sdk-go/service/servicediscovery",
|
||||
"github.com/chiefy/linodego",
|
||||
"github.com/cloudflare/cloudflare-go",
|
||||
"github.com/coreos/etcd/client",
|
||||
"github.com/digitalocean/godo",
|
||||
@ -854,6 +853,7 @@
|
||||
"github.com/infobloxopen/infoblox-go-client",
|
||||
"github.com/kubernetes/repo-infra/verify/boilerplate/test",
|
||||
"github.com/linki/instrumented_http",
|
||||
"github.com/linode/linodego",
|
||||
"github.com/nesv/go-dynect/dynect",
|
||||
"github.com/oracle/oci-go-sdk/common",
|
||||
"github.com/oracle/oci-go-sdk/dns",
|
||||
|
@ -77,5 +77,5 @@ ignored = ["github.com/kubernetes/repo-infra/kazel"]
|
||||
version = "1.8.0"
|
||||
|
||||
[[constraint]]
|
||||
name = "github.com/chiefy/linodego"
|
||||
version = "0.2.0"
|
||||
name = "github.com/linode/linodego"
|
||||
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.
|
||||
sources, err := source.ByNames(&source.SingletonClientGenerator{
|
||||
KubeConfig: cfg.KubeConfig,
|
||||
KubeMaster: cfg.Master,
|
||||
KubeConfig: cfg.KubeConfig,
|
||||
KubeMaster: cfg.Master,
|
||||
RequestTimeout: cfg.RequestTimeout,
|
||||
}, cfg.Sources, sourceCfg)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
@ -122,7 +123,7 @@ func main() {
|
||||
case "digitalocean":
|
||||
p, err = provider.NewDigitalOceanProvider(domainFilter, cfg.DryRun)
|
||||
case "linode":
|
||||
p, err = provider.NewLinodeProvider(domainFilter, cfg.DryRun)
|
||||
p, err = provider.NewLinodeProvider(domainFilter, cfg.DryRun, externaldns.Version)
|
||||
case "dnsimple":
|
||||
p, err = provider.NewDnsimpleProvider(domainFilter, zoneIDFilter, cfg.DryRun)
|
||||
case "infoblox":
|
||||
|
@ -38,6 +38,7 @@ var (
|
||||
type Config struct {
|
||||
Master string
|
||||
KubeConfig string
|
||||
RequestTimeout time.Duration
|
||||
Sources []string
|
||||
Namespace string
|
||||
AnnotationFilter string
|
||||
@ -95,6 +96,7 @@ type Config struct {
|
||||
var defaultConfig = &Config{
|
||||
Master: "",
|
||||
KubeConfig: "",
|
||||
RequestTimeout: time.Second * 30,
|
||||
Sources: nil,
|
||||
Namespace: "",
|
||||
AnnotationFilter: "",
|
||||
@ -183,6 +185,7 @@ func (cfg *Config) ParseFlags(args []string) error {
|
||||
// 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("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
|
||||
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{
|
||||
Master: "",
|
||||
KubeConfig: "",
|
||||
RequestTimeout: time.Second * 30,
|
||||
Sources: []string{"service"},
|
||||
Namespace: "",
|
||||
FQDNTemplate: "",
|
||||
@ -76,6 +77,7 @@ var (
|
||||
overriddenConfig = &Config{
|
||||
Master: "http://127.0.0.1:8080",
|
||||
KubeConfig: "/some/path",
|
||||
RequestTimeout: time.Second * 77,
|
||||
Sources: []string{"service", "ingress", "connector"},
|
||||
Namespace: "namespace",
|
||||
FQDNTemplate: "{{.Name}}.service.example.com",
|
||||
@ -144,6 +146,7 @@ func TestParseFlags(t *testing.T) {
|
||||
args: []string{
|
||||
"--master=http://127.0.0.1:8080",
|
||||
"--kubeconfig=/some/path",
|
||||
"--request-timeout=77s",
|
||||
"--source=service",
|
||||
"--source=ingress",
|
||||
"--source=connector",
|
||||
@ -203,6 +206,7 @@ func TestParseFlags(t *testing.T) {
|
||||
envVars: map[string]string{
|
||||
"EXTERNAL_DNS_MASTER": "http://127.0.0.1:8080",
|
||||
"EXTERNAL_DNS_KUBECONFIG": "/some/path",
|
||||
"EXTERNAL_DNS_REQUEST_TIMEOUT": "77s",
|
||||
"EXTERNAL_DNS_SOURCE": "service\ningress\nconnector",
|
||||
"EXTERNAL_DNS_NAMESPACE": "namespace",
|
||||
"EXTERNAL_DNS_FQDN_TEMPLATE": "{{.Name}}.service.example.com",
|
||||
|
@ -143,10 +143,10 @@ func NewGoogleProvider(project string, domainFilter DomainFilter, zoneIDFilter Z
|
||||
}
|
||||
|
||||
provider := &GoogleProvider{
|
||||
project: project,
|
||||
domainFilter: domainFilter,
|
||||
zoneIDFilter: zoneIDFilter,
|
||||
dryRun: dryRun,
|
||||
project: project,
|
||||
domainFilter: domainFilter,
|
||||
zoneIDFilter: zoneIDFilter,
|
||||
dryRun: dryRun,
|
||||
resourceRecordSetsClient: resourceRecordSetsService{dnsClient.ResourceRecordSets},
|
||||
managedZonesClient: managedZonesService{dnsClient.ManagedZones},
|
||||
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 {
|
||||
provider := &GoogleProvider{
|
||||
project: "zalando-external-dns-test",
|
||||
domainFilter: domainFilter,
|
||||
zoneIDFilter: zoneIDFilter,
|
||||
dryRun: false,
|
||||
project: "zalando-external-dns-test",
|
||||
domainFilter: domainFilter,
|
||||
zoneIDFilter: zoneIDFilter,
|
||||
dryRun: false,
|
||||
resourceRecordSetsClient: &mockResourceRecordSetsClient{},
|
||||
managedZonesClient: &mockManagedZonesClient{},
|
||||
changesClient: &mockChangesClient{},
|
||||
|
@ -23,7 +23,7 @@ import (
|
||||
"os"
|
||||
"strconv"
|
||||
|
||||
"github.com/chiefy/linodego"
|
||||
"github.com/linode/linodego"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"golang.org/x/oauth2"
|
||||
|
||||
@ -76,7 +76,7 @@ type LinodeChangeDelete struct {
|
||||
}
|
||||
|
||||
// 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")
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("no token found")
|
||||
@ -91,6 +91,7 @@ func NewLinodeProvider(domainFilter DomainFilter, dryRun bool) (*LinodeProvider,
|
||||
}
|
||||
|
||||
linodeClient := linodego.NewClient(oauth2Client)
|
||||
linodeClient.SetUserAgent(fmt.Sprintf("ExternalDNS/%s linodego/%s", appVersion, linodego.Version))
|
||||
|
||||
provider := &LinodeProvider{
|
||||
Client: &linodeClient,
|
||||
|
@ -21,9 +21,9 @@ import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/chiefy/linodego"
|
||||
"github.com/kubernetes-incubator/external-dns/endpoint"
|
||||
"github.com/kubernetes-incubator/external-dns/plan"
|
||||
"github.com/linode/linodego"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/mock"
|
||||
"github.com/stretchr/testify/require"
|
||||
@ -137,11 +137,11 @@ func TestLinodeConvertRecordType(t *testing.T) {
|
||||
|
||||
func TestNewLinodeProvider(t *testing.T) {
|
||||
_ = 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)
|
||||
|
||||
_ = 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)
|
||||
}
|
||||
|
||||
|
@ -21,6 +21,7 @@ import (
|
||||
"net/http"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"sync"
|
||||
|
||||
@ -53,9 +54,10 @@ type ClientGenerator interface {
|
||||
// SingletonClientGenerator stores provider clients and guarantees that only one instance of client
|
||||
// will be generated
|
||||
type SingletonClientGenerator struct {
|
||||
KubeConfig string
|
||||
KubeMaster string
|
||||
client kubernetes.Interface
|
||||
KubeConfig string
|
||||
KubeMaster string
|
||||
RequestTimeout time.Duration
|
||||
client kubernetes.Interface
|
||||
sync.Once
|
||||
}
|
||||
|
||||
@ -63,7 +65,7 @@ type SingletonClientGenerator struct {
|
||||
func (p *SingletonClientGenerator) KubeClient() (kubernetes.Interface, error) {
|
||||
var err error
|
||||
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
|
||||
}
|
||||
@ -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
|
||||
// uses KubeMaster and KubeConfig attributes to connect to the cluster. If
|
||||
// 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 _, err := os.Stat(clientcmd.RecommendedHomeFile); err == nil {
|
||||
kubeConfig = clientcmd.RecommendedHomeFile
|
||||
@ -129,6 +131,8 @@ func NewKubeClient(kubeConfig, kubeMaster string) (*kubernetes.Clientset, error)
|
||||
})
|
||||
}
|
||||
|
||||
config.Timeout = requestTimeout
|
||||
|
||||
client, err := kubernetes.NewForConfig(config)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
Loading…
Reference in New Issue
Block a user