aboutsummaryrefslogtreecommitdiff
path: root/plugin/clouddns/setup.go
diff options
context:
space:
mode:
authorGravatar Palash Nigam <npalash25@gmail.com> 2019-08-18 02:29:09 +0530
committerGravatar Yong Tang <yong.tang.github@outlook.com> 2019-08-17 13:59:09 -0700
commit194b0f95b459a593deb6c2d1e048e020070a841a (patch)
tree3f8a6fed86cf61ffe62cafe3c9e8ee00238836fc /plugin/clouddns/setup.go
parentbde393096f76dc02752f71f9deff5934353e4eb8 (diff)
downloadcoredns-194b0f95b459a593deb6c2d1e048e020070a841a.tar.gz
coredns-194b0f95b459a593deb6c2d1e048e020070a841a.tar.zst
coredns-194b0f95b459a593deb6c2d1e048e020070a841a.zip
Add Google Cloud DNS plugin (#3011)
Signed-off-by: Palash Nigam <npalash25@gmail.com> Closes: #2822
Diffstat (limited to 'plugin/clouddns/setup.go')
-rw-r--r--plugin/clouddns/setup.go110
1 files changed, 110 insertions, 0 deletions
diff --git a/plugin/clouddns/setup.go b/plugin/clouddns/setup.go
new file mode 100644
index 000000000..732c240f7
--- /dev/null
+++ b/plugin/clouddns/setup.go
@@ -0,0 +1,110 @@
+package clouddns
+
+import (
+ "context"
+ "strings"
+
+ "github.com/coredns/coredns/core/dnsserver"
+ "github.com/coredns/coredns/plugin"
+ "github.com/coredns/coredns/plugin/pkg/fall"
+ clog "github.com/coredns/coredns/plugin/pkg/log"
+ "github.com/coredns/coredns/plugin/pkg/upstream"
+
+ "github.com/caddyserver/caddy"
+ gcp "google.golang.org/api/dns/v1"
+ "google.golang.org/api/option"
+)
+
+var log = clog.NewWithPlugin("clouddns")
+
+func init() {
+ caddy.RegisterPlugin("clouddns", caddy.Plugin{
+ ServerType: "dns",
+ Action: func(c *caddy.Controller) error {
+ f := func(ctx context.Context, opt option.ClientOption) (gcpDNS, error) {
+ var err error
+ var client *gcp.Service
+ if opt != nil {
+ client, err = gcp.NewService(ctx, opt)
+ } else {
+ // if credentials file is not provided in the Corefile
+ // authenticate the client using env variables
+ client, err = gcp.NewService(ctx)
+ }
+ return gcpClient{client}, err
+ }
+ return setup(c, f)
+ },
+ })
+}
+
+func setup(c *caddy.Controller, f func(ctx context.Context, opt option.ClientOption) (gcpDNS, error)) error {
+ for c.Next() {
+ keyPairs := map[string]struct{}{}
+ keys := map[string][]string{}
+
+ var fall fall.F
+ up := upstream.New()
+
+ args := c.RemainingArgs()
+
+ for i := 0; i < len(args); i++ {
+ parts := strings.SplitN(args[i], ":", 3)
+ if len(parts) != 3 {
+ return c.Errf("invalid zone '%s'", args[i])
+ }
+ dnsName, projectName, hostedZone := parts[0], parts[1], parts[2]
+ if dnsName == "" || projectName == "" || hostedZone == "" {
+ return c.Errf("invalid zone '%s'", args[i])
+ }
+ if _, ok := keyPairs[args[i]]; ok {
+ return c.Errf("conflict zone '%s'", args[i])
+ }
+
+ keyPairs[args[i]] = struct{}{}
+ keys[dnsName] = append(keys[dnsName], projectName+":"+hostedZone)
+ }
+
+ var opt option.ClientOption
+ for c.NextBlock() {
+ switch c.Val() {
+ case "upstream":
+ c.RemainingArgs() // eats args
+ // if filepath is provided in the Corefile use it to authenticate the dns client
+ case "credentials":
+ if c.NextArg() {
+ opt = option.WithCredentialsFile(c.Val())
+ } else {
+ return c.ArgErr()
+ }
+ case "fallthrough":
+ fall.SetZonesFromArgs(c.RemainingArgs())
+ default:
+ return c.Errf("unknown property '%s'", c.Val())
+ }
+ }
+
+ ctx := context.Background()
+ client, err := f(ctx, opt)
+ if err != nil {
+ return err
+ }
+
+ h, err := New(ctx, client, keys, up)
+ if err != nil {
+ return c.Errf("failed to create Cloud DNS plugin: %v", err)
+ }
+ h.Fall = fall
+
+ if err := h.Run(ctx); err != nil {
+ return c.Errf("failed to initialize Cloud DNS plugin: %v", err)
+ }
+
+ dnsserver.GetConfig(c).AddPlugin(func(next plugin.Handler) plugin.Handler {
+ h.Next = next
+ return h
+ })
+ }
+
+ return nil
+}