mirror of
https://github.com/coredns/coredns.git
synced 2025-10-27 08:14:18 -04:00
plugin/view: Advanced routing interface and new 'view' plugin (#5538)
* introduce new interface "dnsserver.Viewer", that allows a plugin implementing it to decide if a query should be routed into its server block. * add new plugin "view", that uses the new interface to enable a user to define expression based conditions that must be met for a query to be routed to its server block. Signed-off-by: Chris O'Haver <cohaver@infoblox.com>
This commit is contained in:
@@ -27,17 +27,18 @@ func ContextWithMetadata(ctx context.Context) context.Context {
|
||||
|
||||
// ServeDNS implements the plugin.Handler interface.
|
||||
func (m *Metadata) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
|
||||
ctx = ContextWithMetadata(ctx)
|
||||
rcode, err := plugin.NextOrFailure(m.Name(), m.Next, ctx, w, r)
|
||||
return rcode, err
|
||||
}
|
||||
|
||||
state := request.Request{W: w, Req: r}
|
||||
// Collect will retrieve metadata functions from each metadata provider and update the context
|
||||
func (m *Metadata) Collect(ctx context.Context, state request.Request) context.Context {
|
||||
ctx = ContextWithMetadata(ctx)
|
||||
if plugin.Zones(m.Zones).Matches(state.Name()) != "" {
|
||||
// Go through all Providers and collect metadata.
|
||||
for _, p := range m.Providers {
|
||||
ctx = p.Metadata(ctx, state)
|
||||
}
|
||||
}
|
||||
|
||||
rcode, err := plugin.NextOrFailure(m.Name(), m.Next, ctx, w, r)
|
||||
|
||||
return rcode, err
|
||||
return ctx
|
||||
}
|
||||
|
||||
@@ -47,7 +47,10 @@ func TestMetadataServeDNS(t *testing.T) {
|
||||
}
|
||||
|
||||
ctx := context.TODO()
|
||||
m.ServeDNS(ctx, &test.ResponseWriter{}, new(dns.Msg))
|
||||
w := &test.ResponseWriter{}
|
||||
r := new(dns.Msg)
|
||||
ctx = m.Collect(ctx, request.Request{W: w, Req: r})
|
||||
m.ServeDNS(ctx, w, r)
|
||||
nctx := next.ctx
|
||||
|
||||
for _, expected := range expectedMetadata {
|
||||
|
||||
Reference in New Issue
Block a user