aboutsummaryrefslogtreecommitdiff
path: root/plugin/pkg
diff options
context:
space:
mode:
authorGravatar Francois Tur <ftur@infoblox.com> 2018-01-30 16:29:49 -0500
committerGravatar John Belamaric <jbelamaric@infoblox.com> 2018-01-30 16:29:49 -0500
commitb93a36b213473715a26a1123a7cbb42502bd8434 (patch)
tree78b300651417690568668b5301b2323ecce924e7 /plugin/pkg
parent0af9b9b16fe069f3201584d7e698efb4ebaee7fb (diff)
downloadcoredns-b93a36b213473715a26a1123a7cbb42502bd8434.tar.gz
coredns-b93a36b213473715a26a1123a7cbb42502bd8434.tar.zst
coredns-b93a36b213473715a26a1123a7cbb42502bd8434.zip
Plugin/Proxy - add new policy always_first to mimic windows dns resolvers (#1459)
* add new policy always_first to mimic windows dns resolvers fill documentation, add UT and cleanup fmt * change name of policy from always_first to first. Update docs
Diffstat (limited to 'plugin/pkg')
-rw-r--r--plugin/pkg/healthcheck/policy.go17
-rw-r--r--plugin/pkg/healthcheck/policy_test.go25
2 files changed, 40 insertions, 2 deletions
diff --git a/plugin/pkg/healthcheck/policy.go b/plugin/pkg/healthcheck/policy.go
index 6a828fc4d..070213900 100644
--- a/plugin/pkg/healthcheck/policy.go
+++ b/plugin/pkg/healthcheck/policy.go
@@ -27,6 +27,7 @@ func init() {
RegisterPolicy("random", func() Policy { return &Random{} })
RegisterPolicy("least_conn", func() Policy { return &LeastConn{} })
RegisterPolicy("round_robin", func() Policy { return &RoundRobin{} })
+ RegisterPolicy("first", func() Policy { return &First{} })
}
// Random is a policy that selects up hosts from a pool at random.
@@ -118,3 +119,19 @@ func (r *RoundRobin) Select(pool HostPool) *UpstreamHost {
}
return host
}
+
+// First is a policy that selects always the first healthy host in the list order.
+type First struct{}
+
+// Select always the first that is not Down.
+func (r *First) Select(pool HostPool) *UpstreamHost {
+ for i := 0; i < len(pool); i++ {
+ host := pool[i]
+ if host.Down() {
+ continue
+ }
+ return host
+ }
+ // return the first one, anyway none is correct
+ return nil
+}
diff --git a/plugin/pkg/healthcheck/policy_test.go b/plugin/pkg/healthcheck/policy_test.go
index d3f03b7e3..ddf5a1415 100644
--- a/plugin/pkg/healthcheck/policy_test.go
+++ b/plugin/pkg/healthcheck/policy_test.go
@@ -32,8 +32,8 @@ func (r *customPolicy) Select(pool HostPool) *UpstreamHost {
func testPool() HostPool {
pool := []*UpstreamHost{
- {Name: workableServer.URL}, // this should resolve (healthcheck test)
- {Name: "http://shouldnot.resolve"}, // this shouldn't
+ {Name: workableServer.URL}, // this should resolve (healthcheck test)
+ {Name: "http://shouldnot.resolve:85"}, // this shouldn't, especially on port other than 80
{Name: "http://C"},
}
return HostPool(pool)
@@ -136,3 +136,24 @@ func TestCustomPolicy(t *testing.T) {
t.Error("Expected custom policy host to be the first host.")
}
}
+
+func TestFirstPolicy(t *testing.T) {
+ pool := testPool()
+ rrPolicy := &First{}
+ h := rrPolicy.Select(pool)
+ // First selected host is 1, because counter starts at 0
+ // and increments before host is selected
+ if h != pool[0] {
+ t.Error("Expected always first to be first host in the pool.")
+ }
+ h = rrPolicy.Select(pool)
+ if h != pool[0] {
+ t.Error("Expected always first to be first host in the pool, even in second call")
+ }
+ // set this first in pool as failed
+ pool[0].Fails = 1
+ h = rrPolicy.Select(pool)
+ if h != pool[1] {
+ t.Error("Expected first to be he second in pool if the first one is down.")
+ }
+}