diff options
author | 2018-12-14 09:41:51 +0000 | |
---|---|---|
committer | 2018-12-14 09:41:51 +0000 | |
commit | c1c98924c3733b853115c62adc1a2b5978ae2df3 (patch) | |
tree | 6006978128c2ffd02eb9c5eaaeb16993f38f205b /plugin/k8s_external/setup.go | |
parent | d9880681c3b28f8506e2a5b15bbc404b2a155b00 (diff) | |
download | coredns-c1c98924c3733b853115c62adc1a2b5978ae2df3.tar.gz coredns-c1c98924c3733b853115c62adc1a2b5978ae2df3.tar.zst coredns-c1c98924c3733b853115c62adc1a2b5978ae2df3.zip |
Add new plugin: external - resolve k8s ingress and LB address with external names (#2379)
* Add new plugin: external
This plugin works in conjunction with the kubernetes plugin and exports
ingress and LB addresses as DNS records. It bypasses backend.go and
backend_lookup.go flow because it is not needed.
README, tests are implemented. The tests only exercise the unit tests,
this has not been tested in any ci.
Signed-off-by: Miek Gieben <miek@miek.nl>
* Rename to k8s_external
Signed-off-by: Miek Gieben <miek@miek.nl>
* go gen
Signed-off-by: Miek Gieben <miek@miek.nl>
Diffstat (limited to 'plugin/k8s_external/setup.go')
-rw-r--r-- | plugin/k8s_external/setup.go | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/plugin/k8s_external/setup.go b/plugin/k8s_external/setup.go new file mode 100644 index 000000000..ede34c6ce --- /dev/null +++ b/plugin/k8s_external/setup.go @@ -0,0 +1,86 @@ +package external + +import ( + "strconv" + + "github.com/coredns/coredns/core/dnsserver" + "github.com/coredns/coredns/plugin" + + "github.com/mholt/caddy" +) + +func init() { + caddy.RegisterPlugin("k8s_external", caddy.Plugin{ + ServerType: "dns", + Action: setup, + }) +} + +func setup(c *caddy.Controller) error { + e, err := parse(c) + if err != nil { + return plugin.Error("k8s_external", err) + } + + // Do this in OnStartup, so all plugins have been initialized. + c.OnStartup(func() error { + m := dnsserver.GetConfig(c).Handler("kubernetes") + if m == nil { + return nil + } + if x, ok := m.(Externaler); ok { + e.externalFunc = x.External + e.externalAddrFunc = x.ExternalAddress + } + return nil + }) + + dnsserver.GetConfig(c).AddPlugin(func(next plugin.Handler) plugin.Handler { + e.Next = next + return e + }) + + return nil +} + +func parse(c *caddy.Controller) (*External, error) { + e := New() + + for c.Next() { // external + zones := c.RemainingArgs() + e.Zones = zones + if len(zones) == 0 { + e.Zones = make([]string, len(c.ServerBlockKeys)) + copy(e.Zones, c.ServerBlockKeys) + } + for i, str := range e.Zones { + e.Zones[i] = plugin.Host(str).Normalize() + } + for c.NextBlock() { + switch c.Val() { + case "ttl": + args := c.RemainingArgs() + if len(args) == 0 { + return nil, c.ArgErr() + } + t, err := strconv.Atoi(args[0]) + if err != nil { + return nil, err + } + if t < 0 || t > 3600 { + return nil, c.Errf("ttl must be in range [0, 3600]: %d", t) + } + e.ttl = uint32(t) + case "apex": + args := c.RemainingArgs() + if len(args) == 0 { + return nil, c.ArgErr() + } + e.apex = args[0] + default: + return nil, c.Errf("unknown property '%s'", c.Val()) + } + } + } + return e, nil +} |