@ -18,6 +18,7 @@ import (
"github.com/grafana/grafana/pkg/infra/httpclient"
"github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/plugins"
acmock "github.com/grafana/grafana/pkg/services/accesscontrol/mock"
"github.com/grafana/grafana/pkg/services/datasources"
"github.com/grafana/grafana/pkg/services/oauthtoken"
"github.com/grafana/grafana/pkg/services/secrets"
@ -125,7 +126,7 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
t . Run ( "When matching route path" , func ( t * testing . T ) {
ctx , req := setUp ( )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( ds , routes , ctx , "api/v4/some/method" , cfg , httpClientProvider ,
& oauthtoken . Service { } , dsService )
require . NoError ( t , err )
@ -138,7 +139,7 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
t . Run ( "When matching route path and has dynamic url" , func ( t * testing . T ) {
ctx , req := setUp ( )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( ds , routes , ctx , "api/common/some/method" , cfg , httpClientProvider , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )
proxy . matchedRoute = routes [ 3 ]
@ -150,7 +151,7 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
t . Run ( "When matching route path with no url" , func ( t * testing . T ) {
ctx , req := setUp ( )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( ds , routes , ctx , "" , cfg , httpClientProvider , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )
proxy . matchedRoute = routes [ 4 ]
@ -161,7 +162,7 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
t . Run ( "When matching route path and has dynamic body" , func ( t * testing . T ) {
ctx , req := setUp ( )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( ds , routes , ctx , "api/body" , cfg , httpClientProvider , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )
proxy . matchedRoute = routes [ 5 ]
@ -175,7 +176,7 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
t . Run ( "Validating request" , func ( t * testing . T ) {
t . Run ( "plugin route with valid role" , func ( t * testing . T ) {
ctx , _ := setUp ( )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( ds , routes , ctx , "api/v4/some/method" , cfg , httpClientProvider , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )
err = proxy . validateRequest ( )
@ -184,7 +185,7 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
t . Run ( "plugin route with admin role and user is editor" , func ( t * testing . T ) {
ctx , _ := setUp ( )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( ds , routes , ctx , "api/admin" , cfg , httpClientProvider , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )
err = proxy . validateRequest ( )
@ -194,7 +195,7 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
t . Run ( "plugin route with admin role and user is admin" , func ( t * testing . T ) {
ctx , _ := setUp ( )
ctx . SignedInUser . OrgRole = models . ROLE_ADMIN
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( ds , routes , ctx , "api/admin" , cfg , httpClientProvider , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )
err = proxy . validateRequest ( )
@ -285,7 +286,7 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
} ,
}
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( ds , routes , ctx , "pathwithtoken1" , cfg , httpClientProvider , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )
ApplyRoute ( proxy . ctx . Req . Context ( ) , req , proxy . proxyPath , routes [ 0 ] , dsInfo , cfg )
@ -301,7 +302,7 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
req , err := http . NewRequest ( "GET" , "http://localhost/asd" , nil )
require . NoError ( t , err )
client = newFakeHTTPClient ( t , json2 )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( ds , routes , ctx , "pathwithtoken2" , cfg , httpClientProvider , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )
ApplyRoute ( proxy . ctx . Req . Context ( ) , req , proxy . proxyPath , routes [ 1 ] , dsInfo , cfg )
@ -318,7 +319,7 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
require . NoError ( t , err )
client = newFakeHTTPClient ( t , [ ] byte { } )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( ds , routes , ctx , "pathwithtoken1" , cfg , httpClientProvider , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )
ApplyRoute ( proxy . ctx . Req . Context ( ) , req , proxy . proxyPath , routes [ 0 ] , dsInfo , cfg )
@ -340,7 +341,7 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
ctx := & models . ReqContext { }
secretsService := secretsManager . SetupTestService ( t , fakes . NewFakeSecretsStore ( ) )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( ds , routes , ctx , "/render" , & setting . Cfg { BuildVersion : "5.3.0" } , httpClientProvider , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )
req , err := http . NewRequest ( http . MethodGet , "http://grafana.com/sub" , nil )
@ -366,7 +367,7 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
ctx := & models . ReqContext { }
var routes [ ] * plugins . Route
secretsService := secretsManager . SetupTestService ( t , fakes . NewFakeSecretsStore ( ) )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( ds , routes , ctx , "" , & setting . Cfg { } , httpClientProvider , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )
@ -390,7 +391,7 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
ctx := & models . ReqContext { }
var routes [ ] * plugins . Route
secretsService := secretsManager . SetupTestService ( t , fakes . NewFakeSecretsStore ( ) )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( ds , routes , ctx , "" , & setting . Cfg { } , httpClientProvider , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )
@ -418,7 +419,7 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
ctx := & models . ReqContext { }
var pluginRoutes [ ] * plugins . Route
secretsService := secretsManager . SetupTestService ( t , fakes . NewFakeSecretsStore ( ) )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( ds , pluginRoutes , ctx , "" , & setting . Cfg { } , httpClientProvider , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )
@ -441,7 +442,7 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
ctx := & models . ReqContext { }
var routes [ ] * plugins . Route
secretsService := secretsManager . SetupTestService ( t , fakes . NewFakeSecretsStore ( ) )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( ds , routes , ctx , "/path/to/folder/" , & setting . Cfg { } , httpClientProvider , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )
req , err := http . NewRequest ( http . MethodGet , "http://grafana.com/sub" , nil )
@ -505,7 +506,7 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
var routes [ ] * plugins . Route
secretsService := secretsManager . SetupTestService ( t , fakes . NewFakeSecretsStore ( ) )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( ds , routes , ctx , "/path/to/folder/" , & setting . Cfg { } , httpClientProvider , & mockAuthToken , dsService )
require . NoError ( t , err )
req , err = http . NewRequest ( http . MethodGet , "http://grafana.com/sub" , nil )
@ -635,7 +636,7 @@ func TestDataSourceProxy_requestHandling(t *testing.T) {
ctx , ds := setUp ( t )
var routes [ ] * plugins . Route
secretsService := secretsManager . SetupTestService ( t , fakes . NewFakeSecretsStore ( ) )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( ds , routes , ctx , "/render" , & setting . Cfg { } , httpClientProvider , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )
@ -653,7 +654,7 @@ func TestDataSourceProxy_requestHandling(t *testing.T) {
} )
var routes [ ] * plugins . Route
secretsService := secretsManager . SetupTestService ( t , fakes . NewFakeSecretsStore ( ) )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( ds , routes , ctx , "/render" , & setting . Cfg { } , httpClientProvider , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )
@ -675,7 +676,7 @@ func TestDataSourceProxy_requestHandling(t *testing.T) {
} )
var routes [ ] * plugins . Route
secretsService := secretsManager . SetupTestService ( t , fakes . NewFakeSecretsStore ( ) )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( ds , routes , ctx , "/render" , & setting . Cfg { } , httpClientProvider , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )
@ -700,7 +701,7 @@ func TestDataSourceProxy_requestHandling(t *testing.T) {
ctx . Req = httptest . NewRequest ( "GET" , "/api/datasources/proxy/1/path/%2Ftest%2Ftest%2F?query=%2Ftest%2Ftest%2F" , nil )
var routes [ ] * plugins . Route
secretsService := secretsManager . SetupTestService ( t , fakes . NewFakeSecretsStore ( ) )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( ds , routes , ctx , "/path/%2Ftest%2Ftest%2F" , & setting . Cfg { } , httpClientProvider , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )
@ -724,7 +725,7 @@ func TestNewDataSourceProxy_InvalidURL(t *testing.T) {
cfg := setting . Cfg { }
var routes [ ] * plugins . Route
secretsService := secretsManager . SetupTestService ( t , fakes . NewFakeSecretsStore ( ) )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
_ , err := NewDataSourceProxy ( & ds , routes , & ctx , "api/method" , & cfg , httpclient . NewProvider ( ) , & oauthtoken . Service { } , dsService )
require . Error ( t , err )
assert . True ( t , strings . HasPrefix ( err . Error ( ) , ` validation of data source URL "://host/root" failed ` ) )
@ -743,7 +744,7 @@ func TestNewDataSourceProxy_ProtocolLessURL(t *testing.T) {
var routes [ ] * plugins . Route
secretsService := secretsManager . SetupTestService ( t , fakes . NewFakeSecretsStore ( ) )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
_ , err := NewDataSourceProxy ( & ds , routes , & ctx , "api/method" , & cfg , httpclient . NewProvider ( ) , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )
@ -783,7 +784,7 @@ func TestNewDataSourceProxy_MSSQL(t *testing.T) {
var routes [ ] * plugins . Route
secretsService := secretsManager . SetupTestService ( t , fakes . NewFakeSecretsStore ( ) )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
p , err := NewDataSourceProxy ( & ds , routes , & ctx , "api/method" , & cfg , httpclient . NewProvider ( ) , & oauthtoken . Service { } , dsService )
if tc . err == nil {
require . NoError ( t , err )
@ -808,7 +809,7 @@ func getDatasourceProxiedRequest(t *testing.T, ctx *models.ReqContext, cfg *sett
var routes [ ] * plugins . Route
secretsService := secretsManager . SetupTestService ( t , fakes . NewFakeSecretsStore ( ) )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( ds , routes , ctx , "" , cfg , httpclient . NewProvider ( ) , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )
req , err := http . NewRequest ( http . MethodGet , "http://grafana.com/sub" , nil )
@ -928,7 +929,7 @@ func createAuthTest(t *testing.T, secretsService secrets.Service, dsType string,
func runDatasourceAuthTest ( t * testing . T , secretsService secrets . Service , test * testCase ) {
ctx := & models . ReqContext { }
var routes [ ] * plugins . Route
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( test . datasource , routes , ctx , "" , & setting . Cfg { } , httpclient . NewProvider ( ) , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )
@ -968,7 +969,7 @@ func Test_PathCheck(t *testing.T) {
}
ctx , _ := setUp ( )
secretsService := secretsManager . SetupTestService ( t , fakes . NewFakeSecretsStore ( ) )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService )
dsService := datasources . ProvideService ( bus . New ( ) , nil , secretsService , & acmock . Mock { } )
proxy , err := NewDataSourceProxy ( & models . DataSource { } , routes , ctx , "b" , & setting . Cfg { } , httpclient . NewProvider ( ) , & oauthtoken . Service { } , dsService )
require . NoError ( t , err )