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  }