diff --git a/pkg/tsdb/influxdb/fsql/client.go b/pkg/tsdb/influxdb/fsql/client.go index 270599d0351..0935fa8815a 100644 --- a/pkg/tsdb/influxdb/fsql/client.go +++ b/pkg/tsdb/influxdb/fsql/client.go @@ -11,6 +11,7 @@ import ( "github.com/apache/arrow-go/v18/arrow/flight/flightsql" "github.com/apache/arrow-go/v18/arrow/ipc" "github.com/apache/arrow-go/v18/arrow/memory" + "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" "github.com/grafana/grafana-plugin-sdk-go/backend/proxy" "google.golang.org/grpc" "google.golang.org/grpc/credentials" @@ -28,8 +29,8 @@ func (c *client) FlightClient() flight.Client { return c.Client.Client } -func newFlightSQLClient(addr string, metadata metadata.MD, secure bool, proxyClient proxy.Client) (*client, error) { - dialOptions, err := grpcDialOptions(secure, proxyClient) +func newFlightSQLClient(addr string, metadata metadata.MD, secure bool, tlsConfig *httpclient.TLSOptions, proxyClient proxy.Client) (*client, error) { + dialOptions, err := grpcDialOptions(secure, tlsConfig, proxyClient) if err != nil { return nil, fmt.Errorf("grpc dial options: %s", err) } @@ -46,7 +47,7 @@ func newFlightSQLClient(addr string, metadata metadata.MD, secure bool, proxyCli return &client{Client: fsqlClient, md: metadata}, nil } -func grpcDialOptions(secure bool, proxyClient proxy.Client) ([]grpc.DialOption, error) { +func grpcDialOptions(secure bool, tlsConfig *httpclient.TLSOptions, proxyClient proxy.Client) ([]grpc.DialOption, error) { dialOptions := []grpc.DialOption{} secureDialOpt := grpc.WithTransportCredentials(insecure.NewCredentials()) @@ -55,6 +56,9 @@ func grpcDialOptions(secure bool, proxyClient proxy.Client) ([]grpc.DialOption, if err != nil { return nil, fmt.Errorf("x509: %s", err) } + if tlsConfig != nil && len(tlsConfig.CACertificate) > 0 { + pool.AppendCertsFromPEM([]byte(tlsConfig.CACertificate)) + } secureDialOpt = grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(pool, "")) } dialOptions = append(dialOptions, secureDialOpt) diff --git a/pkg/tsdb/influxdb/fsql/fsql.go b/pkg/tsdb/influxdb/fsql/fsql.go index 6869696fab3..b81bfc55b06 100644 --- a/pkg/tsdb/influxdb/fsql/fsql.go +++ b/pkg/tsdb/influxdb/fsql/fsql.go @@ -143,7 +143,7 @@ func runnerFromDataSource(dsInfo *models.DatasourceInfo) (*runner, error) { md.Set("Authorization", fmt.Sprintf("Bearer %s", dsInfo.Token)) } - fsqlClient, err := newFlightSQLClient(u, md, !dsInfo.InsecureGrpc, dsInfo.ProxyClient) + fsqlClient, err := newFlightSQLClient(u, md, !dsInfo.InsecureGrpc, dsInfo.TLSConfig, dsInfo.ProxyClient) if err != nil { return nil, err } diff --git a/pkg/tsdb/influxdb/influxdb.go b/pkg/tsdb/influxdb/influxdb.go index 6523ea0158f..c4a04e19008 100644 --- a/pkg/tsdb/influxdb/influxdb.go +++ b/pkg/tsdb/influxdb/influxdb.go @@ -92,6 +92,7 @@ func newInstanceSettings(httpClientProvider httpclient.Provider) datasource.Inst Token: settings.DecryptedSecureJSONData["token"], Timeout: opts.Timeouts.Timeout, ProxyClient: proxyClient, + TLSConfig: opts.TLS, } return model, nil } diff --git a/pkg/tsdb/influxdb/models/datasource_info.go b/pkg/tsdb/influxdb/models/datasource_info.go index 9683a28d2c8..8bf26c68bbc 100644 --- a/pkg/tsdb/influxdb/models/datasource_info.go +++ b/pkg/tsdb/influxdb/models/datasource_info.go @@ -4,6 +4,7 @@ import ( "net/http" "time" + "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" "github.com/grafana/grafana-plugin-sdk-go/backend/proxy" ) @@ -25,5 +26,7 @@ type DatasourceInfo struct { // FlightSQL grpc connection InsecureGrpc bool `json:"insecureGrpc"` + TLSConfig *httpclient.TLSOptions + ProxyClient proxy.Client }