github.com/hooklift/nomad@v0.5.7-0.20170407200202-db11e7dd7b55/command/agent/agent_endpoint_test.go (about)

     1  package agent
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  	"net/http"
     8  	"net/http/httptest"
     9  	"strings"
    10  	"testing"
    11  
    12  	"github.com/hashicorp/nomad/nomad/structs"
    13  )
    14  
    15  func TestHTTP_AgentSelf(t *testing.T) {
    16  	httpTest(t, nil, func(s *TestServer) {
    17  		// Make the HTTP request
    18  		req, err := http.NewRequest("GET", "/v1/agent/self", nil)
    19  		if err != nil {
    20  			t.Fatalf("err: %v", err)
    21  		}
    22  		respW := httptest.NewRecorder()
    23  
    24  		// Make the request
    25  		obj, err := s.Server.AgentSelfRequest(respW, req)
    26  		if err != nil {
    27  			t.Fatalf("err: %v", err)
    28  		}
    29  
    30  		// Check the job
    31  		self := obj.(agentSelf)
    32  		if self.Config == nil {
    33  			t.Fatalf("bad: %#v", self)
    34  		}
    35  		if len(self.Stats) == 0 {
    36  			t.Fatalf("bad: %#v", self)
    37  		}
    38  	})
    39  }
    40  
    41  func TestHTTP_AgentJoin(t *testing.T) {
    42  	httpTest(t, nil, func(s *TestServer) {
    43  		// Determine the join address
    44  		member := s.Agent.Server().LocalMember()
    45  		addr := fmt.Sprintf("%s:%d", member.Addr, member.Port)
    46  
    47  		// Make the HTTP request
    48  		req, err := http.NewRequest("PUT",
    49  			fmt.Sprintf("/v1/agent/join?address=%s&address=%s", addr, addr), nil)
    50  		if err != nil {
    51  			t.Fatalf("err: %v", err)
    52  		}
    53  		respW := httptest.NewRecorder()
    54  
    55  		// Make the request
    56  		obj, err := s.Server.AgentJoinRequest(respW, req)
    57  		if err != nil {
    58  			t.Fatalf("err: %v", err)
    59  		}
    60  
    61  		// Check the job
    62  		join := obj.(joinResult)
    63  		if join.NumJoined != 2 {
    64  			t.Fatalf("bad: %#v", join)
    65  		}
    66  		if join.Error != "" {
    67  			t.Fatalf("bad: %#v", join)
    68  		}
    69  	})
    70  }
    71  
    72  func TestHTTP_AgentMembers(t *testing.T) {
    73  	httpTest(t, nil, func(s *TestServer) {
    74  		// Make the HTTP request
    75  		req, err := http.NewRequest("GET", "/v1/agent/members", nil)
    76  		if err != nil {
    77  			t.Fatalf("err: %v", err)
    78  		}
    79  		respW := httptest.NewRecorder()
    80  
    81  		// Make the request
    82  		obj, err := s.Server.AgentMembersRequest(respW, req)
    83  		if err != nil {
    84  			t.Fatalf("err: %v", err)
    85  		}
    86  
    87  		// Check the job
    88  		members := obj.(structs.ServerMembersResponse)
    89  		if len(members.Members) != 1 {
    90  			t.Fatalf("bad: %#v", members.Members)
    91  		}
    92  	})
    93  }
    94  
    95  func TestHTTP_AgentForceLeave(t *testing.T) {
    96  	httpTest(t, nil, func(s *TestServer) {
    97  		// Make the HTTP request
    98  		req, err := http.NewRequest("PUT", "/v1/agent/force-leave?node=foo", nil)
    99  		if err != nil {
   100  			t.Fatalf("err: %v", err)
   101  		}
   102  		respW := httptest.NewRecorder()
   103  
   104  		// Make the request
   105  		_, err = s.Server.AgentForceLeaveRequest(respW, req)
   106  		if err != nil {
   107  			t.Fatalf("err: %v", err)
   108  		}
   109  	})
   110  }
   111  
   112  func TestHTTP_AgentSetServers(t *testing.T) {
   113  	httpTest(t, nil, func(s *TestServer) {
   114  		// Establish a baseline number of servers
   115  		req, err := http.NewRequest("GET", "/v1/agent/servers", nil)
   116  		if err != nil {
   117  			t.Fatalf("err: %s", err)
   118  		}
   119  		respW := httptest.NewRecorder()
   120  
   121  		// Create the request
   122  		req, err = http.NewRequest("PUT", "/v1/agent/servers", nil)
   123  		if err != nil {
   124  			t.Fatalf("err: %s", err)
   125  		}
   126  
   127  		// Send the request
   128  		respW = httptest.NewRecorder()
   129  		_, err = s.Server.AgentServersRequest(respW, req)
   130  		if err == nil || !strings.Contains(err.Error(), "missing server address") {
   131  			t.Fatalf("expected missing servers error, got: %#v", err)
   132  		}
   133  
   134  		// Create a valid request
   135  		req, err = http.NewRequest("PUT", "/v1/agent/servers?address=127.0.0.1%3A4647&address=127.0.0.2%3A4647&address=127.0.0.3%3A4647", nil)
   136  		if err != nil {
   137  			t.Fatalf("err: %s", err)
   138  		}
   139  
   140  		// Send the request
   141  		respW = httptest.NewRecorder()
   142  		_, err = s.Server.AgentServersRequest(respW, req)
   143  		if err != nil {
   144  			t.Fatalf("err: %s", err)
   145  		}
   146  
   147  		// Retrieve the servers again
   148  		req, err = http.NewRequest("GET", "/v1/agent/servers", nil)
   149  		if err != nil {
   150  			t.Fatalf("err: %s", err)
   151  		}
   152  		respW = httptest.NewRecorder()
   153  
   154  		// Make the request and check the result
   155  		expected := map[string]bool{
   156  			"127.0.0.1:4647": true,
   157  			"127.0.0.2:4647": true,
   158  			"127.0.0.3:4647": true,
   159  		}
   160  		out, err := s.Server.AgentServersRequest(respW, req)
   161  		if err != nil {
   162  			t.Fatalf("err: %s", err)
   163  		}
   164  		servers := out.([]string)
   165  		if n := len(servers); n != len(expected) {
   166  			t.Fatalf("expected %d servers, got: %d: %v", len(expected), n, servers)
   167  		}
   168  		received := make(map[string]bool, len(servers))
   169  		for _, server := range servers {
   170  			received[server] = true
   171  		}
   172  		foundCount := 0
   173  		for k, _ := range received {
   174  			_, found := expected[k]
   175  			if found {
   176  				foundCount++
   177  			}
   178  		}
   179  		if foundCount != len(expected) {
   180  			t.Fatalf("bad servers result")
   181  		}
   182  	})
   183  }
   184  
   185  func TestHTTP_AgentListKeys(t *testing.T) {
   186  	key1 := "HS5lJ+XuTlYKWaeGYyG+/A=="
   187  
   188  	httpTest(t, func(c *Config) {
   189  		c.Server.EncryptKey = key1
   190  	}, func(s *TestServer) {
   191  		req, err := http.NewRequest("GET", "/v1/agent/keyring/list", nil)
   192  		if err != nil {
   193  			t.Fatalf("err: %s", err)
   194  		}
   195  		respW := httptest.NewRecorder()
   196  
   197  		out, err := s.Server.KeyringOperationRequest(respW, req)
   198  		if err != nil {
   199  			t.Fatalf("err: %s", err)
   200  		}
   201  		kresp := out.(structs.KeyringResponse)
   202  		if len(kresp.Keys) != 1 {
   203  			t.Fatalf("bad: %v", kresp)
   204  		}
   205  	})
   206  }
   207  
   208  func TestHTTP_AgentInstallKey(t *testing.T) {
   209  	key1 := "HS5lJ+XuTlYKWaeGYyG+/A=="
   210  	key2 := "wH1Bn9hlJ0emgWB1JttVRA=="
   211  
   212  	httpTest(t, func(c *Config) {
   213  		c.Server.EncryptKey = key1
   214  	}, func(s *TestServer) {
   215  		b, err := json.Marshal(&structs.KeyringRequest{Key: key2})
   216  		if err != nil {
   217  			t.Fatalf("err: %v", err)
   218  		}
   219  		req, err := http.NewRequest("GET", "/v1/agent/keyring/install", bytes.NewReader(b))
   220  		if err != nil {
   221  			t.Fatalf("err: %s", err)
   222  		}
   223  		respW := httptest.NewRecorder()
   224  
   225  		_, err = s.Server.KeyringOperationRequest(respW, req)
   226  		if err != nil {
   227  			t.Fatalf("err: %s", err)
   228  		}
   229  		req, err = http.NewRequest("GET", "/v1/agent/keyring/list", bytes.NewReader(b))
   230  		if err != nil {
   231  			t.Fatalf("err: %s", err)
   232  		}
   233  		respW = httptest.NewRecorder()
   234  
   235  		out, err := s.Server.KeyringOperationRequest(respW, req)
   236  		if err != nil {
   237  			t.Fatalf("err: %s", err)
   238  		}
   239  		kresp := out.(structs.KeyringResponse)
   240  		if len(kresp.Keys) != 2 {
   241  			t.Fatalf("bad: %v", kresp)
   242  		}
   243  	})
   244  }
   245  
   246  func TestHTTP_AgentRemoveKey(t *testing.T) {
   247  	key1 := "HS5lJ+XuTlYKWaeGYyG+/A=="
   248  	key2 := "wH1Bn9hlJ0emgWB1JttVRA=="
   249  
   250  	httpTest(t, func(c *Config) {
   251  		c.Server.EncryptKey = key1
   252  	}, func(s *TestServer) {
   253  		b, err := json.Marshal(&structs.KeyringRequest{Key: key2})
   254  		if err != nil {
   255  			t.Fatalf("err: %v", err)
   256  		}
   257  
   258  		req, err := http.NewRequest("GET", "/v1/agent/keyring/install", bytes.NewReader(b))
   259  		if err != nil {
   260  			t.Fatalf("err: %s", err)
   261  		}
   262  		respW := httptest.NewRecorder()
   263  		_, err = s.Server.KeyringOperationRequest(respW, req)
   264  		if err != nil {
   265  			t.Fatalf("err: %s", err)
   266  		}
   267  
   268  		req, err = http.NewRequest("GET", "/v1/agent/keyring/remove", bytes.NewReader(b))
   269  		if err != nil {
   270  			t.Fatalf("err: %s", err)
   271  		}
   272  		respW = httptest.NewRecorder()
   273  		if _, err = s.Server.KeyringOperationRequest(respW, req); err != nil {
   274  			t.Fatalf("err: %s", err)
   275  		}
   276  
   277  		req, err = http.NewRequest("GET", "/v1/agent/keyring/list", nil)
   278  		if err != nil {
   279  			t.Fatalf("err: %s", err)
   280  		}
   281  		respW = httptest.NewRecorder()
   282  		out, err := s.Server.KeyringOperationRequest(respW, req)
   283  		if err != nil {
   284  			t.Fatalf("err: %s", err)
   285  		}
   286  		kresp := out.(structs.KeyringResponse)
   287  		if len(kresp.Keys) != 1 {
   288  			t.Fatalf("bad: %v", kresp)
   289  		}
   290  	})
   291  }