github.com/mattyr/nomad@v0.3.3-0.20160919021406-3485a065154a/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 config.VaultConfig.Enabled = false 62 63 // Invoke the callback if any 64 if cb != nil { 65 cb(config) 66 } 67 68 // Enable raft as leader if we have bootstrap on 69 config.RaftConfig.StartAsLeader = !config.DevDisableBootstrap 70 71 shutdownCh := make(chan struct{}) 72 logger := log.New(config.LogOutput, "", log.LstdFlags) 73 consulSyncer, err := consul.NewSyncer(config.ConsulConfig, shutdownCh, logger) 74 if err != nil { 75 t.Fatalf("err: %v", err) 76 } 77 78 // Create server 79 server, err := NewServer(config, consulSyncer, logger) 80 if err != nil { 81 t.Fatalf("err: %v", err) 82 } 83 return server 84 } 85 86 func testJoin(t *testing.T, s1 *Server, other ...*Server) { 87 addr := fmt.Sprintf("127.0.0.1:%d", 88 s1.config.SerfConfig.MemberlistConfig.BindPort) 89 for _, s2 := range other { 90 if num, err := s2.Join([]string{addr}); err != nil { 91 t.Fatalf("err: %v", err) 92 } else if num != 1 { 93 t.Fatalf("bad: %d", num) 94 } 95 } 96 } 97 98 func TestServer_RPC(t *testing.T) { 99 s1 := testServer(t, nil) 100 defer s1.Shutdown() 101 102 var out struct{} 103 if err := s1.RPC("Status.Ping", struct{}{}, &out); err != nil { 104 t.Fatalf("err: %v", err) 105 } 106 } 107 108 func TestServer_Regions(t *testing.T) { 109 // Make the servers 110 s1 := testServer(t, func(c *Config) { 111 c.Region = "region1" 112 }) 113 defer s1.Shutdown() 114 115 s2 := testServer(t, func(c *Config) { 116 c.Region = "region2" 117 }) 118 defer s2.Shutdown() 119 120 // Join them together 121 s2Addr := fmt.Sprintf("127.0.0.1:%d", 122 s2.config.SerfConfig.MemberlistConfig.BindPort) 123 if n, err := s1.Join([]string{s2Addr}); err != nil || n != 1 { 124 t.Fatalf("Failed joining: %v (%d joined)", err, n) 125 } 126 127 // Try listing the regions 128 testutil.WaitForResult(func() (bool, error) { 129 out := s1.Regions() 130 if len(out) != 2 || out[0] != "region1" || out[1] != "region2" { 131 return false, fmt.Errorf("unexpected regions: %v", out) 132 } 133 return true, nil 134 }, func(err error) { 135 t.Fatalf("err: %v", err) 136 }) 137 }