mirror of
https://github.com/coredns/coredns.git
synced 2025-11-02 02:03:13 -05:00
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
This commit is contained in:
committed by
John Belamaric
parent
0af9b9b16f
commit
b93a36b213
@@ -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
|
||||
}
|
||||
|
||||
@@ -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.")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user