| 
									
										
										
										
											2025-07-18 05:22:55 +08:00
										 |  |  | package mtdsclient | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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 MTDatasourceClientBuilder interface { | 
					
						
							|  |  |  | 	BuildClient(pluginId string, uid string) (clientapi.QueryDataClient, bool) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type nullBuilder struct{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (m *nullBuilder) BuildClient(pluginId string, uid string) (clientapi.QueryDataClient, bool) { | 
					
						
							|  |  |  | 	return nil, false | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // we use this noop for st flows
 | 
					
						
							|  |  |  | func NewNullMTDatasourceClientBuilder() MTDatasourceClientBuilder { | 
					
						
							|  |  |  | 	return &nullBuilder{} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type MtDatasourceClientBuilderWithClientSupplier struct { | 
					
						
							|  |  |  | 	clientSupplier clientapi.DataSourceClientSupplier | 
					
						
							|  |  |  | 	ctx            context.Context | 
					
						
							|  |  |  | 	headers        map[string]string | 
					
						
							|  |  |  | 	instanceConfig clientapi.InstanceConfigurationSettings | 
					
						
							|  |  |  | 	logger         log.Logger | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (b *MtDatasourceClientBuilderWithClientSupplier) BuildClient(pluginId string, uid string) (clientapi.QueryDataClient, bool) { | 
					
						
							|  |  |  | 	dsClient, err := b.clientSupplier.GetDataSourceClient( | 
					
						
							|  |  |  | 		b.ctx, | 
					
						
							|  |  |  | 		v0alpha1.DataSourceRef{ | 
					
						
							|  |  |  | 			Type: pluginId, | 
					
						
							|  |  |  | 			UID:  uid, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		b.headers, | 
					
						
							|  |  |  | 		b.instanceConfig, | 
					
						
							|  |  |  | 	) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		b.logger.Debug("failed to get mt ds client", "error", err) | 
					
						
							|  |  |  | 		return nil, false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return dsClient, true | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // TODO: I think we might be able to refactor this to just use the client supplier directly
 | 
					
						
							|  |  |  | func NewMtDatasourceClientBuilderWithClientSupplier( | 
					
						
							|  |  |  | 	clientSupplier clientapi.DataSourceClientSupplier, | 
					
						
							|  |  |  | 	ctx context.Context, | 
					
						
							|  |  |  | 	headers map[string]string, | 
					
						
							|  |  |  | 	instanceConfig clientapi.InstanceConfigurationSettings, | 
					
						
							|  |  |  | 	logger log.Logger, | 
					
						
							|  |  |  | ) MTDatasourceClientBuilder { | 
					
						
							|  |  |  | 	return &MtDatasourceClientBuilderWithClientSupplier{ | 
					
						
							|  |  |  | 		clientSupplier: clientSupplier, | 
					
						
							|  |  |  | 		ctx:            ctx, | 
					
						
							|  |  |  | 		headers:        headers, | 
					
						
							|  |  |  | 		instanceConfig: instanceConfig, | 
					
						
							|  |  |  | 		logger:         logger, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2025-07-19 02:14:44 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func NewTestMTDSClientBuilder(isMultiTenant bool, mockClient clientapi.QueryDataClient) MTDatasourceClientBuilder { | 
					
						
							|  |  |  | 	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) { | 
					
						
							|  |  |  | 	if !b.isMultitenant { | 
					
						
							|  |  |  | 		return nil, false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return b.mockClient, true | 
					
						
							|  |  |  | } |