Return NXDOMAIN when no items match query (#422)

* When no records match, reply with NXDOMAIN

* Implement in IsNameError

* case for unexposed namespace. k8s integation tests

* Fix imports order. Lower case of err strs.
This commit is contained in:
Chris O'Haver 2016-11-10 16:24:06 -05:00 committed by Miek Gieben
parent 4036c3c319
commit 96206cdbc3
2 changed files with 167 additions and 129 deletions

View file

@ -44,6 +44,9 @@ type Kubernetes struct {
Selector *labels.Selector
}
var noItemsErr = errors.New("no items found")
var nsUnexposedErr = errors.New("namespace is not exposed")
// Services implements the ServiceBackend interface.
func (k *Kubernetes) Services(state request.Request, exact bool, opt middleware.Options) ([]msg.Service, []msg.Service, error) {
s, e := k.Records(state.Name(), exact)
@ -67,9 +70,8 @@ func (k *Kubernetes) Lookup(state request.Request, name string, typ uint16) (*dn
}
// IsNameError implements the ServiceBackend interface.
// TODO(infoblox): implement!
func (k *Kubernetes) IsNameError(err error) bool {
return false
return err == noItemsErr || err == nsUnexposedErr
}
// Debug implements the ServiceBackend interface.
@ -200,16 +202,16 @@ func (k *Kubernetes) Records(name string, exact bool) ([]msg.Service, error) {
// Abort if the namespace does not contain a wildcard, and namespace is not published per CoreFile
// Case where namespace contains a wildcard is handled in Get(...) method.
if (!nsWildcard) && (len(k.Namespaces) > 0) && (!dnsstrings.StringInSlice(namespace, k.Namespaces)) {
return nil, nil
return nil, nsUnexposedErr
}
k8sItems, err := k.Get(namespace, nsWildcard, serviceName, serviceWildcard, typeName)
if err != nil {
return nil, err
}
if k8sItems == nil {
if len(k8sItems) == 0 {
// Did not find item in k8s
return nil, nil
return nil, noItemsErr
}
records := k.getRecordsForServiceItems(k8sItems, zone)