2016-03-29 22:58:15 +00:00
|
|
|
package servers_test
|
2016-02-24 18:55:04 +00:00
|
|
|
|
|
|
|
import (
|
2016-02-25 06:23:50 +00:00
|
|
|
"fmt"
|
2016-02-24 18:55:04 +00:00
|
|
|
"log"
|
2016-03-28 21:53:29 +00:00
|
|
|
"math/rand"
|
2017-06-15 13:16:16 +00:00
|
|
|
"net"
|
2016-02-25 06:23:50 +00:00
|
|
|
"os"
|
|
|
|
"strings"
|
2016-02-24 18:55:04 +00:00
|
|
|
"testing"
|
|
|
|
|
pkg refactor
command/agent/* -> agent/*
command/consul/* -> agent/consul/*
command/agent/command{,_test}.go -> command/agent{,_test}.go
command/base/command.go -> command/base.go
command/base/* -> command/*
commands.go -> command/commands.go
The script which did the refactor is:
(
cd $GOPATH/src/github.com/hashicorp/consul
git mv command/agent/command.go command/agent.go
git mv command/agent/command_test.go command/agent_test.go
git mv command/agent/flag_slice_value{,_test}.go command/
git mv command/agent .
git mv command/base/command.go command/base.go
git mv command/base/config_util{,_test}.go command/
git mv commands.go command/
git mv consul agent
rmdir command/base/
gsed -i -e 's|package agent|package command|' command/agent{,_test}.go
gsed -i -e 's|package agent|package command|' command/flag_slice_value{,_test}.go
gsed -i -e 's|package base|package command|' command/base.go command/config_util{,_test}.go
gsed -i -e 's|package main|package command|' command/commands.go
gsed -i -e 's|base.Command|BaseCommand|' command/commands.go
gsed -i -e 's|agent.Command|AgentCommand|' command/commands.go
gsed -i -e 's|\tCommand:|\tBaseCommand:|' command/commands.go
gsed -i -e 's|base\.||' command/commands.go
gsed -i -e 's|command\.||' command/commands.go
gsed -i -e 's|command|c|' main.go
gsed -i -e 's|range Commands|range command.Commands|' main.go
gsed -i -e 's|Commands: Commands|Commands: command.Commands|' main.go
gsed -i -e 's|base\.BoolValue|BoolValue|' command/operator_autopilot_set.go
gsed -i -e 's|base\.DurationValue|DurationValue|' command/operator_autopilot_set.go
gsed -i -e 's|base\.StringValue|StringValue|' command/operator_autopilot_set.go
gsed -i -e 's|base\.UintValue|UintValue|' command/operator_autopilot_set.go
gsed -i -e 's|\bCommand\b|BaseCommand|' command/base.go
gsed -i -e 's|BaseCommand Options|Command Options|' command/base.go
gsed -i -e 's|base.Command|BaseCommand|' command/*.go
gsed -i -e 's|c\.Command|c.BaseCommand|g' command/*.go
gsed -i -e 's|\tCommand:|\tBaseCommand:|' command/*_test.go
gsed -i -e 's|base\.||' command/*_test.go
gsed -i -e 's|\bCommand\b|AgentCommand|' command/agent{,_test}.go
gsed -i -e 's|cmd.AgentCommand|cmd.BaseCommand|' command/agent.go
gsed -i -e 's|cli.AgentCommand = new(Command)|cli.Command = new(AgentCommand)|' command/agent_test.go
gsed -i -e 's|exec.AgentCommand|exec.Command|' command/agent_test.go
gsed -i -e 's|exec.BaseCommand|exec.Command|' command/agent_test.go
gsed -i -e 's|NewTestAgent|agent.NewTestAgent|' command/agent_test.go
gsed -i -e 's|= TestConfig|= agent.TestConfig|' command/agent_test.go
gsed -i -e 's|: RetryJoin|: agent.RetryJoin|' command/agent_test.go
gsed -i -e 's|\.\./\.\./|../|' command/config_util_test.go
gsed -i -e 's|\bverifyUniqueListeners|VerifyUniqueListeners|' agent/config{,_test}.go command/agent.go
gsed -i -e 's|\bserfLANKeyring\b|SerfLANKeyring|g' agent/{agent,keyring,testagent}.go command/agent.go
gsed -i -e 's|\bserfWANKeyring\b|SerfWANKeyring|g' agent/{agent,keyring,testagent}.go command/agent.go
gsed -i -e 's|\bNewAgent\b|agent.New|g' command/agent{,_test}.go
gsed -i -e 's|\bNewAgent|New|' agent/{acl_test,agent,testagent}.go
gsed -i -e 's|\bAgent\b|agent.&|g' command/agent{,_test}.go
gsed -i -e 's|\bBool\b|agent.&|g' command/agent{,_test}.go
gsed -i -e 's|\bConfig\b|agent.&|g' command/agent{,_test}.go
gsed -i -e 's|\bDefaultConfig\b|agent.&|g' command/agent{,_test}.go
gsed -i -e 's|\bDevConfig\b|agent.&|g' command/agent{,_test}.go
gsed -i -e 's|\bMergeConfig\b|agent.&|g' command/agent{,_test}.go
gsed -i -e 's|\bReadConfigPaths\b|agent.&|g' command/agent{,_test}.go
gsed -i -e 's|\bParseMetaPair\b|agent.&|g' command/agent{,_test}.go
gsed -i -e 's|\bSerfLANKeyring\b|agent.&|g' command/agent{,_test}.go
gsed -i -e 's|\bSerfWANKeyring\b|agent.&|g' command/agent{,_test}.go
gsed -i -e 's|circonus\.agent|circonus|g' command/agent{,_test}.go
gsed -i -e 's|logger\.agent|logger|g' command/agent{,_test}.go
gsed -i -e 's|metrics\.agent|metrics|g' command/agent{,_test}.go
gsed -i -e 's|// agent.Agent|// agent|' command/agent{,_test}.go
gsed -i -e 's|a\.agent\.Config|a.Config|' command/agent{,_test}.go
gsed -i -e 's|agent\.AppendSliceValue|AppendSliceValue|' command/{configtest,validate}.go
gsed -i -e 's|consul/consul|agent/consul|' GNUmakefile
gsed -i -e 's|\.\./test|../../test|' agent/consul/server_test.go
# fix imports
f=$(grep -rl 'github.com/hashicorp/consul/command/agent' * | grep '\.go')
gsed -i -e 's|github.com/hashicorp/consul/command/agent|github.com/hashicorp/consul/agent|' $f
goimports -w $f
f=$(grep -rl 'github.com/hashicorp/consul/consul' * | grep '\.go')
gsed -i -e 's|github.com/hashicorp/consul/consul|github.com/hashicorp/consul/agent/consul|' $f
goimports -w $f
goimports -w command/*.go main.go
)
2017-06-09 22:28:28 +00:00
|
|
|
"github.com/hashicorp/consul/agent/consul/agent"
|
|
|
|
"github.com/hashicorp/consul/agent/consul/servers"
|
2016-02-24 18:55:04 +00:00
|
|
|
)
|
|
|
|
|
2016-03-27 02:28:13 +00:00
|
|
|
type fauxConnPool struct {
|
2016-03-28 21:53:29 +00:00
|
|
|
// failPct between 0.0 and 1.0 == pct of time a Ping should fail
|
|
|
|
failPct float64
|
2016-03-27 02:28:13 +00:00
|
|
|
}
|
|
|
|
|
2017-06-15 13:16:16 +00:00
|
|
|
func (cp *fauxConnPool) Ping(string, net.Addr, int, bool) (bool, error) {
|
2016-03-28 21:53:29 +00:00
|
|
|
var success bool
|
|
|
|
successProb := rand.Float64()
|
|
|
|
if successProb > cp.failPct {
|
|
|
|
success = true
|
|
|
|
}
|
|
|
|
return success, nil
|
2016-03-27 02:28:13 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 06:08:13 +00:00
|
|
|
type fauxSerf struct {
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *fauxSerf) NumNodes() int {
|
|
|
|
return 16384
|
2016-02-24 18:55:04 +00:00
|
|
|
}
|
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
func testManager() (m *servers.Manager) {
|
2017-03-14 23:39:00 +00:00
|
|
|
logger := log.New(os.Stderr, "", log.LstdFlags)
|
2016-02-25 06:08:13 +00:00
|
|
|
shutdownCh := make(chan struct{})
|
2016-03-29 22:58:15 +00:00
|
|
|
m = servers.New(logger, shutdownCh, &fauxSerf{}, &fauxConnPool{})
|
|
|
|
return m
|
2016-02-24 18:55:04 +00:00
|
|
|
}
|
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
func testManagerFailProb(failPct float64) (m *servers.Manager) {
|
2017-03-14 23:39:00 +00:00
|
|
|
logger := log.New(os.Stderr, "", log.LstdFlags)
|
2016-03-28 21:53:29 +00:00
|
|
|
shutdownCh := make(chan struct{})
|
2016-03-29 22:58:15 +00:00
|
|
|
m = servers.New(logger, shutdownCh, &fauxSerf{}, &fauxConnPool{failPct: failPct})
|
|
|
|
return m
|
2016-03-28 21:53:29 +00:00
|
|
|
}
|
|
|
|
|
2016-03-30 00:39:19 +00:00
|
|
|
// func (m *Manager) AddServer(server *agent.Server) {
|
2016-03-29 22:58:15 +00:00
|
|
|
func TestServers_AddServer(t *testing.T) {
|
|
|
|
m := testManager()
|
2016-02-25 06:23:50 +00:00
|
|
|
var num int
|
2016-03-29 22:58:15 +00:00
|
|
|
num = m.NumServers()
|
2016-02-25 06:23:50 +00:00
|
|
|
if num != 0 {
|
|
|
|
t.Fatalf("Expected zero servers to start")
|
|
|
|
}
|
|
|
|
|
2016-03-30 00:39:19 +00:00
|
|
|
s1 := &agent.Server{Name: "s1"}
|
2016-03-29 22:58:15 +00:00
|
|
|
m.AddServer(s1)
|
|
|
|
num = m.NumServers()
|
2016-02-25 06:23:50 +00:00
|
|
|
if num != 1 {
|
|
|
|
t.Fatalf("Expected one server")
|
|
|
|
}
|
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
m.AddServer(s1)
|
|
|
|
num = m.NumServers()
|
2016-02-25 06:23:50 +00:00
|
|
|
if num != 1 {
|
|
|
|
t.Fatalf("Expected one server (still)")
|
|
|
|
}
|
|
|
|
|
2016-03-30 00:39:19 +00:00
|
|
|
s2 := &agent.Server{Name: "s2"}
|
2016-03-29 22:58:15 +00:00
|
|
|
m.AddServer(s2)
|
|
|
|
num = m.NumServers()
|
2016-02-25 06:23:50 +00:00
|
|
|
if num != 2 {
|
|
|
|
t.Fatalf("Expected two servers")
|
|
|
|
}
|
|
|
|
}
|
2016-02-24 18:55:04 +00:00
|
|
|
|
2017-03-15 00:47:37 +00:00
|
|
|
// func (m *Manager) IsOffline() bool {
|
|
|
|
func TestServers_IsOffline(t *testing.T) {
|
|
|
|
m := testManager()
|
|
|
|
if !m.IsOffline() {
|
|
|
|
t.Fatalf("bad")
|
|
|
|
}
|
|
|
|
|
|
|
|
s1 := &agent.Server{Name: "s1"}
|
|
|
|
m.AddServer(s1)
|
|
|
|
if m.IsOffline() {
|
|
|
|
t.Fatalf("bad")
|
|
|
|
}
|
|
|
|
m.RebalanceServers()
|
|
|
|
if m.IsOffline() {
|
|
|
|
t.Fatalf("bad")
|
|
|
|
}
|
|
|
|
m.RemoveServer(s1)
|
|
|
|
m.RebalanceServers()
|
|
|
|
if !m.IsOffline() {
|
|
|
|
t.Fatalf("bad")
|
|
|
|
}
|
|
|
|
|
|
|
|
const failPct = 0.5
|
|
|
|
m = testManagerFailProb(failPct)
|
|
|
|
m.AddServer(s1)
|
|
|
|
var on, off int
|
|
|
|
for i := 0; i < 100; i++ {
|
|
|
|
m.RebalanceServers()
|
|
|
|
if m.IsOffline() {
|
|
|
|
off++
|
|
|
|
} else {
|
|
|
|
on++
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if on == 0 || off == 0 {
|
|
|
|
t.Fatalf("bad: %d %d", on, off)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-03-30 00:39:19 +00:00
|
|
|
// func (m *Manager) FindServer() (server *agent.Server) {
|
2016-03-29 22:58:15 +00:00
|
|
|
func TestServers_FindServer(t *testing.T) {
|
|
|
|
m := testManager()
|
2016-02-24 18:55:04 +00:00
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
if m.FindServer() != nil {
|
2016-02-25 06:23:50 +00:00
|
|
|
t.Fatalf("Expected nil return")
|
|
|
|
}
|
|
|
|
|
2016-03-30 00:39:19 +00:00
|
|
|
m.AddServer(&agent.Server{Name: "s1"})
|
2016-03-29 22:58:15 +00:00
|
|
|
if m.NumServers() != 1 {
|
2016-02-25 06:23:50 +00:00
|
|
|
t.Fatalf("Expected one server")
|
|
|
|
}
|
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
s1 := m.FindServer()
|
2016-02-25 06:05:05 +00:00
|
|
|
if s1 == nil {
|
|
|
|
t.Fatalf("Expected non-nil server")
|
|
|
|
}
|
|
|
|
if s1.Name != "s1" {
|
|
|
|
t.Fatalf("Expected s1 server")
|
|
|
|
}
|
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
s1 = m.FindServer()
|
2016-02-25 06:05:05 +00:00
|
|
|
if s1 == nil || s1.Name != "s1" {
|
|
|
|
t.Fatalf("Expected s1 server (still)")
|
|
|
|
}
|
|
|
|
|
2016-03-30 00:39:19 +00:00
|
|
|
m.AddServer(&agent.Server{Name: "s2"})
|
2016-03-29 22:58:15 +00:00
|
|
|
if m.NumServers() != 2 {
|
2016-02-25 06:05:05 +00:00
|
|
|
t.Fatalf("Expected two servers")
|
|
|
|
}
|
2016-03-29 22:58:15 +00:00
|
|
|
s1 = m.FindServer()
|
2016-02-25 06:05:05 +00:00
|
|
|
if s1 == nil || s1.Name != "s1" {
|
|
|
|
t.Fatalf("Expected s1 server (still)")
|
|
|
|
}
|
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
m.NotifyFailedServer(s1)
|
|
|
|
s2 := m.FindServer()
|
2016-02-25 06:05:05 +00:00
|
|
|
if s2 == nil || s2.Name != "s2" {
|
|
|
|
t.Fatalf("Expected s2 server")
|
|
|
|
}
|
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
m.NotifyFailedServer(s2)
|
|
|
|
s1 = m.FindServer()
|
2016-02-25 06:05:05 +00:00
|
|
|
if s1 == nil || s1.Name != "s1" {
|
|
|
|
t.Fatalf("Expected s1 server")
|
|
|
|
}
|
|
|
|
}
|
2016-02-24 18:55:04 +00:00
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
// func New(logger *log.Logger, shutdownCh chan struct{}) (m *Manager) {
|
|
|
|
func TestServers_New(t *testing.T) {
|
2017-03-14 23:39:00 +00:00
|
|
|
logger := log.New(os.Stderr, "", log.LstdFlags)
|
2016-02-25 06:23:50 +00:00
|
|
|
shutdownCh := make(chan struct{})
|
2016-03-29 22:58:15 +00:00
|
|
|
m := servers.New(logger, shutdownCh, &fauxSerf{}, &fauxConnPool{})
|
|
|
|
if m == nil {
|
|
|
|
t.Fatalf("Manager nil")
|
2016-02-25 06:23:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-03-30 00:39:19 +00:00
|
|
|
// func (m *Manager) NotifyFailedServer(server *agent.Server) {
|
2016-03-29 22:58:15 +00:00
|
|
|
func TestServers_NotifyFailedServer(t *testing.T) {
|
|
|
|
m := testManager()
|
2016-02-25 06:23:50 +00:00
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
if m.NumServers() != 0 {
|
2016-02-25 06:23:50 +00:00
|
|
|
t.Fatalf("Expected zero servers to start")
|
|
|
|
}
|
|
|
|
|
2016-03-30 00:39:19 +00:00
|
|
|
s1 := &agent.Server{Name: "s1"}
|
|
|
|
s2 := &agent.Server{Name: "s2"}
|
2016-03-25 21:40:46 +00:00
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
// Try notifying for a server that is not managed by Manager
|
|
|
|
m.NotifyFailedServer(s1)
|
|
|
|
if m.NumServers() != 0 {
|
2016-03-25 21:40:46 +00:00
|
|
|
t.Fatalf("Expected zero servers to start")
|
|
|
|
}
|
2016-03-29 22:58:15 +00:00
|
|
|
m.AddServer(s1)
|
2016-03-25 21:40:46 +00:00
|
|
|
|
|
|
|
// Test again w/ a server not in the list
|
2016-03-29 22:58:15 +00:00
|
|
|
m.NotifyFailedServer(s2)
|
|
|
|
if m.NumServers() != 1 {
|
2016-03-25 21:40:46 +00:00
|
|
|
t.Fatalf("Expected one server")
|
|
|
|
}
|
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
m.AddServer(s2)
|
|
|
|
if m.NumServers() != 2 {
|
2016-02-25 06:23:50 +00:00
|
|
|
t.Fatalf("Expected two servers")
|
|
|
|
}
|
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
s1 = m.FindServer()
|
2016-02-25 06:23:50 +00:00
|
|
|
if s1 == nil || s1.Name != "s1" {
|
|
|
|
t.Fatalf("Expected s1 server")
|
|
|
|
}
|
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
m.NotifyFailedServer(s2)
|
|
|
|
s1 = m.FindServer()
|
2016-02-25 06:23:50 +00:00
|
|
|
if s1 == nil || s1.Name != "s1" {
|
|
|
|
t.Fatalf("Expected s1 server (still)")
|
|
|
|
}
|
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
m.NotifyFailedServer(s1)
|
|
|
|
s2 = m.FindServer()
|
2016-02-25 06:23:50 +00:00
|
|
|
if s2 == nil || s2.Name != "s2" {
|
|
|
|
t.Fatalf("Expected s2 server")
|
|
|
|
}
|
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
m.NotifyFailedServer(s2)
|
|
|
|
s1 = m.FindServer()
|
2016-02-25 06:23:50 +00:00
|
|
|
if s1 == nil || s1.Name != "s1" {
|
|
|
|
t.Fatalf("Expected s1 server")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
// func (m *Manager) NumServers() (numServers int) {
|
|
|
|
func TestServers_NumServers(t *testing.T) {
|
|
|
|
m := testManager()
|
2016-02-24 18:55:04 +00:00
|
|
|
var num int
|
2016-03-29 22:58:15 +00:00
|
|
|
num = m.NumServers()
|
2016-02-24 18:55:04 +00:00
|
|
|
if num != 0 {
|
|
|
|
t.Fatalf("Expected zero servers to start")
|
|
|
|
}
|
|
|
|
|
2016-03-30 00:39:19 +00:00
|
|
|
s := &agent.Server{}
|
2016-03-29 22:58:15 +00:00
|
|
|
m.AddServer(s)
|
|
|
|
num = m.NumServers()
|
2016-02-24 18:55:04 +00:00
|
|
|
if num != 1 {
|
|
|
|
t.Fatalf("Expected one server after AddServer")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
// func (m *Manager) RebalanceServers() {
|
|
|
|
func TestServers_RebalanceServers(t *testing.T) {
|
2016-03-28 21:53:29 +00:00
|
|
|
const failPct = 0.5
|
2016-03-29 22:58:15 +00:00
|
|
|
m := testManagerFailProb(failPct)
|
2016-02-25 06:23:50 +00:00
|
|
|
const maxServers = 100
|
|
|
|
const numShuffleTests = 100
|
|
|
|
const uniquePassRate = 0.5
|
|
|
|
|
|
|
|
// Make a huge list of nodes.
|
|
|
|
for i := 0; i < maxServers; i++ {
|
|
|
|
nodeName := fmt.Sprintf("s%02d", i)
|
2016-03-30 00:39:19 +00:00
|
|
|
m.AddServer(&agent.Server{Name: nodeName})
|
2016-02-24 18:55:04 +00:00
|
|
|
}
|
|
|
|
|
2016-02-25 06:23:50 +00:00
|
|
|
// Keep track of how many unique shuffles we get.
|
|
|
|
uniques := make(map[string]struct{}, maxServers)
|
|
|
|
for i := 0; i < numShuffleTests; i++ {
|
2016-03-29 22:58:15 +00:00
|
|
|
m.RebalanceServers()
|
2016-02-24 18:55:04 +00:00
|
|
|
|
2016-02-25 06:23:50 +00:00
|
|
|
var names []string
|
|
|
|
for j := 0; j < maxServers; j++ {
|
2016-03-29 22:58:15 +00:00
|
|
|
server := m.FindServer()
|
|
|
|
m.NotifyFailedServer(server)
|
2016-02-25 06:23:50 +00:00
|
|
|
names = append(names, server.Name)
|
|
|
|
}
|
|
|
|
key := strings.Join(names, "|")
|
|
|
|
uniques[key] = struct{}{}
|
|
|
|
}
|
|
|
|
|
|
|
|
// We have to allow for the fact that there won't always be a unique
|
|
|
|
// shuffle each pass, so we just look for smell here without the test
|
|
|
|
// being flaky.
|
|
|
|
if len(uniques) < int(maxServers*uniquePassRate) {
|
|
|
|
t.Fatalf("unique shuffle ratio too low: %d/%d", len(uniques), maxServers)
|
|
|
|
}
|
|
|
|
}
|
2016-02-24 18:55:04 +00:00
|
|
|
|
2016-03-30 00:39:19 +00:00
|
|
|
// func (m *Manager) RemoveServer(server *agent.Server) {
|
2016-03-29 22:58:15 +00:00
|
|
|
func TestManager_RemoveServer(t *testing.T) {
|
2016-03-25 21:40:46 +00:00
|
|
|
const nodeNameFmt = "s%02d"
|
2016-03-29 22:58:15 +00:00
|
|
|
m := testManager()
|
2016-02-25 06:23:50 +00:00
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
if m.NumServers() != 0 {
|
2016-02-25 06:23:50 +00:00
|
|
|
t.Fatalf("Expected zero servers to start")
|
|
|
|
}
|
|
|
|
|
2016-03-25 21:40:46 +00:00
|
|
|
// Test removing server before its added
|
|
|
|
nodeName := fmt.Sprintf(nodeNameFmt, 1)
|
2016-03-30 00:39:19 +00:00
|
|
|
s1 := &agent.Server{Name: nodeName}
|
2016-03-29 22:58:15 +00:00
|
|
|
m.RemoveServer(s1)
|
|
|
|
m.AddServer(s1)
|
2016-03-25 21:40:46 +00:00
|
|
|
|
|
|
|
nodeName = fmt.Sprintf(nodeNameFmt, 2)
|
2016-03-30 00:39:19 +00:00
|
|
|
s2 := &agent.Server{Name: nodeName}
|
2016-03-29 22:58:15 +00:00
|
|
|
m.RemoveServer(s2)
|
|
|
|
m.AddServer(s2)
|
2016-03-25 21:40:46 +00:00
|
|
|
|
2016-02-25 06:23:50 +00:00
|
|
|
const maxServers = 19
|
2016-03-30 00:39:19 +00:00
|
|
|
servers := make([]*agent.Server, maxServers)
|
2016-03-25 21:40:46 +00:00
|
|
|
// Already added two servers above
|
|
|
|
for i := maxServers; i > 2; i-- {
|
|
|
|
nodeName := fmt.Sprintf(nodeNameFmt, i)
|
2016-03-30 00:39:19 +00:00
|
|
|
server := &agent.Server{Name: nodeName}
|
2016-02-25 06:23:50 +00:00
|
|
|
servers = append(servers, server)
|
2016-03-29 22:58:15 +00:00
|
|
|
m.AddServer(server)
|
2016-02-25 06:23:50 +00:00
|
|
|
}
|
2016-03-29 22:58:15 +00:00
|
|
|
if m.NumServers() != maxServers {
|
|
|
|
t.Fatalf("Expected %d servers, received %d", maxServers, m.NumServers())
|
2016-03-28 18:38:12 +00:00
|
|
|
}
|
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
m.RebalanceServers()
|
2016-02-25 06:23:50 +00:00
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
if m.NumServers() != maxServers {
|
|
|
|
t.Fatalf("Expected %d servers, received %d", maxServers, m.NumServers())
|
2016-02-25 06:23:50 +00:00
|
|
|
}
|
|
|
|
|
2016-03-30 00:39:19 +00:00
|
|
|
findServer := func(server *agent.Server) bool {
|
2016-03-29 22:58:15 +00:00
|
|
|
for i := m.NumServers(); i > 0; i-- {
|
|
|
|
s := m.FindServer()
|
2016-02-25 06:23:50 +00:00
|
|
|
if s == server {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
expectedNumServers := maxServers
|
2016-03-30 00:39:19 +00:00
|
|
|
removedServers := make([]*agent.Server, 0, maxServers)
|
2016-02-25 06:23:50 +00:00
|
|
|
|
|
|
|
// Remove servers from the front of the list
|
|
|
|
for i := 3; i > 0; i-- {
|
2016-03-29 22:58:15 +00:00
|
|
|
server := m.FindServer()
|
2016-02-25 06:23:50 +00:00
|
|
|
if server == nil {
|
|
|
|
t.Fatalf("FindServer returned nil")
|
|
|
|
}
|
2016-03-29 22:58:15 +00:00
|
|
|
m.RemoveServer(server)
|
2016-02-25 06:23:50 +00:00
|
|
|
expectedNumServers--
|
2016-03-29 22:58:15 +00:00
|
|
|
if m.NumServers() != expectedNumServers {
|
|
|
|
t.Fatalf("Expected %d servers (got %d)", expectedNumServers, m.NumServers())
|
2016-02-25 06:23:50 +00:00
|
|
|
}
|
2016-03-25 21:10:09 +00:00
|
|
|
if findServer(server) == true {
|
2016-02-25 06:23:50 +00:00
|
|
|
t.Fatalf("Did not expect to find server %s after removal from the front", server.Name)
|
|
|
|
}
|
|
|
|
removedServers = append(removedServers, server)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Remove server from the end of the list
|
|
|
|
for i := 3; i > 0; i-- {
|
2016-03-29 22:58:15 +00:00
|
|
|
server := m.FindServer()
|
|
|
|
m.NotifyFailedServer(server)
|
|
|
|
m.RemoveServer(server)
|
2016-02-25 06:23:50 +00:00
|
|
|
expectedNumServers--
|
2016-03-29 22:58:15 +00:00
|
|
|
if m.NumServers() != expectedNumServers {
|
|
|
|
t.Fatalf("Expected %d servers (got %d)", expectedNumServers, m.NumServers())
|
2016-02-25 06:23:50 +00:00
|
|
|
}
|
2016-03-25 21:10:09 +00:00
|
|
|
if findServer(server) == true {
|
2016-02-25 06:23:50 +00:00
|
|
|
t.Fatalf("Did not expect to find server %s", server.Name)
|
|
|
|
}
|
|
|
|
removedServers = append(removedServers, server)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Remove server from the middle of the list
|
|
|
|
for i := 3; i > 0; i-- {
|
2016-03-29 22:58:15 +00:00
|
|
|
server := m.FindServer()
|
|
|
|
m.NotifyFailedServer(server)
|
|
|
|
server2 := m.FindServer()
|
|
|
|
m.NotifyFailedServer(server2) // server2 now at end of the list
|
2016-02-25 06:23:50 +00:00
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
m.RemoveServer(server)
|
2016-02-25 06:23:50 +00:00
|
|
|
expectedNumServers--
|
2016-03-29 22:58:15 +00:00
|
|
|
if m.NumServers() != expectedNumServers {
|
|
|
|
t.Fatalf("Expected %d servers (got %d)", expectedNumServers, m.NumServers())
|
2016-02-25 06:23:50 +00:00
|
|
|
}
|
2016-03-25 21:10:09 +00:00
|
|
|
if findServer(server) == true {
|
2016-02-25 06:23:50 +00:00
|
|
|
t.Fatalf("Did not expect to find server %s", server.Name)
|
|
|
|
}
|
|
|
|
removedServers = append(removedServers, server)
|
|
|
|
}
|
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
if m.NumServers()+len(removedServers) != maxServers {
|
|
|
|
t.Fatalf("Expected %d+%d=%d servers", m.NumServers(), len(removedServers), maxServers)
|
2016-02-25 06:23:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Drain the remaining servers from the middle
|
2016-03-29 22:58:15 +00:00
|
|
|
for i := m.NumServers(); i > 0; i-- {
|
|
|
|
server := m.FindServer()
|
|
|
|
m.NotifyFailedServer(server)
|
|
|
|
server2 := m.FindServer()
|
|
|
|
m.NotifyFailedServer(server2) // server2 now at end of the list
|
|
|
|
m.RemoveServer(server)
|
2016-02-25 06:23:50 +00:00
|
|
|
removedServers = append(removedServers, server)
|
|
|
|
}
|
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
if m.NumServers() != 0 {
|
2016-02-25 06:23:50 +00:00
|
|
|
t.Fatalf("Expected an empty server list")
|
|
|
|
}
|
|
|
|
if len(removedServers) != maxServers {
|
|
|
|
t.Fatalf("Expected all servers to be in removed server list")
|
|
|
|
}
|
|
|
|
}
|
2016-02-24 18:55:04 +00:00
|
|
|
|
2016-03-29 22:58:15 +00:00
|
|
|
// func (m *Manager) Start() {
|