* Remove context.Context from request.Request This removes the context from request.Request and makes all the changes in the code to make it compile again. It's all mechanical. It did unearth some weirdness in that the context was kept in handler structs which may cause havoc with concurrently handling of requests. Fixes #2721 Signed-off-by: Miek Gieben <miek@miek.nl> * Make test compile Signed-off-by: Miek Gieben <miek@miek.nl>
130 lines
2.9 KiB
Go
130 lines
2.9 KiB
Go
package etcd
|
|
|
|
import (
|
|
"crypto/tls"
|
|
|
|
"github.com/coredns/coredns/core/dnsserver"
|
|
"github.com/coredns/coredns/plugin"
|
|
clog "github.com/coredns/coredns/plugin/pkg/log"
|
|
mwtls "github.com/coredns/coredns/plugin/pkg/tls"
|
|
"github.com/coredns/coredns/plugin/pkg/upstream"
|
|
|
|
etcdcv3 "github.com/coreos/etcd/clientv3"
|
|
"github.com/mholt/caddy"
|
|
)
|
|
|
|
var log = clog.NewWithPlugin("etcd")
|
|
|
|
func init() {
|
|
caddy.RegisterPlugin("etcd", caddy.Plugin{
|
|
ServerType: "dns",
|
|
Action: setup,
|
|
})
|
|
}
|
|
|
|
func setup(c *caddy.Controller) error {
|
|
e, err := etcdParse(c)
|
|
if err != nil {
|
|
return plugin.Error("etcd", err)
|
|
}
|
|
|
|
dnsserver.GetConfig(c).AddPlugin(func(next plugin.Handler) plugin.Handler {
|
|
e.Next = next
|
|
return e
|
|
})
|
|
|
|
return nil
|
|
}
|
|
|
|
func etcdParse(c *caddy.Controller) (*Etcd, error) {
|
|
etc := Etcd{PathPrefix: "skydns"}
|
|
var (
|
|
tlsConfig *tls.Config
|
|
err error
|
|
endpoints = []string{defaultEndpoint}
|
|
username string
|
|
password string
|
|
)
|
|
for c.Next() {
|
|
etc.Zones = c.RemainingArgs()
|
|
if len(etc.Zones) == 0 {
|
|
etc.Zones = make([]string, len(c.ServerBlockKeys))
|
|
copy(etc.Zones, c.ServerBlockKeys)
|
|
}
|
|
for i, str := range etc.Zones {
|
|
etc.Zones[i] = plugin.Host(str).Normalize()
|
|
}
|
|
|
|
for c.NextBlock() {
|
|
switch c.Val() {
|
|
case "stubzones":
|
|
// ignored, remove later.
|
|
case "fallthrough":
|
|
etc.Fall.SetZonesFromArgs(c.RemainingArgs())
|
|
case "debug":
|
|
/* it is a noop now */
|
|
case "path":
|
|
if !c.NextArg() {
|
|
return &Etcd{}, c.ArgErr()
|
|
}
|
|
etc.PathPrefix = c.Val()
|
|
case "endpoint":
|
|
args := c.RemainingArgs()
|
|
if len(args) == 0 {
|
|
return &Etcd{}, c.ArgErr()
|
|
}
|
|
endpoints = args
|
|
case "upstream":
|
|
// check args != 0 and error in the future
|
|
c.RemainingArgs() // clear buffer
|
|
etc.Upstream = upstream.New()
|
|
case "tls": // cert key cacertfile
|
|
args := c.RemainingArgs()
|
|
tlsConfig, err = mwtls.NewTLSConfigFromArgs(args...)
|
|
if err != nil {
|
|
return &Etcd{}, err
|
|
}
|
|
case "credentials":
|
|
args := c.RemainingArgs()
|
|
if len(args) == 0 {
|
|
return &Etcd{}, c.ArgErr()
|
|
}
|
|
if len(args) != 2 {
|
|
return &Etcd{}, c.Errf("credentials requires 2 arguments, username and password")
|
|
}
|
|
username, password = args[0], args[1]
|
|
default:
|
|
if c.Val() != "}" {
|
|
return &Etcd{}, c.Errf("unknown property '%s'", c.Val())
|
|
}
|
|
}
|
|
}
|
|
client, err := newEtcdClient(endpoints, tlsConfig, username, password)
|
|
if err != nil {
|
|
return &Etcd{}, err
|
|
}
|
|
etc.Client = client
|
|
etc.endpoints = endpoints
|
|
|
|
return &etc, nil
|
|
}
|
|
return &Etcd{}, nil
|
|
}
|
|
|
|
func newEtcdClient(endpoints []string, cc *tls.Config, username, password string) (*etcdcv3.Client, error) {
|
|
etcdCfg := etcdcv3.Config{
|
|
Endpoints: endpoints,
|
|
TLS: cc,
|
|
}
|
|
if username != "" && password != "" {
|
|
etcdCfg.Username = username
|
|
etcdCfg.Password = password
|
|
}
|
|
cli, err := etcdcv3.New(etcdCfg)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return cli, nil
|
|
}
|
|
|
|
const defaultEndpoint = "http://localhost:2379"
|