aboutsummaryrefslogtreecommitdiff
path: root/middleware/kubernetes/federation.go
diff options
context:
space:
mode:
Diffstat (limited to 'middleware/kubernetes/federation.go')
-rw-r--r--middleware/kubernetes/federation.go43
1 files changed, 43 insertions, 0 deletions
diff --git a/middleware/kubernetes/federation.go b/middleware/kubernetes/federation.go
new file mode 100644
index 000000000..90f1cca39
--- /dev/null
+++ b/middleware/kubernetes/federation.go
@@ -0,0 +1,43 @@
+package kubernetes
+
+import (
+ "strings"
+
+ "github.com/coredns/coredns/middleware/etcd/msg"
+ "github.com/coredns/coredns/request"
+)
+
+// The federation node.Labels keys used.
+const (
+ // TODO: Do not hardcode these labels. Pull them out of the API instead.
+ //
+ // We can get them via ....
+ // import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ // metav1.LabelZoneFailureDomain
+ // metav1.LabelZoneRegion
+ //
+ // But importing above breaks coredns with flag collision of 'log_dir'
+
+ LabelZone = "failure-domain.beta.kubernetes.io/zone"
+ LabelRegion = "failure-domain.beta.kubernetes.io/region"
+)
+
+// Federations is used from the federations middleware to return the service that should be
+// returned as a CNAME for federation(s) to work.
+func (k *Kubernetes) Federations(state request.Request, fname, fzone string) (msg.Service, error) {
+ nodeName := k.localNodeName()
+ node, err := k.APIConn.GetNodeByName(nodeName)
+ if err != nil {
+ return msg.Service{}, err
+ }
+ r, err := k.parseRequest(state)
+
+ lz := node.Labels[LabelZone]
+ lr := node.Labels[LabelRegion]
+
+ if r.endpoint == "" {
+ return msg.Service{Host: strings.Join([]string{r.service, r.namespace, fname, r.podOrSvc, lz, lr, fzone}, ".")}, nil
+ }
+
+ return msg.Service{Host: strings.Join([]string{r.endpoint, r.service, r.namespace, fname, r.podOrSvc, lz, lr, fzone}, ".")}, nil
+}