diff options
Diffstat (limited to 'plugin/azure/setup.go')
-rw-r--r-- | plugin/azure/setup.go | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/plugin/azure/setup.go b/plugin/azure/setup.go new file mode 100644 index 000000000..1ac0cc723 --- /dev/null +++ b/plugin/azure/setup.go @@ -0,0 +1,123 @@ +package azure + +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" + + azuredns "github.com/Azure/azure-sdk-for-go/profiles/latest/dns/mgmt/dns" + azurerest "github.com/Azure/go-autorest/autorest/azure" + "github.com/Azure/go-autorest/autorest/azure/auth" + "github.com/caddyserver/caddy" +) + +var log = clog.NewWithPlugin("azure") + +func init() { + caddy.RegisterPlugin("azure", caddy.Plugin{ + ServerType: "dns", + Action: setup, + }) +} + +func setup(c *caddy.Controller) error { + env, keys, fall, err := parse(c) + if err != nil { + return plugin.Error("azure", err) + } + ctx := context.Background() + dnsClient := azuredns.NewRecordSetsClient(env.Values[auth.SubscriptionID]) + dnsClient.Authorizer, err = env.GetAuthorizer() + if err != nil { + return c.Errf("failed to create azure plugin: %v", err) + } + h, err := New(ctx, dnsClient, keys, upstream.New()) + if err != nil { + return c.Errf("failed to initialize azure plugin: %v", err) + } + h.Fall = fall + if err := h.Run(ctx); err != nil { + return c.Errf("failed to run azure plugin: %v", err) + } + dnsserver.GetConfig(c).AddPlugin(func(next plugin.Handler) plugin.Handler { + h.Next = next + return h + }) + return nil +} + +func parse(c *caddy.Controller) (auth.EnvironmentSettings, map[string][]string, fall.F, error) { + resourceGroupMapping := map[string][]string{} + resourceGroupSet := map[string]struct{}{} + var err error + var fall fall.F + + azureEnv := azurerest.PublicCloud + env := auth.EnvironmentSettings{Values: map[string]string{}} + + for c.Next() { + args := c.RemainingArgs() + + for i := 0; i < len(args); i++ { + parts := strings.SplitN(args[i], ":", 2) + if len(parts) != 2 { + return env, resourceGroupMapping, fall, c.Errf("invalid resource group / zone '%s'", args[i]) + } + resourceGroup, zoneName := parts[0], parts[1] + if resourceGroup == "" || zoneName == "" { + return env, resourceGroupMapping, fall, c.Errf("invalid resource group / zone '%s'", args[i]) + } + if _, ok := resourceGroupSet[args[i]]; ok { + return env, resourceGroupMapping, fall, c.Errf("conflict zone '%s'", args[i]) + } + + resourceGroupSet[args[i]] = struct{}{} + resourceGroupMapping[resourceGroup] = append(resourceGroupMapping[resourceGroup], zoneName) + } + for c.NextBlock() { + switch c.Val() { + case "subscription": + if !c.NextArg() { + return env, resourceGroupMapping, fall, c.ArgErr() + } + env.Values[auth.SubscriptionID] = c.Val() + case "tenant": + if !c.NextArg() { + return env, resourceGroupMapping, fall, c.ArgErr() + } + env.Values[auth.TenantID] = c.Val() + case "client": + if !c.NextArg() { + return env, resourceGroupMapping, fall, c.ArgErr() + } + env.Values[auth.ClientID] = c.Val() + case "secret": + if !c.NextArg() { + return env, resourceGroupMapping, fall, c.ArgErr() + } + env.Values[auth.ClientSecret] = c.Val() + case "environment": + if !c.NextArg() { + return env, resourceGroupMapping, fall, c.ArgErr() + } + env.Values[auth.ClientSecret] = c.Val() + azureEnv, err = azurerest.EnvironmentFromName(c.Val()) + if err != nil { + return env, resourceGroupMapping, fall, c.Errf("cannot set azure environment: %s", err.Error()) + } + case "fallthrough": + fall.SetZonesFromArgs(c.RemainingArgs()) + default: + return env, resourceGroupMapping, fall, c.Errf("unknown property '%s'", c.Val()) + } + } + } + env.Values[auth.Resource] = azureEnv.ResourceManagerEndpoint + env.Environment = azureEnv + return env, resourceGroupMapping, fall, nil +} |