aboutsummaryrefslogtreecommitdiff
path: root/middleware/kubernetes/kubernetes.go
diff options
context:
space:
mode:
Diffstat (limited to 'middleware/kubernetes/kubernetes.go')
-rw-r--r--middleware/kubernetes/kubernetes.go60
1 files changed, 40 insertions, 20 deletions
diff --git a/middleware/kubernetes/kubernetes.go b/middleware/kubernetes/kubernetes.go
index ee46f4632..43d98e079 100644
--- a/middleware/kubernetes/kubernetes.go
+++ b/middleware/kubernetes/kubernetes.go
@@ -3,6 +3,7 @@ package kubernetes
import (
"errors"
+ "fmt"
"log"
"strings"
"time"
@@ -11,8 +12,9 @@ import (
"github.com/miekg/coredns/middleware/etcd/msg"
"github.com/miekg/coredns/middleware/kubernetes/nametemplate"
"github.com/miekg/coredns/middleware/pkg/dnsutil"
- dns_strings "github.com/miekg/coredns/middleware/pkg/strings"
+ dnsstrings "github.com/miekg/coredns/middleware/pkg/strings"
"github.com/miekg/coredns/middleware/proxy"
+ "github.com/miekg/coredns/request"
"github.com/miekg/dns"
"k8s.io/kubernetes/pkg/api"
@@ -41,6 +43,28 @@ type Kubernetes struct {
Selector *labels.Selector
}
+// 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)
+ return s, nil, e // Haven't implemented debug queries yet.
+}
+
+// Lookup implements the ServiceBackend interface.
+func (k *Kubernetes) Lookup(state request.Request, name string, typ uint16) (*dns.Msg, error) {
+ return k.Proxy.Lookup(state, name, typ)
+}
+
+// IsNameError implements the ServiceBackend interface.
+// TODO(infoblox): implement!
+func (k *Kubernetes) IsNameError(err error) bool {
+ return false
+}
+
+// Debug implements the ServiceBackend interface.
+func (k *Kubernetes) Debug() string {
+ return "debug"
+}
+
func (k *Kubernetes) getClientConfig() (*restclient.Config, error) {
// For a custom api server or running outside a k8s cluster
// set URL in env.KUBERNETES_MASTER or set endpoint in Corefile
@@ -73,7 +97,6 @@ func (k *Kubernetes) getClientConfig() (*restclient.Config, error) {
}
// InitKubeCache initializes a new Kubernetes cache.
-// TODO(miek): is this correct?
func (k *Kubernetes) InitKubeCache() error {
config, err := k.getClientConfig()
@@ -83,21 +106,24 @@ func (k *Kubernetes) InitKubeCache() error {
kubeClient, err := clientset_generated.NewForConfig(config)
if err != nil {
- log.Printf("[ERROR] Failed to create kubernetes notification controller: %v", err)
- return err
+ return fmt.Errorf("Failed to create kubernetes notification controller: %v", err)
}
- if k.LabelSelector == nil {
- log.Printf("[INFO] Kubernetes middleware configured without a label selector. No label-based filtering will be performed.")
- } else {
+
+ if k.LabelSelector != nil {
var selector labels.Selector
selector, err = unversionedapi.LabelSelectorAsSelector(k.LabelSelector)
k.Selector = &selector
if err != nil {
- log.Printf("[ERROR] Unable to create Selector for LabelSelector '%s'.Error was: %s", k.LabelSelector, err)
- return err
+ return fmt.Errorf("Unable to create Selector for LabelSelector '%s'.Error was: %s", k.LabelSelector, err)
}
+ }
+
+ if k.LabelSelector == nil {
+ log.Printf("[INFO] Kubernetes middleware configured without a label selector. No label-based filtering will be performed.")
+ } else {
log.Printf("[INFO] Kubernetes middleware configured with the label selector '%s'. Only kubernetes objects matching this label selector will be exposed.", unversionedapi.FormatLabelSelector(k.LabelSelector))
}
+
k.APIConn = newdnsController(kubeClient, k.ResyncPeriod, k.Selector)
return err
@@ -125,12 +151,11 @@ func (k *Kubernetes) getZoneForName(name string) (string, []string) {
return zone, serviceSegments
}
-// Records looks up services in kubernetes.
-// If exact is true, it will lookup just
-// this name. This is used when find matches when completing SRV lookups
+// Records looks up services in kubernetes. If exact is true, it will lookup
+// just this name. This is used when find matches when completing SRV lookups
// for instance.
func (k *Kubernetes) Records(name string, exact bool) ([]msg.Service, error) {
- // TODO: refector this.
+ // TODO: refactor this.
// Right now NamespaceFromSegmentArray do not supports PRE queries
ip := dnsutil.ExtractAddressFromReverse(name)
if ip != "" {
@@ -169,7 +194,7 @@ 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) && (!dns_strings.StringInSlice(namespace, k.Namespaces)) {
+ if (!nsWildcard) && (len(k.Namespaces) > 0) && (!dnsstrings.StringInSlice(namespace, k.Namespaces)) {
return nil, nil
}
@@ -219,7 +244,7 @@ func (k *Kubernetes) Get(namespace string, nsWildcard bool, servicename string,
if symbolMatches(namespace, item.Namespace, nsWildcard) && symbolMatches(servicename, item.Name, serviceWildcard) {
// If namespace has a wildcard, filter results against Corefile namespace list.
// (Namespaces without a wildcard were filtered before the call to this function.)
- if nsWildcard && (len(k.Namespaces) > 0) && (!dns_strings.StringInSlice(item.Namespace, k.Namespaces)) {
+ if nsWildcard && (len(k.Namespaces) > 0) && (!dnsstrings.StringInSlice(item.Namespace, k.Namespaces)) {
continue
}
resultItems = append(resultItems, item)
@@ -242,11 +267,6 @@ func symbolMatches(queryString string, candidateString string, wildcard bool) bo
return result
}
-// kubernetesNameError checks if the error is ErrorCodeKeyNotFound from kubernetes.
-func isKubernetesNameError(err error) bool {
- return false
-}
-
func (k *Kubernetes) getServiceRecordForIP(ip, name string) []msg.Service {
svcList, err := k.APIConn.svcLister.List(labels.Everything())
if err != nil {