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  }