From 662939e62684aa212112e85bd3a1437a97f2585b Mon Sep 17 00:00:00 2001 From: andrewsykim Date: Sat, 24 Feb 2018 13:48:43 -0500 Subject: [PATCH] dns-controller: support digitalocean --- dns-controller/cmd/dns-controller/BUILD.bazel | 1 + dns-controller/cmd/dns-controller/main.go | 5 +- pkg/resources/digitalocean/cloud.go | 3 +- pkg/resources/digitalocean/dns/BUILD.bazel | 1 + pkg/resources/digitalocean/dns/dns.go | 48 ++++++++++++++++++- 5 files changed, 54 insertions(+), 4 deletions(-) diff --git a/dns-controller/cmd/dns-controller/BUILD.bazel b/dns-controller/cmd/dns-controller/BUILD.bazel index 90c01d87c0..e063e58e41 100644 --- a/dns-controller/cmd/dns-controller/BUILD.bazel +++ b/dns-controller/cmd/dns-controller/BUILD.bazel @@ -12,6 +12,7 @@ go_library( "//dnsprovider/pkg/dnsprovider/providers/aws/route53:go_default_library", "//dnsprovider/pkg/dnsprovider/providers/coredns:go_default_library", "//dnsprovider/pkg/dnsprovider/providers/google/clouddns:go_default_library", + "//pkg/resources/digitalocean/dns:go_default_library", "//protokube/pkg/gossip:go_default_library", "//protokube/pkg/gossip/dns:go_default_library", "//protokube/pkg/gossip/dns/provider:go_default_library", diff --git a/dns-controller/cmd/dns-controller/main.go b/dns-controller/cmd/dns-controller/main.go index 5ac1a9672a..89071b09e7 100644 --- a/dns-controller/cmd/dns-controller/main.go +++ b/dns-controller/cmd/dns-controller/main.go @@ -26,14 +26,17 @@ import ( "github.com/golang/glog" "github.com/spf13/pflag" + "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" + "k8s.io/kops/dns-controller/pkg/dns" "k8s.io/kops/dns-controller/pkg/watchers" "k8s.io/kops/dnsprovider/pkg/dnsprovider" _ "k8s.io/kops/dnsprovider/pkg/dnsprovider/providers/aws/route53" k8scoredns "k8s.io/kops/dnsprovider/pkg/dnsprovider/providers/coredns" _ "k8s.io/kops/dnsprovider/pkg/dnsprovider/providers/google/clouddns" + _ "k8s.io/kops/pkg/resources/digitalocean/dns" "k8s.io/kops/protokube/pkg/gossip" gossipdns "k8s.io/kops/protokube/pkg/gossip/dns" gossipdnsprovider "k8s.io/kops/protokube/pkg/gossip/dns/provider" @@ -58,7 +61,7 @@ func main() { flags.BoolVar(&watchIngress, "watch-ingress", true, "Configure hostnames found in ingress resources") flags.StringSliceVar(&gossipSeeds, "gossip-seed", gossipSeeds, "If set, will enable gossip zones and seed using the provided addresses") flags.StringSliceVarP(&zones, "zone", "z", []string{}, "Configure permitted zones and their mappings") - flags.StringVar(&dnsProviderID, "dns", "aws-route53", "DNS provider we should use (aws-route53, google-clouddns, coredns, gossip)") + flags.StringVar(&dnsProviderID, "dns", "aws-route53", "DNS provider we should use (aws-route53, google-clouddns, digitalocean, coredns, gossip)") flags.StringVar(&gossipListen, "gossip-listen", "0.0.0.0:3998", "The address on which to listen if gossip is enabled") flags.StringVar(&gossipSecret, "gossip-secret", gossipSecret, "Secret to use to secure gossip") flags.StringVar(&watchNamespace, "watch-namespace", "", "Limits the functionality for pods, services and ingress to specific namespace, by default all") diff --git a/pkg/resources/digitalocean/cloud.go b/pkg/resources/digitalocean/cloud.go index 2587c8aacd..e3b694e20a 100644 --- a/pkg/resources/digitalocean/cloud.go +++ b/pkg/resources/digitalocean/cloud.go @@ -18,14 +18,13 @@ package digitalocean import ( "errors" + "fmt" "os" "github.com/digitalocean/godo" "github.com/golang/glog" "golang.org/x/oauth2" - "fmt" - "k8s.io/api/core/v1" "k8s.io/kops/dnsprovider/pkg/dnsprovider" "k8s.io/kops/pkg/apis/kops" diff --git a/pkg/resources/digitalocean/dns/BUILD.bazel b/pkg/resources/digitalocean/dns/BUILD.bazel index daf3189106..a61985a2d6 100644 --- a/pkg/resources/digitalocean/dns/BUILD.bazel +++ b/pkg/resources/digitalocean/dns/BUILD.bazel @@ -11,6 +11,7 @@ go_library( "//vendor/github.com/digitalocean/godo:go_default_library", "//vendor/github.com/digitalocean/godo/context:go_default_library", "//vendor/github.com/golang/glog:go_default_library", + "//vendor/golang.org/x/oauth2:go_default_library", ], ) diff --git a/pkg/resources/digitalocean/dns/dns.go b/pkg/resources/digitalocean/dns/dns.go index f608d323e7..779b669b2a 100644 --- a/pkg/resources/digitalocean/dns/dns.go +++ b/pkg/resources/digitalocean/dns/dns.go @@ -17,18 +17,64 @@ limitations under the License. package dns import ( + "errors" "fmt" + "io" + "os" "github.com/digitalocean/godo" "github.com/digitalocean/godo/context" "github.com/golang/glog" + "golang.org/x/oauth2" + "k8s.io/kops/dnsprovider/pkg/dnsprovider" "k8s.io/kops/dnsprovider/pkg/dnsprovider/rrstype" ) -const ipPlaceholder = "203.0.113.123" +const ( + ipPlaceholder = "203.0.113.123" + providerName = "digitalocean" +) + +func init() { + dnsprovider.RegisterDnsProvider(providerName, func(config io.Reader) (dnsprovider.Interface, error) { + client, err := newClient() + if err != nil { + return nil, err + } + + return NewProvider(client), nil + }) +} + +// TokenSource implements oauth2.TokenSource +type TokenSource struct { + AccessToken string +} + +// Token() returns oauth2.Token +func (t *TokenSource) Token() (*oauth2.Token, error) { + token := &oauth2.Token{ + AccessToken: t.AccessToken, + } + return token, nil +} + +func newClient() (*godo.Client, error) { + accessToken := os.Getenv("DO_ACCESS_TOKEN") + if accessToken == "" { + return nil, errors.New("DO_ACCESS_TOKEN is required") + } + + tokenSource := &TokenSource{ + AccessToken: accessToken, + } + + oauthClient := oauth2.NewClient(oauth2.NoContext, tokenSource) + return godo.NewClient(oauthClient), nil +} // DNS implements dnsprovider.Interface type DNS struct {