Merge branch 'master' into egoscale-v0.11

This commit is contained in:
Nick Jüttner 2018-08-16 17:23:32 +02:00 committed by GitHub
commit bbd0cad38f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 45 additions and 32 deletions

18
Gopkg.lock generated
View File

@ -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",

View File

@ -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"

View File

@ -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":

View File

@ -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")

View File

@ -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",

View File

@ -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},

View File

@ -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{},

View File

@ -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,

View File

@ -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)
} }

View File

@ -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