github.com/djenriquez/nomad-1@v0.8.1/command/agent/stats_endpoint_test.go (about) 1 package agent 2 3 import ( 4 "fmt" 5 "net/http" 6 "net/http/httptest" 7 "testing" 8 9 "github.com/hashicorp/nomad/acl" 10 "github.com/hashicorp/nomad/helper/uuid" 11 "github.com/hashicorp/nomad/nomad/mock" 12 "github.com/hashicorp/nomad/nomad/structs" 13 "github.com/hashicorp/nomad/testutil" 14 "github.com/stretchr/testify/assert" 15 "github.com/stretchr/testify/require" 16 ) 17 18 func TestClientStatsRequest(t *testing.T) { 19 t.Parallel() 20 require := require.New(t) 21 httpTest(t, nil, func(s *TestAgent) { 22 23 // Local node, local resp 24 { 25 req, err := http.NewRequest("GET", "/v1/client/stats/?since=foo", nil) 26 if err != nil { 27 t.Fatalf("err: %v", err) 28 } 29 30 respW := httptest.NewRecorder() 31 _, err = s.Server.ClientStatsRequest(respW, req) 32 if err != nil { 33 t.Fatalf("unexpected err: %v", err) 34 } 35 } 36 37 // Local node, server resp 38 { 39 srv := s.server 40 s.server = nil 41 42 req, err := http.NewRequest("GET", fmt.Sprintf("/v1/client/stats?node_id=%s", uuid.Generate()), nil) 43 require.Nil(err) 44 45 respW := httptest.NewRecorder() 46 _, err = s.Server.ClientStatsRequest(respW, req) 47 require.NotNil(err) 48 require.Contains(err.Error(), "Unknown node") 49 50 s.server = srv 51 } 52 53 // no client, server resp 54 { 55 c := s.client 56 s.client = nil 57 58 testutil.WaitForResult(func() (bool, error) { 59 n, err := s.server.State().NodeByID(nil, c.NodeID()) 60 if err != nil { 61 return false, err 62 } 63 return n != nil, nil 64 }, func(err error) { 65 t.Fatalf("should have client: %v", err) 66 }) 67 68 req, err := http.NewRequest("GET", fmt.Sprintf("/v1/client/stats?node_id=%s", c.NodeID()), nil) 69 require.Nil(err) 70 71 respW := httptest.NewRecorder() 72 _, err = s.Server.ClientStatsRequest(respW, req) 73 require.NotNil(err) 74 75 // The dev agent uses in-mem RPC so just assert the no route error 76 require.Contains(err.Error(), structs.ErrNoNodeConn.Error()) 77 78 s.client = c 79 } 80 }) 81 } 82 83 func TestClientStatsRequest_ACL(t *testing.T) { 84 t.Parallel() 85 assert := assert.New(t) 86 httpACLTest(t, nil, func(s *TestAgent) { 87 state := s.Agent.server.State() 88 req, err := http.NewRequest("GET", "/v1/client/stats/", nil) 89 assert.Nil(err) 90 91 // Try request without a token and expect failure 92 { 93 respW := httptest.NewRecorder() 94 _, err := s.Server.ClientStatsRequest(respW, req) 95 assert.NotNil(err) 96 assert.Equal(err.Error(), structs.ErrPermissionDenied.Error()) 97 } 98 99 // Try request with an invalid token and expect failure 100 { 101 respW := httptest.NewRecorder() 102 token := mock.CreatePolicyAndToken(t, state, 1005, "invalid", mock.NodePolicy(acl.PolicyDeny)) 103 setToken(req, token) 104 _, err := s.Server.ClientStatsRequest(respW, req) 105 assert.NotNil(err) 106 assert.Equal(err.Error(), structs.ErrPermissionDenied.Error()) 107 } 108 109 // Try request with a valid token 110 { 111 respW := httptest.NewRecorder() 112 token := mock.CreatePolicyAndToken(t, state, 1007, "valid", mock.NodePolicy(acl.PolicyRead)) 113 setToken(req, token) 114 _, err := s.Server.ClientStatsRequest(respW, req) 115 assert.Nil(err) 116 assert.Equal(http.StatusOK, respW.Code) 117 } 118 119 // Try request with a management token 120 { 121 respW := httptest.NewRecorder() 122 setToken(req, s.RootToken) 123 _, err := s.Server.ClientStatsRequest(respW, req) 124 assert.Nil(err) 125 assert.Equal(http.StatusOK, respW.Code) 126 } 127 }) 128 }