Files
grafana/pkg/services/dsquerierclient/qs_datasource_client_builder.go

78 lines
1.9 KiB
Go

package dsquerierclient
import (
"context"
"github.com/grafana/grafana-plugin-sdk-go/experimental/apis/data/v0alpha1"
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/registry/apis/query/clientapi"
)
type QSDatasourceClientBuilder interface {
BuildClient(pluginId string, uid string) (clientapi.QueryDataClient, bool, error)
}
type nullBuilder struct{}
func (m *nullBuilder) BuildClient(pluginId string, uid string) (clientapi.QueryDataClient, bool, error) {
return nil, false, nil
}
// we use this noop for non-query-service flows
func NewNullQSDatasourceClientBuilder() QSDatasourceClientBuilder {
return &nullBuilder{}
}
type QsDatasourceClientBuilderWithInstance struct {
instance clientapi.Instance
ctx context.Context
logger log.Logger
}
func (b *QsDatasourceClientBuilderWithInstance) BuildClient(pluginId string, uid string) (clientapi.QueryDataClient, bool, error) {
dsClient, err := b.instance.GetDataSourceClient(
b.ctx,
v0alpha1.DataSourceRef{
Type: pluginId,
UID: uid,
},
)
if err != nil {
return nil, true, err
}
return dsClient, true, nil
}
// TODO: I think we might be able to refactor this to just use the instance
func NewQsDatasourceClientBuilderWithInstance(
instance clientapi.Instance,
ctx context.Context,
logger log.Logger,
) QSDatasourceClientBuilder {
return &QsDatasourceClientBuilderWithInstance{
instance: instance,
ctx: ctx,
logger: logger,
}
}
func NewTestQSDSClientBuilder(isMultiTenant bool, mockClient clientapi.QueryDataClient) QSDatasourceClientBuilder {
return &testBuilder{
mockClient: mockClient,
isMultitenant: isMultiTenant,
}
}
type testBuilder struct {
mockClient clientapi.QueryDataClient
isMultitenant bool
}
func (b *testBuilder) BuildClient(pluginId string, uid string) (clientapi.QueryDataClient, bool, error) {
if !b.isMultitenant {
return nil, false, nil
}
return b.mockClient, true, nil
}