github.com/ferranbt/nomad@v0.9.3-0.20190607002617-85c449b7667c/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 // client stats from server, should not error 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.Nil(err) 74 s.client = c 75 } 76 }) 77 } 78 79 func TestClientStatsRequest_ACL(t *testing.T) { 80 t.Parallel() 81 assert := assert.New(t) 82 httpACLTest(t, nil, func(s *TestAgent) { 83 state := s.Agent.server.State() 84 req, err := http.NewRequest("GET", "/v1/client/stats/", nil) 85 assert.Nil(err) 86 87 // Try request without a token and expect failure 88 { 89 respW := httptest.NewRecorder() 90 _, err := s.Server.ClientStatsRequest(respW, req) 91 assert.NotNil(err) 92 assert.Equal(err.Error(), structs.ErrPermissionDenied.Error()) 93 } 94 95 // Try request with an invalid token and expect failure 96 { 97 respW := httptest.NewRecorder() 98 token := mock.CreatePolicyAndToken(t, state, 1005, "invalid", mock.NodePolicy(acl.PolicyDeny)) 99 setToken(req, token) 100 _, err := s.Server.ClientStatsRequest(respW, req) 101 assert.NotNil(err) 102 assert.Equal(err.Error(), structs.ErrPermissionDenied.Error()) 103 } 104 105 // Try request with a valid token 106 { 107 respW := httptest.NewRecorder() 108 token := mock.CreatePolicyAndToken(t, state, 1007, "valid", mock.NodePolicy(acl.PolicyRead)) 109 setToken(req, token) 110 _, err := s.Server.ClientStatsRequest(respW, req) 111 assert.Nil(err) 112 assert.Equal(http.StatusOK, respW.Code) 113 } 114 115 // Try request with a management token 116 { 117 respW := httptest.NewRecorder() 118 setToken(req, s.RootToken) 119 _, err := s.Server.ClientStatsRequest(respW, req) 120 assert.Nil(err) 121 assert.Equal(http.StatusOK, respW.Code) 122 } 123 }) 124 }