diff options
author | 2018-01-30 16:29:49 -0500 | |
---|---|---|
committer | 2018-01-30 16:29:49 -0500 | |
commit | b93a36b213473715a26a1123a7cbb42502bd8434 (patch) | |
tree | 78b300651417690568668b5301b2323ecce924e7 /plugin/pkg | |
parent | 0af9b9b16fe069f3201584d7e698efb4ebaee7fb (diff) | |
download | coredns-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.go | 17 | ||||
-rw-r--r-- | plugin/pkg/healthcheck/policy_test.go | 25 |
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.") + } +} |