mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			114 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
| package elasticsearch
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"context"
 | |
| 	"encoding/json"
 | |
| 	"fmt"
 | |
| 	"io"
 | |
| 	"net/http"
 | |
| 	"net/http/httptest"
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/stretchr/testify/require"
 | |
| 
 | |
| 	"github.com/grafana/grafana/pkg/api/dtos"
 | |
| 	"github.com/grafana/grafana/pkg/components/simplejson"
 | |
| 	"github.com/grafana/grafana/pkg/services/datasources"
 | |
| 	"github.com/grafana/grafana/pkg/services/org"
 | |
| 	"github.com/grafana/grafana/pkg/services/user"
 | |
| 	"github.com/grafana/grafana/pkg/tests/testinfra"
 | |
| )
 | |
| 
 | |
| func TestIntegrationElasticsearch(t *testing.T) {
 | |
| 	if testing.Short() {
 | |
| 		t.Skip("skipping integration test")
 | |
| 	}
 | |
| 	dir, path := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{
 | |
| 		DisableAnonymous: true,
 | |
| 	})
 | |
| 
 | |
| 	grafanaListeningAddr, testEnv := testinfra.StartGrafanaEnv(t, dir, path)
 | |
| 	ctx := context.Background()
 | |
| 
 | |
| 	u := testinfra.CreateUser(t, testEnv.SQLStore, user.CreateUserCommand{
 | |
| 		DefaultOrgRole: string(org.RoleAdmin),
 | |
| 		Password:       "admin",
 | |
| 		Login:          "admin",
 | |
| 	})
 | |
| 
 | |
| 	var outgoingRequest *http.Request
 | |
| 	outgoingServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 | |
| 		outgoingRequest = r
 | |
| 		w.WriteHeader(http.StatusUnauthorized)
 | |
| 	}))
 | |
| 	t.Cleanup(outgoingServer.Close)
 | |
| 
 | |
| 	jsonData := simplejson.NewFromAny(map[string]interface{}{
 | |
| 		"httpMethod":      "post",
 | |
| 		"httpHeaderName1": "X-CUSTOM-HEADER",
 | |
| 		"timeField":       "@timestamp",
 | |
| 	})
 | |
| 	secureJSONData := map[string]string{
 | |
| 		"basicAuthPassword": "basicAuthPassword",
 | |
| 		"httpHeaderValue1":  "custom-header-value",
 | |
| 	}
 | |
| 
 | |
| 	uid := "es"
 | |
| 	_, err := testEnv.Server.HTTPServer.DataSourcesService.AddDataSource(ctx, &datasources.AddDataSourceCommand{
 | |
| 		OrgID:          u.OrgID,
 | |
| 		Access:         datasources.DS_ACCESS_PROXY,
 | |
| 		Name:           "Elasticsearch",
 | |
| 		Type:           datasources.DS_ES,
 | |
| 		UID:            uid,
 | |
| 		URL:            outgoingServer.URL,
 | |
| 		BasicAuth:      true,
 | |
| 		BasicAuthUser:  "basicAuthUser",
 | |
| 		JsonData:       jsonData,
 | |
| 		SecureJsonData: secureJSONData,
 | |
| 	})
 | |
| 	require.NoError(t, err)
 | |
| 
 | |
| 	t.Run("When calling /api/ds/query should set expected headers on outgoing HTTP request", func(t *testing.T) {
 | |
| 		query := simplejson.NewFromAny(map[string]interface{}{
 | |
| 			"datasource": map[string]interface{}{
 | |
| 				"uid": uid,
 | |
| 			},
 | |
| 			"rawQuery":  "*",
 | |
| 			"type":      "",
 | |
| 			"timeField": "@timestamp",
 | |
| 			"metrics": []interface{}{
 | |
| 				map[string]interface{}{
 | |
| 					"type": "logs",
 | |
| 				},
 | |
| 			},
 | |
| 		})
 | |
| 		buf1 := &bytes.Buffer{}
 | |
| 		err = json.NewEncoder(buf1).Encode(dtos.MetricRequest{
 | |
| 			From:    "now-1h",
 | |
| 			To:      "now",
 | |
| 			Queries: []*simplejson.Json{query},
 | |
| 		})
 | |
| 		require.NoError(t, err)
 | |
| 		u := fmt.Sprintf("http://admin:admin@%s/api/ds/query", grafanaListeningAddr)
 | |
| 		// nolint:gosec
 | |
| 		resp, err := http.Post(u, "application/json", buf1)
 | |
| 		require.NoError(t, err)
 | |
| 
 | |
| 		require.Equal(t, http.StatusInternalServerError, resp.StatusCode)
 | |
| 		t.Cleanup(func() {
 | |
| 			err := resp.Body.Close()
 | |
| 			require.NoError(t, err)
 | |
| 		})
 | |
| 		_, err = io.ReadAll(resp.Body)
 | |
| 		require.NoError(t, err)
 | |
| 
 | |
| 		require.NotNil(t, outgoingRequest)
 | |
| 		require.Equal(t, "custom-header-value", outgoingRequest.Header.Get("X-CUSTOM-HEADER"))
 | |
| 		username, pwd, ok := outgoingRequest.BasicAuth()
 | |
| 		require.True(t, ok)
 | |
| 		require.Equal(t, "basicAuthUser", username)
 | |
| 		require.Equal(t, "basicAuthPassword", pwd)
 | |
| 	})
 | |
| }
 |