github.com/kardianos/nomad@v0.1.3-0.20151022182107-b13df73ee850/nomad/serf_test.go (about) 1 package nomad 2 3 import ( 4 "fmt" 5 "os" 6 "path" 7 "testing" 8 9 "github.com/hashicorp/nomad/testutil" 10 ) 11 12 func TestNomad_JoinPeer(t *testing.T) { 13 s1 := testServer(t, nil) 14 defer s1.Shutdown() 15 s2 := testServer(t, func(c *Config) { 16 c.Region = "region2" 17 }) 18 defer s2.Shutdown() 19 testJoin(t, s1, s2) 20 21 testutil.WaitForResult(func() (bool, error) { 22 if members := s1.Members(); len(members) != 2 { 23 return false, fmt.Errorf("bad: %#v", members) 24 } 25 if members := s2.Members(); len(members) != 2 { 26 return false, fmt.Errorf("bad: %#v", members) 27 } 28 return true, nil 29 }, func(err error) { 30 t.Fatalf("err: %v", err) 31 }) 32 33 testutil.WaitForResult(func() (bool, error) { 34 if len(s1.peers) != 2 { 35 return false, fmt.Errorf("bad: %#v", s1.peers) 36 } 37 if len(s2.peers) != 2 { 38 return false, fmt.Errorf("bad: %#v", s2.peers) 39 } 40 if len(s1.localPeers) != 1 { 41 return false, fmt.Errorf("bad: %#v", s1.localPeers) 42 } 43 if len(s2.localPeers) != 1 { 44 return false, fmt.Errorf("bad: %#v", s2.localPeers) 45 } 46 return true, nil 47 }, func(err error) { 48 t.Fatalf("err: %v", err) 49 }) 50 } 51 52 func TestNomad_RemovePeer(t *testing.T) { 53 s1 := testServer(t, nil) 54 defer s1.Shutdown() 55 s2 := testServer(t, func(c *Config) { 56 c.Region = "region2" 57 }) 58 defer s2.Shutdown() 59 testJoin(t, s1, s2) 60 61 testutil.WaitForResult(func() (bool, error) { 62 if members := s1.Members(); len(members) != 2 { 63 return false, fmt.Errorf("bad: %#v", members) 64 } 65 if members := s2.Members(); len(members) != 2 { 66 return false, fmt.Errorf("bad: %#v", members) 67 } 68 return true, nil 69 }, func(err error) { 70 t.Fatalf("err: %v", err) 71 }) 72 73 // Leave immediately 74 s2.Leave() 75 s2.Shutdown() 76 77 testutil.WaitForResult(func() (bool, error) { 78 if len(s1.peers) != 1 { 79 return false, fmt.Errorf("bad: %#v", s1.peers) 80 } 81 if len(s2.peers) != 1 { 82 return false, fmt.Errorf("bad: %#v", s2.peers) 83 } 84 return true, nil 85 }, func(err error) { 86 t.Fatalf("err: %v", err) 87 }) 88 } 89 90 func TestNomad_BootstrapExpect(t *testing.T) { 91 dir := tmpDir(t) 92 defer os.RemoveAll(dir) 93 94 s1 := testServer(t, func(c *Config) { 95 c.BootstrapExpect = 2 96 c.DevMode = false 97 c.DataDir = path.Join(dir, "node1") 98 }) 99 defer s1.Shutdown() 100 s2 := testServer(t, func(c *Config) { 101 c.BootstrapExpect = 2 102 c.DevMode = false 103 c.DataDir = path.Join(dir, "node2") 104 }) 105 defer s2.Shutdown() 106 testJoin(t, s1, s2) 107 108 testutil.WaitForResult(func() (bool, error) { 109 peers, err := s1.numOtherPeers() 110 if err != nil { 111 return false, err 112 } 113 if peers != 1 { 114 return false, fmt.Errorf("bad: %#v", peers) 115 } 116 peers, err = s2.numOtherPeers() 117 if err != nil { 118 return false, err 119 } 120 if peers != 1 { 121 return false, fmt.Errorf("bad: %#v", peers) 122 } 123 if len(s1.localPeers) != 2 { 124 return false, fmt.Errorf("bad: %#v", s1.localPeers) 125 } 126 if len(s2.localPeers) != 2 { 127 return false, fmt.Errorf("bad: %#v", s2.localPeers) 128 } 129 return true, nil 130 }, func(err error) { 131 t.Fatalf("err: %v", err) 132 }) 133 } 134 135 func TestNomad_BadExpect(t *testing.T) { 136 s1 := testServer(t, func(c *Config) { 137 c.BootstrapExpect = 2 138 c.DevDisableBootstrap = true 139 }) 140 defer s1.Shutdown() 141 s2 := testServer(t, func(c *Config) { 142 c.BootstrapExpect = 3 143 c.DevDisableBootstrap = true 144 }) 145 defer s2.Shutdown() 146 servers := []*Server{s1, s2} 147 testJoin(t, s1, s2) 148 149 // Serf members should update 150 testutil.WaitForResult(func() (bool, error) { 151 for _, s := range servers { 152 members := s.Members() 153 if len(members) != 2 { 154 return false, fmt.Errorf("%d", len(members)) 155 } 156 } 157 return true, nil 158 }, func(err error) { 159 t.Fatalf("should have 2 peers: %v", err) 160 }) 161 162 // should still have no peers (because s2 is in expect=2 mode) 163 testutil.WaitForResult(func() (bool, error) { 164 for _, s := range servers { 165 p, _ := s.raftPeers.Peers() 166 if len(p) != 0 { 167 return false, fmt.Errorf("%d", len(p)) 168 } 169 } 170 return true, nil 171 }, func(err error) { 172 t.Fatalf("should have 0 peers: %v", err) 173 }) 174 }