Commit 96206cdb authored by Chris O'Haver's avatar Chris O'Haver Committed by Miek Gieben

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.
parent 4036c3c3
...@@ -44,6 +44,9 @@ type Kubernetes struct { ...@@ -44,6 +44,9 @@ type Kubernetes struct {
Selector *labels.Selector Selector *labels.Selector
} }
var noItemsErr = errors.New("no items found")
var nsUnexposedErr = errors.New("namespace is not exposed")
// Services implements the ServiceBackend interface. // Services implements the ServiceBackend interface.
func (k *Kubernetes) Services(state request.Request, exact bool, opt middleware.Options) ([]msg.Service, []msg.Service, error) { func (k *Kubernetes) Services(state request.Request, exact bool, opt middleware.Options) ([]msg.Service, []msg.Service, error) {
s, e := k.Records(state.Name(), exact) s, e := k.Records(state.Name(), exact)
...@@ -67,9 +70,8 @@ func (k *Kubernetes) Lookup(state request.Request, name string, typ uint16) (*dn ...@@ -67,9 +70,8 @@ func (k *Kubernetes) Lookup(state request.Request, name string, typ uint16) (*dn
} }
// IsNameError implements the ServiceBackend interface. // IsNameError implements the ServiceBackend interface.
// TODO(infoblox): implement!
func (k *Kubernetes) IsNameError(err error) bool { func (k *Kubernetes) IsNameError(err error) bool {
return false return err == noItemsErr || err == nsUnexposedErr
} }
// Debug implements the ServiceBackend interface. // Debug implements the ServiceBackend interface.
...@@ -200,16 +202,16 @@ func (k *Kubernetes) Records(name string, exact bool) ([]msg.Service, error) { ...@@ -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 // 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. // Case where namespace contains a wildcard is handled in Get(...) method.
if (!nsWildcard) && (len(k.Namespaces) > 0) && (!dnsstrings.StringInSlice(namespace, k.Namespaces)) { 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) k8sItems, err := k.Get(namespace, nsWildcard, serviceName, serviceWildcard, typeName)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if k8sItems == nil { if len(k8sItems) == 0 {
// Did not find item in k8s // Did not find item in k8s
return nil, nil return nil, noItemsErr
} }
records := k.getRecordsForServiceItems(k8sItems, zone) records := k.getRecordsForServiceItems(k8sItems, zone)
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment