InfluxDB: move datasource health check to backend (#52668)
* Move datasource health check to backend * Introduce healthcheck unit tests * Remove unused method
This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
package influxdb
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
|
||||
"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/backend/instancemgmt"
|
||||
"github.com/grafana/grafana/pkg/infra/httpclient"
|
||||
"github.com/grafana/grafana/pkg/infra/log"
|
||||
"github.com/grafana/grafana/pkg/tsdb/influxdb/models"
|
||||
)
|
||||
|
||||
type fakeHttpClientProvider struct {
|
||||
httpclient.Provider
|
||||
opts sdkhttpclient.Options
|
||||
res *http.Response
|
||||
rt RoundTripper
|
||||
}
|
||||
|
||||
func (p *fakeHttpClientProvider) New(opts ...sdkhttpclient.Options) (*http.Client, error) {
|
||||
p.opts = opts[0]
|
||||
c, err := sdkhttpclient.New(opts[0])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
c.Transport = p
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func (p *fakeHttpClientProvider) GetTransport(opts ...sdkhttpclient.Options) (http.RoundTripper, error) {
|
||||
p.opts = opts[0]
|
||||
return http.DefaultTransport, nil
|
||||
}
|
||||
|
||||
func (p *fakeHttpClientProvider) RoundTrip(req *http.Request) (*http.Response, error) {
|
||||
return p.rt.RoundTrip(req)
|
||||
}
|
||||
|
||||
type fakeInstance struct {
|
||||
version string
|
||||
fakeRoundTripper RoundTripper
|
||||
}
|
||||
|
||||
func (f *fakeInstance) Get(pluginContext backend.PluginContext) (instancemgmt.Instance, error) {
|
||||
fp := &fakeHttpClientProvider{
|
||||
opts: sdkhttpclient.Options{
|
||||
Timeouts: &sdkhttpclient.DefaultTimeoutOptions,
|
||||
},
|
||||
res: &http.Response{
|
||||
StatusCode: 200,
|
||||
Body: ioutil.NopCloser(bytes.NewReader([]byte(`{}`))),
|
||||
},
|
||||
rt: f.fakeRoundTripper,
|
||||
}
|
||||
|
||||
client, err := fp.New(sdkhttpclient.Options{})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &models.DatasourceInfo{
|
||||
HTTPClient: client,
|
||||
Token: "sometoken",
|
||||
URL: "https://awesome-influx.com",
|
||||
Database: "testdb",
|
||||
Version: f.version,
|
||||
HTTPMode: "GET",
|
||||
TimeInterval: "10s",
|
||||
DefaultBucket: "testbucket",
|
||||
Organization: "testorg",
|
||||
MaxSeries: 2,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (f *fakeInstance) Do(pluginContext backend.PluginContext, fn instancemgmt.InstanceCallbackFunc) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
type RoundTripper struct {
|
||||
Body string
|
||||
FileName string // filename (relative path of where it is being called)
|
||||
}
|
||||
|
||||
func (rt *RoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
|
||||
res := &http.Response{
|
||||
StatusCode: http.StatusOK,
|
||||
Status: "200 OK",
|
||||
Body: ioutil.NopCloser(bytes.NewBufferString("{}")),
|
||||
}
|
||||
if rt.Body != "" {
|
||||
res.Body = ioutil.NopCloser(bytes.NewBufferString(rt.Body))
|
||||
}
|
||||
if rt.FileName != "" {
|
||||
b, err := ioutil.ReadFile(rt.FileName)
|
||||
if err != nil {
|
||||
return res, fmt.Errorf("error reading testdata file %s", rt.FileName)
|
||||
}
|
||||
reader := ioutil.NopCloser(bytes.NewReader(b))
|
||||
res.Body = reader
|
||||
}
|
||||
if res.Body != nil {
|
||||
return res, nil
|
||||
}
|
||||
return nil, errors.New("fake client not working as expected. If you got this error fix this method")
|
||||
}
|
||||
|
||||
func GetMockService(version string, rt RoundTripper) *Service {
|
||||
return &Service{
|
||||
queryParser: &InfluxdbQueryParser{},
|
||||
responseParser: &ResponseParser{},
|
||||
glog: log.New("tsdb.influxdb"),
|
||||
im: &fakeInstance{
|
||||
version: version,
|
||||
fakeRoundTripper: rt,
|
||||
},
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user