* 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>
55 lines
1.7 KiB
Go
55 lines
1.7 KiB
Go
package kubernetes
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
|
|
"github.com/coredns/coredns/plugin"
|
|
"github.com/coredns/coredns/plugin/etcd/msg"
|
|
"github.com/coredns/coredns/plugin/pkg/dnsutil"
|
|
"github.com/coredns/coredns/request"
|
|
)
|
|
|
|
// Reverse implements the ServiceBackend interface.
|
|
func (k *Kubernetes) Reverse(ctx context.Context, state request.Request, exact bool, opt plugin.Options) ([]msg.Service, error) {
|
|
|
|
ip := dnsutil.ExtractAddressFromReverse(state.Name())
|
|
if ip == "" {
|
|
_, e := k.Records(ctx, state, exact)
|
|
return nil, e
|
|
}
|
|
|
|
records := k.serviceRecordForIP(ip, state.Name())
|
|
if len(records) == 0 {
|
|
return records, errNoItems
|
|
}
|
|
return records, nil
|
|
}
|
|
|
|
// serviceRecordForIP gets a service record with a cluster ip matching the ip argument
|
|
// If a service cluster ip does not match, it checks all endpoints
|
|
func (k *Kubernetes) serviceRecordForIP(ip, name string) []msg.Service {
|
|
// First check services with cluster ips
|
|
for _, service := range k.APIConn.SvcIndexReverse(ip) {
|
|
if len(k.Namespaces) > 0 && !k.namespaceExposed(service.Namespace) {
|
|
continue
|
|
}
|
|
domain := strings.Join([]string{service.Name, service.Namespace, Svc, k.primaryZone()}, ".")
|
|
return []msg.Service{{Host: domain, TTL: k.ttl}}
|
|
}
|
|
// If no cluster ips match, search endpoints
|
|
for _, ep := range k.APIConn.EpIndexReverse(ip) {
|
|
if len(k.Namespaces) > 0 && !k.namespaceExposed(ep.Namespace) {
|
|
continue
|
|
}
|
|
for _, eps := range ep.Subsets {
|
|
for _, addr := range eps.Addresses {
|
|
if addr.IP == ip {
|
|
domain := strings.Join([]string{endpointHostname(addr, k.endpointNameMode), ep.Name, ep.Namespace, Svc, k.primaryZone()}, ".")
|
|
return []msg.Service{{Host: domain, TTL: k.ttl}}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|