diff options
author | 2018-09-12 02:07:24 -0400 | |
---|---|---|
committer | 2018-09-12 07:07:24 +0100 | |
commit | 0bf8b81cb7a5894e7cb6336ac5a8f7510c92692d (patch) | |
tree | 6c837b36b2eb65133ac82d34399db35ba11903a5 | |
parent | b42eae7a04b8f789d7a20c0664895cd8e4638a22 (diff) | |
download | coredns-0bf8b81cb7a5894e7cb6336ac5a8f7510c92692d.tar.gz coredns-0bf8b81cb7a5894e7cb6336ac5a8f7510c92692d.tar.zst coredns-0bf8b81cb7a5894e7cb6336ac5a8f7510c92692d.zip |
plugin/federation: handle missing avail-zone/region labels better (#2092)
* handle missing avail-zone/region labels better
* oops forgot a file
-rw-r--r-- | plugin/federation/federation_test.go | 38 | ||||
-rw-r--r-- | plugin/federation/kubernetes_api_test.go | 10 | ||||
-rw-r--r-- | plugin/kubernetes/federation.go | 6 |
3 files changed, 49 insertions, 5 deletions
diff --git a/plugin/federation/federation_test.go b/plugin/federation/federation_test.go index 54a9c3505..864ef2238 100644 --- a/plugin/federation/federation_test.go +++ b/plugin/federation/federation_test.go @@ -54,7 +54,7 @@ func TestFederationKubernetes(t *testing.T) { } k := kubernetes.New([]string{"cluster.local."}) - k.APIConn = &APIConnFederationTest{} + k.APIConn = &APIConnFederationTest{zone: "fd-az", region: "fd-r"} fed := New() fed.zones = []string{"cluster.local."} @@ -79,3 +79,39 @@ func TestFederationKubernetes(t *testing.T) { test.SortAndCheck(t, resp, tc) } } + +func TestFederationKubernetesMissingLabels(t *testing.T) { + tests := []test.Case{ + { + // service does not exist, do the federation dance. + Qname: "svc0.testns.prod.svc.cluster.local.", Qtype: dns.TypeA, + Rcode: dns.RcodeSuccess, + Answer: []dns.RR{ + test.CNAME("svc0.testns.prod.svc.cluster.local. 303 IN CNAME svc0.testns.prod.svc.fd-az.fd-r.federal.example."), + }, + }, + } + + k := kubernetes.New([]string{"cluster.local."}) + k.APIConn = &APIConnFederationTest{zone: "", region: ""} + + fed := New() + fed.zones = []string{"cluster.local."} + fed.Federations = k.Federations + fed.Next = k + fed.f = map[string]string{ + "prod": "federal.example.", + } + + ctx := context.TODO() + for _, tc := range tests { + m := tc.Msg() + + rec := dnstest.NewRecorder(&test.ResponseWriter{}) + _, err := fed.ServeDNS(ctx, rec, m) + if err == nil { + t.Errorf("Expected an error") + return + } + } +} diff --git a/plugin/federation/kubernetes_api_test.go b/plugin/federation/kubernetes_api_test.go index b468510a5..f15b0fa23 100644 --- a/plugin/federation/kubernetes_api_test.go +++ b/plugin/federation/kubernetes_api_test.go @@ -8,7 +8,9 @@ import ( meta "k8s.io/apimachinery/pkg/apis/meta/v1" ) -type APIConnFederationTest struct{} +type APIConnFederationTest struct { + zone, region string +} func (APIConnFederationTest) HasSynced() bool { return true } func (APIConnFederationTest) Run() { return } @@ -176,13 +178,13 @@ func (APIConnFederationTest) EndpointsList() []*api.Endpoints { return eps } -func (APIConnFederationTest) GetNodeByName(name string) (*api.Node, error) { +func (a APIConnFederationTest) GetNodeByName(name string) (*api.Node, error) { return &api.Node{ ObjectMeta: meta.ObjectMeta{ Name: "test.node.foo.bar", Labels: map[string]string{ - kubernetes.LabelRegion: "fd-r", - kubernetes.LabelZone: "fd-az", + kubernetes.LabelRegion: a.region, + kubernetes.LabelZone: a.zone, }, }, }, nil diff --git a/plugin/kubernetes/federation.go b/plugin/kubernetes/federation.go index df6ae948b..78e31668b 100644 --- a/plugin/kubernetes/federation.go +++ b/plugin/kubernetes/federation.go @@ -1,6 +1,8 @@ package kubernetes import ( + "errors" + "github.com/coredns/coredns/plugin/etcd/msg" "github.com/coredns/coredns/plugin/pkg/dnsutil" "github.com/coredns/coredns/request" @@ -37,6 +39,10 @@ func (k *Kubernetes) Federations(state request.Request, fname, fzone string) (ms lz := node.Labels[LabelZone] lr := node.Labels[LabelRegion] + if lz == "" || lr == "" { + return msg.Service{}, errors.New("local node missing zone/region labels") + } + if r.endpoint == "" { return msg.Service{Host: dnsutil.Join([]string{r.service, r.namespace, fname, r.podOrSvc, lz, lr, fzone})}, nil } |