diff options
author | 2022-02-09 09:25:10 -0500 | |
---|---|---|
committer | 2022-02-09 09:25:10 -0500 | |
commit | abaf938623eaae632afd8548ebf5fdc5c3197c5a (patch) | |
tree | cc3f4f795c779ba9aa993577c1e1d1bb69b2c4bc /plugin/kubernetes/kubernetes.go | |
parent | 40a526b27ff15291d6ae4a4e5c199ef292210a89 (diff) | |
download | coredns-abaf938623eaae632afd8548ebf5fdc5c3197c5a.tar.gz coredns-abaf938623eaae632afd8548ebf5fdc5c3197c5a.tar.zst coredns-abaf938623eaae632afd8548ebf5fdc5c3197c5a.zip |
remove wildcard query functionality (#5019)
Signed-off-by: Chris O'Haver <cohaver@infoblox.com>
Diffstat (limited to 'plugin/kubernetes/kubernetes.go')
-rw-r--r-- | plugin/kubernetes/kubernetes.go | 66 |
1 files changed, 17 insertions, 49 deletions
diff --git a/plugin/kubernetes/kubernetes.go b/plugin/kubernetes/kubernetes.go index ad7453351..67d549329 100644 --- a/plugin/kubernetes/kubernetes.go +++ b/plugin/kubernetes/kubernetes.go @@ -360,7 +360,7 @@ func (k *Kubernetes) Records(ctx context.Context, state request.Request, exact b return nil, errNoItems } - if !wildcard(r.namespace) && !k.namespaceExposed(r.namespace) { + if !k.namespaceExposed(r.namespace) { return nil, errNsNotExposed } @@ -395,7 +395,7 @@ func (k *Kubernetes) findPods(r recordRequest, zone string) (pods []msg.Service, } namespace := r.namespace - if !wildcard(namespace) && !k.namespaceExposed(namespace) { + if !k.namespaceExposed(namespace) { return nil, errNoItems } @@ -403,7 +403,7 @@ func (k *Kubernetes) findPods(r recordRequest, zone string) (pods []msg.Service, // handle empty pod name if podname == "" { - if k.namespaceExposed(namespace) || wildcard(namespace) { + if k.namespaceExposed(namespace) { // NODATA return nil, nil } @@ -420,7 +420,7 @@ func (k *Kubernetes) findPods(r recordRequest, zone string) (pods []msg.Service, } if k.podMode == podModeInsecure { - if !wildcard(namespace) && !k.namespaceExposed(namespace) { // no wildcard, but namespace does not exist + if !k.namespaceExposed(namespace) { // namespace does not exist return nil, errNoItems } @@ -434,19 +434,8 @@ func (k *Kubernetes) findPods(r recordRequest, zone string) (pods []msg.Service, // PodModeVerified err = errNoItems - if wildcard(podname) && !wildcard(namespace) { - // If namespace exists, err should be nil, so that we return NODATA instead of NXDOMAIN - if k.namespaceExposed(namespace) { - err = nil - } - } for _, p := range k.APIConn.PodIndex(ip) { - // If namespace has a wildcard, filter results against Corefile namespace list. - if wildcard(namespace) && !k.namespaceExposed(p.Namespace) { - continue - } - // check for matching ip and namespace if ip == p.PodIP && match(namespace, p.Namespace) { s := msg.Service{Key: strings.Join([]string{zonePath, Pod, namespace, podname}, "/"), Host: ip, TTL: k.ttl} @@ -460,13 +449,13 @@ func (k *Kubernetes) findPods(r recordRequest, zone string) (pods []msg.Service, // findServices returns the services matching r from the cache. func (k *Kubernetes) findServices(r recordRequest, zone string) (services []msg.Service, err error) { - if !wildcard(r.namespace) && !k.namespaceExposed(r.namespace) { + if !k.namespaceExposed(r.namespace) { return nil, errNoItems } // handle empty service name if r.service == "" { - if k.namespaceExposed(r.namespace) || wildcard(r.namespace) { + if k.namespaceExposed(r.namespace) { // NODATA return nil, nil } @@ -475,12 +464,6 @@ func (k *Kubernetes) findServices(r recordRequest, zone string) (services []msg. } err = errNoItems - if wildcard(r.service) && !wildcard(r.namespace) { - // If namespace exists, err should be nil, so that we return NODATA instead of NXDOMAIN - if k.namespaceExposed(r.namespace) { - err = nil - } - } var ( endpointsListFunc func() []*object.Endpoints @@ -488,14 +471,11 @@ func (k *Kubernetes) findServices(r recordRequest, zone string) (services []msg. serviceList []*object.Service ) - if wildcard(r.service) || wildcard(r.namespace) { - serviceList = k.APIConn.ServiceList() - endpointsListFunc = func() []*object.Endpoints { return k.APIConn.EndpointsList() } - } else { - idx := object.ServiceKey(r.service, r.namespace) - serviceList = k.APIConn.SvcIndex(idx) - endpointsListFunc = func() []*object.Endpoints { return k.APIConn.EpIndex(idx) } - } + + idx := object.ServiceKey(r.service, r.namespace) + serviceList = k.APIConn.SvcIndex(idx) + endpointsListFunc = func() []*object.Endpoints { return k.APIConn.EpIndex(idx) } + zonePath := msg.Path(zone, coredns) for _, svc := range serviceList { @@ -503,12 +483,6 @@ func (k *Kubernetes) findServices(r recordRequest, zone string) (services []msg. continue } - // If request namespace is a wildcard, filter results against Corefile namespace list. - // (Namespaces without a wildcard were filtered before the call to this function.) - if wildcard(r.namespace) && !k.namespaceExposed(svc.Namespace) { - continue - } - // If "ignore empty_service" option is set and no endpoints exist, return NXDOMAIN unless // it's a headless or externalName service (covered below). if k.opts.ignoreEmptyService && svc.Type != api.ServiceTypeExternalName && !svc.Headless() { // serve NXDOMAIN if no endpoint is able to answer @@ -558,7 +532,7 @@ func (k *Kubernetes) findServices(r recordRequest, zone string) (services []msg. } for _, p := range eps.Ports { - if !(match(r.port, p.Name) && match(r.protocol, p.Protocol)) { + if !(matchPortAndProtocol(r.port, p.Name, r.protocol, p.Protocol)) { continue } s := msg.Service{Host: addr.IP, Port: int(p.Port), TTL: k.ttl} @@ -576,7 +550,7 @@ func (k *Kubernetes) findServices(r recordRequest, zone string) (services []msg. // ClusterIP service for _, p := range svc.Ports { - if !(match(r.port, p.Name) && match(r.protocol, string(p.Protocol))) { + if !(matchPortAndProtocol(r.port, p.Name, r.protocol, string(p.Protocol))) { continue } @@ -598,20 +572,14 @@ func (k *Kubernetes) Serial(state request.Request) uint32 { return uint32(k.APIC // MinTTL returns the minimal TTL. func (k *Kubernetes) MinTTL(state request.Request) uint32 { return k.ttl } -// match checks if a and b are equal taking wildcards into account. +// match checks if a and b are equal. func match(a, b string) bool { - if wildcard(a) { - return true - } - if wildcard(b) { - return true - } return strings.EqualFold(a, b) } -// wildcard checks whether s contains a wildcard value defined as "*" or "any". -func wildcard(s string) bool { - return s == "*" || s == "any" +// matchPortAndProtocol matches port and protocol, permitting the the 'a' inputs to be wild +func matchPortAndProtocol(aPort, bPort, aProtocol, bProtocol string) bool { + return (match(aPort, bPort) || aPort == "") && (match(aProtocol, bProtocol) || aProtocol == "") } const coredns = "c" // used as a fake key prefix in msg.Service |