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  }