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  }