diff --git a/pkg/services/datasources/datasources.go b/pkg/services/datasources/datasources.go index 5b45fd4d96a..eee1f3a861f 100644 --- a/pkg/services/datasources/datasources.go +++ b/pkg/services/datasources/datasources.go @@ -39,6 +39,9 @@ type DataSourceService interface { // GetHTTPTransport gets a datasource specific HTTP transport. GetHTTPTransport(ctx context.Context, ds *DataSource, provider httpclient.Provider, customMiddlewares ...sdkhttpclient.Middleware) (http.RoundTripper, error) + // HTTPClientOptions returns the HTTP client options for the given datasource. + HTTPClientOptions(ctx context.Context, ds *DataSource) (*sdkhttpclient.Options, error) + // DecryptedValues decrypts the encrypted secureJSONData of the provided datasource and // returns the decrypted values. DecryptedValues(ctx context.Context, ds *DataSource) (map[string]string, error) diff --git a/pkg/services/datasources/fakes/fake_datasource_service.go b/pkg/services/datasources/fakes/fake_datasource_service.go index c23024b4e5b..659702782dd 100644 --- a/pkg/services/datasources/fakes/fake_datasource_service.go +++ b/pkg/services/datasources/fakes/fake_datasource_service.go @@ -5,6 +5,7 @@ import ( "net/http" sdkhttpclient "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" + sdkproxy "github.com/grafana/grafana-plugin-sdk-go/backend/proxy" "github.com/grafana/grafana/pkg/infra/httpclient" "github.com/grafana/grafana/pkg/services/datasources" @@ -121,6 +122,25 @@ func (s *FakeDataSourceService) GetHTTPTransport(ctx context.Context, ds *dataso return rt, nil } +func (s *FakeDataSourceService) HTTPClientOptions(ctx context.Context, ds *datasources.DataSource) (*sdkhttpclient.Options, error) { + opts := &sdkhttpclient.Options{ + Header: make(http.Header), + } + + if ds.JsonData != nil && ds.JsonData.Get("enableSecureSocksProxy").MustBool(false) { + opts.ProxyOptions = &sdkproxy.Options{ + Enabled: true, + DatasourceName: ds.UID, + DatasourceType: ds.Type, + Auth: &sdkproxy.AuthOptions{ + Username: ds.JsonData.Get("secureSocksProxyUsername").MustString(""), + }, + } + } + + return opts, nil +} + func (s *FakeDataSourceService) DecryptedValues(ctx context.Context, ds *datasources.DataSource) (map[string]string, error) { return make(map[string]string), nil } diff --git a/pkg/services/datasources/service/datasource.go b/pkg/services/datasources/service/datasource.go index bbaa4ab0822..be4acb39eb7 100644 --- a/pkg/services/datasources/service/datasource.go +++ b/pkg/services/datasources/service/datasource.go @@ -595,7 +595,7 @@ func (s *Service) GetHTTPTransport(ctx context.Context, ds *datasources.DataSour return t.roundTripper, nil } - opts, err := s.httpClientOptions(ctx, ds) + opts, err := s.HTTPClientOptions(ctx, ds) if err != nil { return nil, err } @@ -678,7 +678,7 @@ func (s *Service) DecryptedPassword(ctx context.Context, ds *datasources.DataSou return "", err } -func (s *Service) httpClientOptions(ctx context.Context, ds *datasources.DataSource) (*sdkhttpclient.Options, error) { +func (s *Service) HTTPClientOptions(ctx context.Context, ds *datasources.DataSource) (*sdkhttpclient.Options, error) { tlsOptions, err := s.dsTLSOptions(ctx, ds) if err != nil { return nil, err diff --git a/pkg/services/datasources/service/datasource_test.go b/pkg/services/datasources/service/datasource_test.go index 319f039814e..b41ffbc9051 100644 --- a/pkg/services/datasources/service/datasource_test.go +++ b/pkg/services/datasources/service/datasource_test.go @@ -1220,11 +1220,11 @@ func TestService_GetHttpTransport(t *testing.T) { require.NotNil(t, rt) tr := configuredTransport - opts, err := dsService.httpClientOptions(context.Background(), &ds) + opts, err := dsService.HTTPClientOptions(context.Background(), &ds) require.NoError(t, err) require.Equal(t, ds.JsonData.MustMap()["grafanaData"], opts.CustomOptions["grafanaData"]) - // make sure we can still marshal the JsonData after httpClientOptions (avoid cycles) + // make sure we can still marshal the JsonData after HTTPClientOptions (avoid cycles) _, err = ds.JsonData.MarshalJSON() require.NoError(t, err) @@ -1468,7 +1468,7 @@ func TestService_getProxySettings(t *testing.T) { Type: "Graphite", } - opts, err := dsService.httpClientOptions(context.Background(), &ds) + opts, err := dsService.HTTPClientOptions(context.Background(), &ds) require.NoError(t, err) require.Nil(t, opts.ProxyOptions) }) @@ -1486,7 +1486,7 @@ func TestService_getProxySettings(t *testing.T) { JsonData: sjson, } - opts, err := dsService.httpClientOptions(context.Background(), &ds) + opts, err := dsService.HTTPClientOptions(context.Background(), &ds) require.NoError(t, err) require.True(t, opts.ProxyOptions.Enabled) require.Equal(t, opts.ProxyOptions.Auth.Username, ds.UID) @@ -1518,7 +1518,7 @@ func TestService_getProxySettings(t *testing.T) { err = secretsStore.Set(context.Background(), ds.OrgID, ds.Name, secretskvs.DataSourceSecretType, string(secureJsonData)) require.NoError(t, err) - opts, err := dsService.httpClientOptions(context.Background(), &ds) + opts, err := dsService.HTTPClientOptions(context.Background(), &ds) require.NoError(t, err) require.True(t, opts.ProxyOptions.Enabled) require.Equal(t, opts.ProxyOptions.Auth.Username, user)