github.com/djenriquez/nomad-1@v0.8.1/api/agent_test.go (about)

     1  package api
     2  
     3  import (
     4  	"reflect"
     5  	"sort"
     6  	"testing"
     7  
     8  	"github.com/hashicorp/nomad/testutil"
     9  	"github.com/stretchr/testify/assert"
    10  )
    11  
    12  func TestAgent_Self(t *testing.T) {
    13  	t.Parallel()
    14  	c, s := makeClient(t, nil, nil)
    15  	defer s.Stop()
    16  
    17  	// Get a handle on the Agent endpoints
    18  	a := c.Agent()
    19  
    20  	// Query the endpoint
    21  	res, err := a.Self()
    22  	if err != nil {
    23  		t.Fatalf("err: %s", err)
    24  	}
    25  
    26  	// Check that we got a valid response
    27  	if res.Member.Name == "" {
    28  		t.Fatalf("bad member name in response: %#v", res)
    29  	}
    30  
    31  	// Local cache was populated
    32  	if a.nodeName == "" || a.datacenter == "" || a.region == "" {
    33  		t.Fatalf("cache should be populated, got: %#v", a)
    34  	}
    35  }
    36  
    37  func TestAgent_NodeName(t *testing.T) {
    38  	t.Parallel()
    39  	c, s := makeClient(t, nil, nil)
    40  	defer s.Stop()
    41  	a := c.Agent()
    42  
    43  	// Query the agent for the node name
    44  	res, err := a.NodeName()
    45  	if err != nil {
    46  		t.Fatalf("err: %s", err)
    47  	}
    48  	if res == "" {
    49  		t.Fatalf("expected node name, got nothing")
    50  	}
    51  }
    52  
    53  func TestAgent_Datacenter(t *testing.T) {
    54  	t.Parallel()
    55  	c, s := makeClient(t, nil, nil)
    56  	defer s.Stop()
    57  	a := c.Agent()
    58  
    59  	// Query the agent for the datacenter
    60  	dc, err := a.Datacenter()
    61  	if err != nil {
    62  		t.Fatalf("err: %s", err)
    63  	}
    64  	if dc != "dc1" {
    65  		t.Fatalf("expected dc1, got: %q", dc)
    66  	}
    67  }
    68  
    69  func TestAgent_Join(t *testing.T) {
    70  	t.Parallel()
    71  	c1, s1 := makeClient(t, nil, nil)
    72  	defer s1.Stop()
    73  	a1 := c1.Agent()
    74  
    75  	_, s2 := makeClient(t, nil, func(c *testutil.TestServerConfig) {
    76  		c.Server.BootstrapExpect = 0
    77  	})
    78  	defer s2.Stop()
    79  
    80  	// Attempting to join a nonexistent host returns error
    81  	n, err := a1.Join("nope")
    82  	if err == nil {
    83  		t.Fatalf("expected error, got nothing")
    84  	}
    85  	if n != 0 {
    86  		t.Fatalf("expected 0 nodes, got: %d", n)
    87  	}
    88  
    89  	// Returns correctly if join succeeds
    90  	n, err = a1.Join(s2.SerfAddr)
    91  	if err != nil {
    92  		t.Fatalf("err: %s", err)
    93  	}
    94  	if n != 1 {
    95  		t.Fatalf("expected 1 node, got: %d", n)
    96  	}
    97  }
    98  
    99  func TestAgent_Members(t *testing.T) {
   100  	t.Parallel()
   101  	c, s := makeClient(t, nil, nil)
   102  	defer s.Stop()
   103  	a := c.Agent()
   104  
   105  	// Query nomad for all the known members
   106  	mem, err := a.Members()
   107  	if err != nil {
   108  		t.Fatalf("err: %s", err)
   109  	}
   110  
   111  	// Check that we got the expected result
   112  	if n := len(mem.Members); n != 1 {
   113  		t.Fatalf("expected 1 member, got: %d", n)
   114  	}
   115  	if m := mem.Members[0]; m.Name == "" || m.Addr == "" || m.Port == 0 {
   116  		t.Fatalf("bad member: %#v", m)
   117  	}
   118  }
   119  
   120  func TestAgent_ForceLeave(t *testing.T) {
   121  	t.Parallel()
   122  	c, s := makeClient(t, nil, nil)
   123  	defer s.Stop()
   124  	a := c.Agent()
   125  
   126  	// Force-leave on a nonexistent node does not error
   127  	if err := a.ForceLeave("nope"); err != nil {
   128  		t.Fatalf("err: %s", err)
   129  	}
   130  
   131  	// TODO: test force-leave on an existing node
   132  }
   133  
   134  func (a *AgentMember) String() string {
   135  	return "{Name: " + a.Name + " Region: " + a.Tags["region"] + " DC: " + a.Tags["dc"] + "}"
   136  }
   137  
   138  func TestAgents_Sort(t *testing.T) {
   139  	t.Parallel()
   140  	var sortTests = []struct {
   141  		in  []*AgentMember
   142  		out []*AgentMember
   143  	}{
   144  		{
   145  			[]*AgentMember{
   146  				{Name: "nomad-2.vac.us-east",
   147  					Tags: map[string]string{"region": "us-east", "dc": "us-east-1c"}},
   148  				{Name: "nomad-1.global",
   149  					Tags: map[string]string{"region": "global", "dc": "dc1"}},
   150  				{Name: "nomad-1.vac.us-east",
   151  					Tags: map[string]string{"region": "us-east", "dc": "us-east-1c"}},
   152  			},
   153  			[]*AgentMember{
   154  				{Name: "nomad-1.global",
   155  					Tags: map[string]string{"region": "global", "dc": "dc1"}},
   156  				{Name: "nomad-1.vac.us-east",
   157  					Tags: map[string]string{"region": "us-east", "dc": "us-east-1c"}},
   158  				{Name: "nomad-2.vac.us-east",
   159  					Tags: map[string]string{"region": "us-east", "dc": "us-east-1c"}},
   160  			},
   161  		},
   162  		{
   163  			[]*AgentMember{
   164  				{Name: "nomad-02.tam.us-east",
   165  					Tags: map[string]string{"region": "us-east", "dc": "tampa"}},
   166  				{Name: "nomad-02.pal.us-west",
   167  					Tags: map[string]string{"region": "us-west", "dc": "palo_alto"}},
   168  				{Name: "nomad-01.pal.us-west",
   169  					Tags: map[string]string{"region": "us-west", "dc": "palo_alto"}},
   170  				{Name: "nomad-01.tam.us-east",
   171  					Tags: map[string]string{"region": "us-east", "dc": "tampa"}},
   172  			},
   173  			[]*AgentMember{
   174  				{Name: "nomad-01.tam.us-east",
   175  					Tags: map[string]string{"region": "us-east", "dc": "tampa"}},
   176  				{Name: "nomad-02.tam.us-east",
   177  					Tags: map[string]string{"region": "us-east", "dc": "tampa"}},
   178  				{Name: "nomad-01.pal.us-west",
   179  					Tags: map[string]string{"region": "us-west", "dc": "palo_alto"}},
   180  				{Name: "nomad-02.pal.us-west",
   181  					Tags: map[string]string{"region": "us-west", "dc": "palo_alto"}},
   182  			},
   183  		},
   184  		{
   185  			[]*AgentMember{
   186  				{Name: "nomad-02.tam.us-east",
   187  					Tags: map[string]string{"region": "us-east", "dc": "tampa"}},
   188  				{Name: "nomad-02.ams.europe",
   189  					Tags: map[string]string{"region": "europe", "dc": "amsterdam"}},
   190  				{Name: "nomad-01.tam.us-east",
   191  					Tags: map[string]string{"region": "us-east", "dc": "tampa"}},
   192  				{Name: "nomad-01.ams.europe",
   193  					Tags: map[string]string{"region": "europe", "dc": "amsterdam"}},
   194  			},
   195  			[]*AgentMember{
   196  				{Name: "nomad-01.ams.europe",
   197  					Tags: map[string]string{"region": "europe", "dc": "amsterdam"}},
   198  				{Name: "nomad-02.ams.europe",
   199  					Tags: map[string]string{"region": "europe", "dc": "amsterdam"}},
   200  				{Name: "nomad-01.tam.us-east",
   201  					Tags: map[string]string{"region": "us-east", "dc": "tampa"}},
   202  				{Name: "nomad-02.tam.us-east",
   203  					Tags: map[string]string{"region": "us-east", "dc": "tampa"}},
   204  			},
   205  		},
   206  		{
   207  			[]*AgentMember{
   208  				{Name: "nomad-02.ber.europe",
   209  					Tags: map[string]string{"region": "europe", "dc": "berlin"}},
   210  				{Name: "nomad-02.ams.europe",
   211  					Tags: map[string]string{"region": "europe", "dc": "amsterdam"}},
   212  				{Name: "nomad-01.ams.europe",
   213  					Tags: map[string]string{"region": "europe", "dc": "amsterdam"}},
   214  				{Name: "nomad-01.ber.europe",
   215  					Tags: map[string]string{"region": "europe", "dc": "berlin"}},
   216  			},
   217  			[]*AgentMember{
   218  				{Name: "nomad-01.ams.europe",
   219  					Tags: map[string]string{"region": "europe", "dc": "amsterdam"}},
   220  				{Name: "nomad-02.ams.europe",
   221  					Tags: map[string]string{"region": "europe", "dc": "amsterdam"}},
   222  				{Name: "nomad-01.ber.europe",
   223  					Tags: map[string]string{"region": "europe", "dc": "berlin"}},
   224  				{Name: "nomad-02.ber.europe",
   225  					Tags: map[string]string{"region": "europe", "dc": "berlin"}},
   226  			},
   227  		},
   228  		{
   229  			[]*AgentMember{
   230  				{Name: "nomad-1.global"},
   231  				{Name: "nomad-3.global"},
   232  				{Name: "nomad-2.global"},
   233  			},
   234  			[]*AgentMember{
   235  				{Name: "nomad-1.global"},
   236  				{Name: "nomad-2.global"},
   237  				{Name: "nomad-3.global"},
   238  			},
   239  		},
   240  	}
   241  	for _, tt := range sortTests {
   242  		sort.Sort(AgentMembersNameSort(tt.in))
   243  		if !reflect.DeepEqual(tt.in, tt.out) {
   244  			t.Errorf("\nexpected: %s\nget     : %s", tt.in, tt.out)
   245  		}
   246  	}
   247  }
   248  
   249  func TestAgent_Health(t *testing.T) {
   250  	t.Parallel()
   251  	assert := assert.New(t)
   252  	c, s := makeClient(t, nil, nil)
   253  	defer s.Stop()
   254  	a := c.Agent()
   255  
   256  	health, err := a.Health()
   257  	assert.Nil(err)
   258  	assert.True(health.Server.Ok)
   259  }