dns-controller: support digitalocean

This commit is contained in:
andrewsykim 2018-02-24 13:48:43 -05:00
parent 418f616574
commit 662939e626
5 changed files with 54 additions and 4 deletions

View File

@ -12,6 +12,7 @@ go_library(
"//dnsprovider/pkg/dnsprovider/providers/aws/route53:go_default_library", "//dnsprovider/pkg/dnsprovider/providers/aws/route53:go_default_library",
"//dnsprovider/pkg/dnsprovider/providers/coredns:go_default_library", "//dnsprovider/pkg/dnsprovider/providers/coredns:go_default_library",
"//dnsprovider/pkg/dnsprovider/providers/google/clouddns: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:go_default_library",
"//protokube/pkg/gossip/dns:go_default_library", "//protokube/pkg/gossip/dns:go_default_library",
"//protokube/pkg/gossip/dns/provider:go_default_library", "//protokube/pkg/gossip/dns/provider:go_default_library",

View File

@ -26,14 +26,17 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"github.com/spf13/pflag" "github.com/spf13/pflag"
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest" "k8s.io/client-go/rest"
"k8s.io/kops/dns-controller/pkg/dns" "k8s.io/kops/dns-controller/pkg/dns"
"k8s.io/kops/dns-controller/pkg/watchers" "k8s.io/kops/dns-controller/pkg/watchers"
"k8s.io/kops/dnsprovider/pkg/dnsprovider" "k8s.io/kops/dnsprovider/pkg/dnsprovider"
_ "k8s.io/kops/dnsprovider/pkg/dnsprovider/providers/aws/route53" _ "k8s.io/kops/dnsprovider/pkg/dnsprovider/providers/aws/route53"
k8scoredns "k8s.io/kops/dnsprovider/pkg/dnsprovider/providers/coredns" k8scoredns "k8s.io/kops/dnsprovider/pkg/dnsprovider/providers/coredns"
_ "k8s.io/kops/dnsprovider/pkg/dnsprovider/providers/google/clouddns" _ "k8s.io/kops/dnsprovider/pkg/dnsprovider/providers/google/clouddns"
_ "k8s.io/kops/pkg/resources/digitalocean/dns"
"k8s.io/kops/protokube/pkg/gossip" "k8s.io/kops/protokube/pkg/gossip"
gossipdns "k8s.io/kops/protokube/pkg/gossip/dns" gossipdns "k8s.io/kops/protokube/pkg/gossip/dns"
gossipdnsprovider "k8s.io/kops/protokube/pkg/gossip/dns/provider" 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.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.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.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(&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(&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") flags.StringVar(&watchNamespace, "watch-namespace", "", "Limits the functionality for pods, services and ingress to specific namespace, by default all")

View File

@ -18,14 +18,13 @@ package digitalocean
import ( import (
"errors" "errors"
"fmt"
"os" "os"
"github.com/digitalocean/godo" "github.com/digitalocean/godo"
"github.com/golang/glog" "github.com/golang/glog"
"golang.org/x/oauth2" "golang.org/x/oauth2"
"fmt"
"k8s.io/api/core/v1" "k8s.io/api/core/v1"
"k8s.io/kops/dnsprovider/pkg/dnsprovider" "k8s.io/kops/dnsprovider/pkg/dnsprovider"
"k8s.io/kops/pkg/apis/kops" "k8s.io/kops/pkg/apis/kops"

View File

@ -11,6 +11,7 @@ go_library(
"//vendor/github.com/digitalocean/godo:go_default_library", "//vendor/github.com/digitalocean/godo:go_default_library",
"//vendor/github.com/digitalocean/godo/context:go_default_library", "//vendor/github.com/digitalocean/godo/context:go_default_library",
"//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/golang/glog:go_default_library",
"//vendor/golang.org/x/oauth2:go_default_library",
], ],
) )

View File

@ -17,18 +17,64 @@ limitations under the License.
package dns package dns
import ( import (
"errors"
"fmt" "fmt"
"io"
"os"
"github.com/digitalocean/godo" "github.com/digitalocean/godo"
"github.com/digitalocean/godo/context" "github.com/digitalocean/godo/context"
"github.com/golang/glog" "github.com/golang/glog"
"golang.org/x/oauth2"
"k8s.io/kops/dnsprovider/pkg/dnsprovider" "k8s.io/kops/dnsprovider/pkg/dnsprovider"
"k8s.io/kops/dnsprovider/pkg/dnsprovider/rrstype" "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 // DNS implements dnsprovider.Interface
type DNS struct { type DNS struct {