diff --git a/pkg/tsdb/prometheus/healthcheck_test.go b/pkg/tsdb/prometheus/healthcheck_test.go index 65c69e69bcc..9a17cda32f8 100644 --- a/pkg/tsdb/prometheus/healthcheck_test.go +++ b/pkg/tsdb/prometheus/healthcheck_test.go @@ -10,8 +10,7 @@ import ( "github.com/grafana/grafana-plugin-sdk-go/backend" "github.com/grafana/grafana-plugin-sdk-go/backend/datasource" - sdkHttpClient "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" - "github.com/grafana/grafana/pkg/infra/httpclient" + "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/setting" "github.com/stretchr/testify/assert" @@ -58,21 +57,27 @@ func (rt *healthCheckFailRoundTripper) RoundTrip(req *http.Request) (*http.Respo }, nil } -func (provider *healthCheckProvider[T]) New(opts ...sdkHttpClient.Options) (*http.Client, error) { +func (provider *healthCheckProvider[T]) New(opts ...httpclient.Options) (*http.Client, error) { client := &http.Client{} provider.RoundTripper = new(T) client.Transport = *provider.RoundTripper return client, nil } -func (provider *healthCheckProvider[T]) GetTransport(opts ...sdkHttpClient.Options) (http.RoundTripper, error) { +func (provider *healthCheckProvider[T]) GetTransport(opts ...httpclient.Options) (http.RoundTripper, error) { return *new(T), nil } -func getMockProvider[T http.RoundTripper]() *healthCheckProvider[T] { - return &healthCheckProvider[T]{ +func getMockProvider[T http.RoundTripper]() *httpclient.Provider { + p := &healthCheckProvider[T]{ RoundTripper: new(T), } + anotherFN := func(o httpclient.Options, next http.RoundTripper) http.RoundTripper { + return *p.RoundTripper + } + fn := httpclient.MiddlewareFunc(anotherFN) + mid := httpclient.NamedMiddlewareFunc("mock", fn) + return httpclient.NewProvider(httpclient.ProviderOptions{Middlewares: []httpclient.Middleware{mid}}) } func Test_healthcheck(t *testing.T) { diff --git a/pkg/tsdb/prometheus/heuristics_test.go b/pkg/tsdb/prometheus/heuristics_test.go index 4859d928ae2..26ae2f630d5 100644 --- a/pkg/tsdb/prometheus/heuristics_test.go +++ b/pkg/tsdb/prometheus/heuristics_test.go @@ -13,17 +13,11 @@ import ( "github.com/grafana/grafana-plugin-sdk-go/backend" "github.com/grafana/grafana-plugin-sdk-go/backend/datasource" - sdkHttpClient "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" - "github.com/grafana/grafana/pkg/infra/httpclient" + "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/setting" ) -type heuristicsProvider struct { - httpclient.Provider - http.RoundTripper -} - type heuristicsSuccessRoundTripper struct { res io.ReadCloser status int @@ -40,20 +34,13 @@ func (rt *heuristicsSuccessRoundTripper) RoundTrip(req *http.Request) (*http.Res }, nil } -func (provider *heuristicsProvider) New(opts ...sdkHttpClient.Options) (*http.Client, error) { - client := &http.Client{} - client.Transport = provider.RoundTripper - return client, nil -} - -func (provider *heuristicsProvider) GetTransport(opts ...sdkHttpClient.Options) (http.RoundTripper, error) { - return provider.RoundTripper, nil -} - -func getHeuristicsMockProvider(rt http.RoundTripper) *heuristicsProvider { - return &heuristicsProvider{ - RoundTripper: rt, +func newHeuristicsSDKProvider(hrt heuristicsSuccessRoundTripper) *httpclient.Provider { + anotherFN := func(o httpclient.Options, next http.RoundTripper) http.RoundTripper { + return &hrt } + fn := httpclient.MiddlewareFunc(anotherFN) + mid := httpclient.NamedMiddlewareFunc("mock", fn) + return httpclient.NewProvider(httpclient.ProviderOptions{Middlewares: []httpclient.Middleware{mid}}) } func Test_GetHeuristics(t *testing.T) { @@ -62,7 +49,8 @@ func Test_GetHeuristics(t *testing.T) { res: io.NopCloser(strings.NewReader("{\"status\":\"success\",\"data\":{\"version\":\"1.0\"}}")), status: http.StatusOK, } - httpProvider := getHeuristicsMockProvider(&rt) + //httpProvider := getHeuristicsMockProvider(&rt) + httpProvider := newHeuristicsSDKProvider(rt) s := &Service{ im: datasource.NewInstanceManager(newInstanceSettings(httpProvider, &setting.Cfg{}, &featuremgmt.FeatureManager{}, nil, backend.NewLoggerWith("logger", "test"))), } @@ -82,7 +70,7 @@ func Test_GetHeuristics(t *testing.T) { res: io.NopCloser(strings.NewReader("{\"status\":\"success\",\"data\":{\"features\":{\"foo\":\"bar\"},\"version\":\"1.0\"}}")), status: http.StatusOK, } - httpProvider := getHeuristicsMockProvider(&rt) + httpProvider := newHeuristicsSDKProvider(rt) s := &Service{ im: datasource.NewInstanceManager(newInstanceSettings(httpProvider, &setting.Cfg{}, &featuremgmt.FeatureManager{}, nil, backend.NewLoggerWith("logger", "test"))), } diff --git a/pkg/tsdb/prometheus/prometheus.go b/pkg/tsdb/prometheus/prometheus.go index 869a1a576fb..c5e42ea05b8 100644 --- a/pkg/tsdb/prometheus/prometheus.go +++ b/pkg/tsdb/prometheus/prometheus.go @@ -14,7 +14,7 @@ import ( "github.com/patrickmn/go-cache" apiv1 "github.com/prometheus/client_golang/api/prometheus/v1" - "github.com/grafana/grafana/pkg/infra/httpclient" + "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" "github.com/grafana/grafana/pkg/infra/tracing" "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/setting" @@ -36,7 +36,7 @@ type instance struct { versionCache *cache.Cache } -func ProvideService(httpClientProvider httpclient.Provider, cfg *setting.Cfg, features featuremgmt.FeatureToggles, tracer tracing.Tracer) *Service { +func ProvideService(httpClientProvider *httpclient.Provider, cfg *setting.Cfg, features featuremgmt.FeatureToggles, tracer tracing.Tracer) *Service { plog := backend.NewLoggerWith("logger", "tsdb.prometheus") plog.Debug("Initializing") return &Service{ @@ -46,7 +46,7 @@ func ProvideService(httpClientProvider httpclient.Provider, cfg *setting.Cfg, fe } } -func newInstanceSettings(httpClientProvider httpclient.Provider, cfg *setting.Cfg, features featuremgmt.FeatureToggles, tracer tracing.Tracer, log log.Logger) datasource.InstanceFactoryFunc { +func newInstanceSettings(httpClientProvider *httpclient.Provider, cfg *setting.Cfg, features featuremgmt.FeatureToggles, tracer tracing.Tracer, log log.Logger) datasource.InstanceFactoryFunc { return func(ctx context.Context, settings backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) { // Creates a http roundTripper. opts, err := client.CreateTransportOptions(ctx, settings, cfg, log) diff --git a/pkg/tsdb/prometheus/prometheus_test.go b/pkg/tsdb/prometheus/prometheus_test.go index 3dc85c3f23e..1b476cc3b0d 100644 --- a/pkg/tsdb/prometheus/prometheus_test.go +++ b/pkg/tsdb/prometheus/prometheus_test.go @@ -9,12 +9,10 @@ import ( "github.com/grafana/grafana-plugin-sdk-go/backend" "github.com/grafana/grafana-plugin-sdk-go/backend/datasource" - sdkHttpClient "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" - "github.com/stretchr/testify/require" - - "github.com/grafana/grafana/pkg/infra/httpclient" + "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/setting" + "github.com/stretchr/testify/require" ) type fakeSender struct{} @@ -43,22 +41,33 @@ type fakeHTTPClientProvider struct { Roundtripper *fakeRoundtripper } -func (provider *fakeHTTPClientProvider) New(opts ...sdkHttpClient.Options) (*http.Client, error) { +func (provider *fakeHTTPClientProvider) New(opts ...httpclient.Options) (*http.Client, error) { client := &http.Client{} provider.Roundtripper = &fakeRoundtripper{} client.Transport = provider.Roundtripper return client, nil } -func (provider *fakeHTTPClientProvider) GetTransport(opts ...sdkHttpClient.Options) (http.RoundTripper, error) { +func (provider *fakeHTTPClientProvider) GetTransport(opts ...httpclient.Options) (http.RoundTripper, error) { return &fakeRoundtripper{}, nil } +func getMockPromTestSDKProvider(f *fakeHTTPClientProvider) *httpclient.Provider { + anotherFN := func(o httpclient.Options, next http.RoundTripper) http.RoundTripper { + _, _ = f.New() + return f.Roundtripper + } + fn := httpclient.MiddlewareFunc(anotherFN) + mid := httpclient.NamedMiddlewareFunc("mock", fn) + return httpclient.NewProvider(httpclient.ProviderOptions{Middlewares: []httpclient.Middleware{mid}}) +} + func TestService(t *testing.T) { t.Run("Service", func(t *testing.T) { t.Run("CallResource", func(t *testing.T) { t.Run("creates correct request", func(t *testing.T) { - httpProvider := &fakeHTTPClientProvider{} + f := &fakeHTTPClientProvider{} + httpProvider := getMockPromTestSDKProvider(f) service := &Service{ im: datasource.NewInstanceManager(newInstanceSettings(httpProvider, &setting.Cfg{}, &featuremgmt.FeatureManager{}, nil, backend.NewLoggerWith("logger", "test"))), } @@ -98,12 +107,12 @@ func TestService(t *testing.T) { "Content-Type": {"application/x-www-form-urlencoded"}, "Idempotency-Key": []string(nil), }, - httpProvider.Roundtripper.Req.Header) - require.Equal(t, http.MethodPost, httpProvider.Roundtripper.Req.Method) - body, err := io.ReadAll(httpProvider.Roundtripper.Req.Body) + f.Roundtripper.Req.Header) + require.Equal(t, http.MethodPost, f.Roundtripper.Req.Method) + body, err := io.ReadAll(f.Roundtripper.Req.Body) require.NoError(t, err) require.Equal(t, []byte("match%5B%5D: ALERTS\nstart: 1655271408\nend: 1655293008"), body) - require.Equal(t, "http://localhost:9090/api/v1/series", httpProvider.Roundtripper.Req.URL.String()) + require.Equal(t, "http://localhost:9090/api/v1/series", f.Roundtripper.Req.URL.String()) }) }) }) diff --git a/pkg/tsdb/prometheus/querydata/request_test.go b/pkg/tsdb/prometheus/querydata/request_test.go index c98613d0f38..a66b42e33c6 100644 --- a/pkg/tsdb/prometheus/querydata/request_test.go +++ b/pkg/tsdb/prometheus/querydata/request_test.go @@ -11,9 +11,6 @@ import ( "testing" "time" - "github.com/grafana/grafana-plugin-sdk-go/backend" - sdkhttpclient "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" - "github.com/grafana/grafana-plugin-sdk-go/data" apiv1 "github.com/prometheus/client_golang/api/prometheus/v1" p "github.com/prometheus/common/model" "github.com/stretchr/testify/require" @@ -22,8 +19,10 @@ import ( "github.com/grafana/kindsys" + "github.com/grafana/grafana-plugin-sdk-go/backend" + "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" "github.com/grafana/grafana-plugin-sdk-go/backend/log" - "github.com/grafana/grafana/pkg/infra/httpclient" + "github.com/grafana/grafana-plugin-sdk-go/data" "github.com/grafana/grafana/pkg/infra/tracing" "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/tsdb/prometheus/client" @@ -430,8 +429,8 @@ type testContext struct { func setup() (*testContext, error) { tracer := tracing.InitializeTracerForTest() httpProvider := &fakeHttpClientProvider{ - opts: sdkhttpclient.Options{ - Timeouts: &sdkhttpclient.DefaultTimeoutOptions, + opts: httpclient.Options{ + Timeouts: &httpclient.DefaultTimeoutOptions, }, res: &http.Response{ StatusCode: 200, @@ -473,14 +472,14 @@ func (f *fakeFeatureToggles) IsEnabled(feature string) bool { type fakeHttpClientProvider struct { httpclient.Provider - opts sdkhttpclient.Options + opts httpclient.Options req *http.Request res *http.Response } -func (p *fakeHttpClientProvider) New(opts ...sdkhttpclient.Options) (*http.Client, error) { +func (p *fakeHttpClientProvider) New(opts ...httpclient.Options) (*http.Client, error) { p.opts = opts[0] - c, err := sdkhttpclient.New(opts[0]) + c, err := httpclient.New(opts[0]) if err != nil { return nil, err } @@ -488,7 +487,7 @@ func (p *fakeHttpClientProvider) New(opts ...sdkhttpclient.Options) (*http.Clien return c, nil } -func (p *fakeHttpClientProvider) GetTransport(opts ...sdkhttpclient.Options) (http.RoundTripper, error) { +func (p *fakeHttpClientProvider) GetTransport(opts ...httpclient.Options) (http.RoundTripper, error) { p.opts = opts[0] return http.DefaultTransport, nil }