github.com/kardianos/nomad@v0.1.3-0.20151022182107-b13df73ee850/command/agent/agent_test.go (about) 1 package agent 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "strings" 8 "sync/atomic" 9 "testing" 10 "time" 11 12 "github.com/hashicorp/nomad/nomad" 13 ) 14 15 var nextPort uint32 = 17000 16 17 func getPort() int { 18 return int(atomic.AddUint32(&nextPort, 1)) 19 } 20 21 func tmpDir(t *testing.T) string { 22 dir, err := ioutil.TempDir("", "nomad") 23 if err != nil { 24 t.Fatalf("err: %v", err) 25 } 26 return dir 27 } 28 29 func makeAgent(t *testing.T, cb func(*Config)) (string, *Agent) { 30 dir := tmpDir(t) 31 conf := DevConfig() 32 33 // Customize the server configuration 34 config := nomad.DefaultConfig() 35 conf.NomadConfig = config 36 37 // Bind and set ports 38 conf.BindAddr = "127.0.0.1" 39 conf.Ports = &Ports{ 40 HTTP: getPort(), 41 RPC: getPort(), 42 Serf: getPort(), 43 } 44 conf.NodeName = fmt.Sprintf("Node %d", conf.Ports.RPC) 45 46 // Tighten the Serf timing 47 config.SerfConfig.MemberlistConfig.SuspicionMult = 2 48 config.SerfConfig.MemberlistConfig.RetransmitMult = 2 49 config.SerfConfig.MemberlistConfig.ProbeTimeout = 50 * time.Millisecond 50 config.SerfConfig.MemberlistConfig.ProbeInterval = 100 * time.Millisecond 51 config.SerfConfig.MemberlistConfig.GossipInterval = 100 * time.Millisecond 52 53 // Tighten the Raft timing 54 config.RaftConfig.LeaderLeaseTimeout = 20 * time.Millisecond 55 config.RaftConfig.HeartbeatTimeout = 40 * time.Millisecond 56 config.RaftConfig.ElectionTimeout = 40 * time.Millisecond 57 config.RaftConfig.StartAsLeader = true 58 config.RaftTimeout = 500 * time.Millisecond 59 60 if cb != nil { 61 cb(conf) 62 } 63 64 agent, err := NewAgent(conf, os.Stderr) 65 if err != nil { 66 os.RemoveAll(dir) 67 t.Fatalf("err: %v", err) 68 } 69 return dir, agent 70 } 71 72 func TestAgent_RPCPing(t *testing.T) { 73 dir, agent := makeAgent(t, nil) 74 defer os.RemoveAll(dir) 75 defer agent.Shutdown() 76 77 var out struct{} 78 if err := agent.RPC("Status.Ping", struct{}{}, &out); err != nil { 79 t.Fatalf("err: %v", err) 80 } 81 } 82 83 func TestAgent_ServerConfig(t *testing.T) { 84 conf := DefaultConfig() 85 a := &Agent{config: conf} 86 87 // Returns error on bad serf addr 88 conf.AdvertiseAddrs.Serf = "nope" 89 _, err := a.serverConfig() 90 if err == nil || !strings.Contains(err.Error(), "serf advertise") { 91 t.Fatalf("expected serf address error, got: %#v", err) 92 } 93 conf.AdvertiseAddrs.Serf = "127.0.0.1:4000" 94 95 // Returns error on bad rpc addr 96 conf.AdvertiseAddrs.RPC = "nope" 97 _, err = a.serverConfig() 98 if err == nil || !strings.Contains(err.Error(), "rpc advertise") { 99 t.Fatalf("expected rpc address error, got: %#v", err) 100 } 101 conf.AdvertiseAddrs.RPC = "127.0.0.1:4001" 102 103 // Parses the advertise addrs correctly 104 out, err := a.serverConfig() 105 if err != nil { 106 t.Fatalf("err: %s", err) 107 } 108 serfAddr := out.SerfConfig.MemberlistConfig.AdvertiseAddr 109 if serfAddr != "127.0.0.1" { 110 t.Fatalf("expect 127.0.0.1, got: %s", serfAddr) 111 } 112 serfPort := out.SerfConfig.MemberlistConfig.AdvertisePort 113 if serfPort != 4000 { 114 t.Fatalf("expected 4000, got: %d", serfPort) 115 } 116 if addr := out.RPCAdvertise; addr.IP.String() != "127.0.0.1" || addr.Port != 4001 { 117 t.Fatalf("bad rpc advertise addr: %#v", addr) 118 } 119 120 // Sets up the ports properly 121 conf.Ports.RPC = 4003 122 conf.Ports.Serf = 4004 123 124 out, err = a.serverConfig() 125 if err != nil { 126 t.Fatalf("err: %s", err) 127 } 128 if addr := out.RPCAddr.Port; addr != 4003 { 129 t.Fatalf("expect 4003, got: %d", out.RPCAddr.Port) 130 } 131 if port := out.SerfConfig.MemberlistConfig.BindPort; port != 4004 { 132 t.Fatalf("expect 4004, got: %d", port) 133 } 134 135 // Prefers the most specific bind addrs 136 conf.BindAddr = "127.0.0.3" 137 conf.Addresses.RPC = "127.0.0.2" 138 conf.Addresses.Serf = "127.0.0.2" 139 140 out, err = a.serverConfig() 141 if err != nil { 142 t.Fatalf("err: %s", err) 143 } 144 if addr := out.RPCAddr.IP.String(); addr != "127.0.0.2" { 145 t.Fatalf("expect 127.0.0.2, got: %s", addr) 146 } 147 if addr := out.SerfConfig.MemberlistConfig.BindAddr; addr != "127.0.0.2" { 148 t.Fatalf("expect 127.0.0.2, got: %s", addr) 149 } 150 151 // Defaults to the global bind addr 152 conf.Addresses.RPC = "" 153 conf.Addresses.Serf = "" 154 out, err = a.serverConfig() 155 if err != nil { 156 t.Fatalf("err: %s", err) 157 } 158 if addr := out.RPCAddr.IP.String(); addr != "127.0.0.3" { 159 t.Fatalf("expect 127.0.0.3, got: %s", addr) 160 } 161 if addr := out.SerfConfig.MemberlistConfig.BindAddr; addr != "127.0.0.3" { 162 t.Fatalf("expect 127.0.0.3, got: %s", addr) 163 } 164 165 // Properly handles the bootstrap flags 166 conf.Server.BootstrapExpect = 1 167 out, err = a.serverConfig() 168 if err != nil { 169 t.Fatalf("err: %s", err) 170 } 171 if !out.Bootstrap { 172 t.Fatalf("should have set bootstrap mode") 173 } 174 if out.BootstrapExpect != 0 { 175 t.Fatalf("boostrap expect should be 0") 176 } 177 178 conf.Server.BootstrapExpect = 3 179 out, err = a.serverConfig() 180 if err != nil { 181 t.Fatalf("err: %s", err) 182 } 183 if out.Bootstrap { 184 t.Fatalf("bootstrap mode should be disabled") 185 } 186 if out.BootstrapExpect != 3 { 187 t.Fatalf("should have bootstrap-expect = 3") 188 } 189 }