diff options
author | 2017-04-19 16:08:30 -0400 | |
---|---|---|
committer | 2017-04-19 16:08:30 -0400 | |
commit | 1c53d4130e83aecdbd06d40ed3daaf90e7e26a03 (patch) | |
tree | a9650c616ce63353388ad3fd35152fe904edef5f /middleware/kubernetes | |
parent | 5a60090933a221467fdc2e18faa516c6c55be306 (diff) | |
download | coredns-1c53d4130e83aecdbd06d40ed3daaf90e7e26a03.tar.gz coredns-1c53d4130e83aecdbd06d40ed3daaf90e7e26a03.tar.zst coredns-1c53d4130e83aecdbd06d40ed3daaf90e7e26a03.zip |
Add fallthrough support for Kubernetes (#626)
* Add fallthrough support for Kubernetes
This enables registering other services in the same zone as
Kubernetes services. This also re-orders the middleware chain
so that Kubernetes comes before other types, in order to make
this work out-of-the-box.
* Remove extra line
Diffstat (limited to 'middleware/kubernetes')
-rw-r--r-- | middleware/kubernetes/handler.go | 3 | ||||
-rw-r--r-- | middleware/kubernetes/kubernetes.go | 1 | ||||
-rw-r--r-- | middleware/kubernetes/setup.go | 7 | ||||
-rw-r--r-- | middleware/kubernetes/setup_test.go | 49 |
4 files changed, 60 insertions, 0 deletions
diff --git a/middleware/kubernetes/handler.go b/middleware/kubernetes/handler.go index 9dfc5c5a0..6eb637506 100644 --- a/middleware/kubernetes/handler.go +++ b/middleware/kubernetes/handler.go @@ -71,6 +71,9 @@ func (k Kubernetes) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.M _, _, err = middleware.A(&k, zone, state, nil, middleware.Options{}) } if k.IsNameError(err) { + if k.Fallthrough { + return middleware.NextOrFailure(k.Name(), k.Next, ctx, w, r) + } // Make err nil when returning here, so we don't log spam for NXDOMAIN. return middleware.BackendError(&k, zone, dns.RcodeNameError, state, nil /*debug*/, nil /* err */, middleware.Options{}) } diff --git a/middleware/kubernetes/kubernetes.go b/middleware/kubernetes/kubernetes.go index ca2d69824..82bbcbce3 100644 --- a/middleware/kubernetes/kubernetes.go +++ b/middleware/kubernetes/kubernetes.go @@ -43,6 +43,7 @@ type Kubernetes struct { Selector *labels.Selector PodMode string ReverseCidrs []net.IPNet + Fallthrough bool } const ( diff --git a/middleware/kubernetes/setup.go b/middleware/kubernetes/setup.go index be045a522..9467d1d28 100644 --- a/middleware/kubernetes/setup.go +++ b/middleware/kubernetes/setup.go @@ -155,6 +155,13 @@ func kubernetesParse(c *caddy.Controller) (*Kubernetes, error) { continue } return nil, c.ArgErr() + case "fallthrough": + args := c.RemainingArgs() + if len(args) == 0 { + k8s.Fallthrough = true + continue + } + return nil, c.ArgErr() } } return k8s, nil diff --git a/middleware/kubernetes/setup_test.go b/middleware/kubernetes/setup_test.go index bc6418c0d..f9a87a805 100644 --- a/middleware/kubernetes/setup_test.go +++ b/middleware/kubernetes/setup_test.go @@ -27,6 +27,7 @@ func TestKubernetesParse(t *testing.T) { expectedLabelSelector string // expected label selector value expectedPodMode string expectedCidrs []net.IPNet + expectedFallthrough bool }{ // positive { @@ -40,6 +41,7 @@ func TestKubernetesParse(t *testing.T) { "", defaultPodMode, nil, + false, }, { "kubernetes keyword with multiple zones", @@ -52,6 +54,7 @@ func TestKubernetesParse(t *testing.T) { "", defaultPodMode, nil, + false, }, { "kubernetes keyword with zone and empty braces", @@ -65,6 +68,7 @@ func TestKubernetesParse(t *testing.T) { "", defaultPodMode, nil, + false, }, { "endpoint keyword with url", @@ -79,6 +83,7 @@ func TestKubernetesParse(t *testing.T) { "", defaultPodMode, nil, + false, }, { "namespaces keyword with one namespace", @@ -93,6 +98,7 @@ func TestKubernetesParse(t *testing.T) { "", defaultPodMode, nil, + false, }, { "namespaces keyword with multiple namespaces", @@ -107,6 +113,7 @@ func TestKubernetesParse(t *testing.T) { "", defaultPodMode, nil, + false, }, { "resync period in seconds", @@ -121,6 +128,7 @@ func TestKubernetesParse(t *testing.T) { "", defaultPodMode, nil, + false, }, { "resync period in minutes", @@ -135,6 +143,7 @@ func TestKubernetesParse(t *testing.T) { "", defaultPodMode, nil, + false, }, { "basic label selector", @@ -149,6 +158,7 @@ func TestKubernetesParse(t *testing.T) { "environment=prod", defaultPodMode, nil, + false, }, { "multi-label selector", @@ -163,6 +173,7 @@ func TestKubernetesParse(t *testing.T) { "application=nginx,environment in (production,qa,staging)", defaultPodMode, nil, + false, }, { "fully specified valid config", @@ -171,6 +182,7 @@ func TestKubernetesParse(t *testing.T) { endpoint http://localhost:8080 namespaces demo test labels environment in (production, staging, qa),application=nginx + fallthrough }`, false, "", @@ -180,6 +192,7 @@ func TestKubernetesParse(t *testing.T) { "application=nginx,environment in (production,qa,staging)", defaultPodMode, nil, + true, }, // negative { @@ -193,6 +206,7 @@ func TestKubernetesParse(t *testing.T) { "", defaultPodMode, nil, + false, }, { "kubernetes keyword without a zone", @@ -205,6 +219,7 @@ func TestKubernetesParse(t *testing.T) { "", defaultPodMode, nil, + false, }, { "endpoint keyword without an endpoint value", @@ -219,6 +234,7 @@ func TestKubernetesParse(t *testing.T) { "", defaultPodMode, nil, + false, }, { "namespace keyword without a namespace value", @@ -233,6 +249,7 @@ func TestKubernetesParse(t *testing.T) { "", defaultPodMode, nil, + false, }, { "resyncperiod keyword without a duration value", @@ -247,6 +264,7 @@ func TestKubernetesParse(t *testing.T) { "", defaultPodMode, nil, + false, }, { "resync period no units", @@ -261,6 +279,7 @@ func TestKubernetesParse(t *testing.T) { "", defaultPodMode, nil, + false, }, { "resync period invalid", @@ -275,6 +294,7 @@ func TestKubernetesParse(t *testing.T) { "", defaultPodMode, nil, + false, }, { "labels with no selector value", @@ -289,6 +309,7 @@ func TestKubernetesParse(t *testing.T) { "", defaultPodMode, nil, + false, }, { "labels with invalid selector value", @@ -303,6 +324,7 @@ func TestKubernetesParse(t *testing.T) { "", defaultPodMode, nil, + false, }, // pods disabled { @@ -318,6 +340,7 @@ func TestKubernetesParse(t *testing.T) { "", PodModeDisabled, nil, + false, }, // pods insecure { @@ -333,6 +356,7 @@ func TestKubernetesParse(t *testing.T) { "", PodModeInsecure, nil, + false, }, // pods verified { @@ -348,6 +372,7 @@ func TestKubernetesParse(t *testing.T) { "", PodModeVerified, nil, + false, }, // pods invalid { @@ -363,6 +388,7 @@ func TestKubernetesParse(t *testing.T) { "", PodModeVerified, nil, + false, }, // cidrs ok { @@ -378,6 +404,7 @@ func TestKubernetesParse(t *testing.T) { "", defaultPodMode, []net.IPNet{parseCidr("10.0.0.0/24"), parseCidr("10.0.1.0/24")}, + false, }, // cidrs ok { @@ -393,6 +420,23 @@ func TestKubernetesParse(t *testing.T) { "", defaultPodMode, nil, + false, + }, + // fallthrough invalid + { + "Extra params for fallthrough", + `kubernetes coredns.local { + fallthrough junk +}`, + true, + "Wrong argument count", + -1, + 0, + defaultResyncPeriod, + "", + defaultPodMode, + nil, + false, }, } @@ -466,6 +510,11 @@ func TestKubernetesParse(t *testing.T) { t.Errorf("Test %d: Expected kubernetes controller to be initialized with cidr '%s'. Instead found cidr '%s' for input '%s'", i, test.expectedCidrs[j].String(), foundCidrs[j].String(), test.input) } } + // fallthrough + foundFallthrough := k8sController.Fallthrough + if foundFallthrough != test.expectedFallthrough { + t.Errorf("Test %d: Expected kubernetes controller to be initialized with fallthrough '%v'. Instead found fallthrough '%v' for input '%s'", i, test.expectedFallthrough, foundFallthrough, test.input) + } } } |