github.com/maier/nomad@v0.4.1-0.20161110003312-a9e3d0b8549d/nomad/server_test.go (about) 1 package nomad 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "log" 7 "net" 8 "sync/atomic" 9 "testing" 10 "time" 11 12 "github.com/hashicorp/nomad/command/agent/consul" 13 "github.com/hashicorp/nomad/testutil" 14 ) 15 16 var ( 17 nextPort uint32 = 15000 18 nodeNumber uint32 = 0 19 ) 20 21 func getPort() int { 22 return int(atomic.AddUint32(&nextPort, 1)) 23 } 24 25 func tmpDir(t *testing.T) string { 26 dir, err := ioutil.TempDir("", "nomad") 27 if err != nil { 28 t.Fatalf("err: %v", err) 29 } 30 return dir 31 } 32 33 func testServer(t *testing.T, cb func(*Config)) *Server { 34 // Setup the default settings 35 config := DefaultConfig() 36 config.Build = "unittest" 37 config.DevMode = true 38 config.RPCAddr = &net.TCPAddr{ 39 IP: []byte{127, 0, 0, 1}, 40 Port: getPort(), 41 } 42 nodeNum := atomic.AddUint32(&nodeNumber, 1) 43 config.NodeName = fmt.Sprintf("nomad-%03d", nodeNum) 44 45 // Tighten the Serf timing 46 config.SerfConfig.MemberlistConfig.BindAddr = "127.0.0.1" 47 config.SerfConfig.MemberlistConfig.BindPort = getPort() 48 config.SerfConfig.MemberlistConfig.SuspicionMult = 2 49 config.SerfConfig.MemberlistConfig.RetransmitMult = 2 50 config.SerfConfig.MemberlistConfig.ProbeTimeout = 50 * time.Millisecond 51 config.SerfConfig.MemberlistConfig.ProbeInterval = 100 * time.Millisecond 52 config.SerfConfig.MemberlistConfig.GossipInterval = 100 * time.Millisecond 53 54 // Tighten the Raft timing 55 config.RaftConfig.LeaderLeaseTimeout = 50 * time.Millisecond 56 config.RaftConfig.HeartbeatTimeout = 50 * time.Millisecond 57 config.RaftConfig.ElectionTimeout = 50 * time.Millisecond 58 config.RaftTimeout = 500 * time.Millisecond 59 60 // Disable Vault 61 f := false 62 config.VaultConfig.Enabled = &f 63 64 // Invoke the callback if any 65 if cb != nil { 66 cb(config) 67 } 68 69 // Enable raft as leader if we have bootstrap on 70 config.RaftConfig.StartAsLeader = !config.DevDisableBootstrap 71 72 shutdownCh := make(chan struct{}) 73 logger := log.New(config.LogOutput, "", log.LstdFlags) 74 consulSyncer, err := consul.NewSyncer(config.ConsulConfig, shutdownCh, logger) 75 if err != nil { 76 t.Fatalf("err: %v", err) 77 } 78 79 // Create server 80 server, err := NewServer(config, consulSyncer, logger) 81 if err != nil { 82 t.Fatalf("err: %v", err) 83 } 84 return server 85 } 86 87 func testJoin(t *testing.T, s1 *Server, other ...*Server) { 88 addr := fmt.Sprintf("127.0.0.1:%d", 89 s1.config.SerfConfig.MemberlistConfig.BindPort) 90 for _, s2 := range other { 91 if num, err := s2.Join([]string{addr}); err != nil { 92 t.Fatalf("err: %v", err) 93 } else if num != 1 { 94 t.Fatalf("bad: %d", num) 95 } 96 } 97 } 98 99 func TestServer_RPC(t *testing.T) { 100 s1 := testServer(t, nil) 101 defer s1.Shutdown() 102 103 var out struct{} 104 if err := s1.RPC("Status.Ping", struct{}{}, &out); err != nil { 105 t.Fatalf("err: %v", err) 106 } 107 } 108 109 func TestServer_Regions(t *testing.T) { 110 // Make the servers 111 s1 := testServer(t, func(c *Config) { 112 c.Region = "region1" 113 }) 114 defer s1.Shutdown() 115 116 s2 := testServer(t, func(c *Config) { 117 c.Region = "region2" 118 }) 119 defer s2.Shutdown() 120 121 // Join them together 122 s2Addr := fmt.Sprintf("127.0.0.1:%d", 123 s2.config.SerfConfig.MemberlistConfig.BindPort) 124 if n, err := s1.Join([]string{s2Addr}); err != nil || n != 1 { 125 t.Fatalf("Failed joining: %v (%d joined)", err, n) 126 } 127 128 // Try listing the regions 129 testutil.WaitForResult(func() (bool, error) { 130 out := s1.Regions() 131 if len(out) != 2 || out[0] != "region1" || out[1] != "region2" { 132 return false, fmt.Errorf("unexpected regions: %v", out) 133 } 134 return true, nil 135 }, func(err error) { 136 t.Fatalf("err: %v", err) 137 }) 138 }