| 
									
										
										
										
											2024-02-07 00:40:35 +08:00
										 |  |  | package standalone | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"context" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/grafana/grafana-plugin-sdk-go/backend" | 
					
						
							| 
									
										
										
										
											2024-03-09 00:12:59 +08:00
										 |  |  | 	"github.com/prometheus/client_golang/prometheus" | 
					
						
							| 
									
										
										
										
											2024-02-07 00:40:35 +08:00
										 |  |  | 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1" | 
					
						
							|  |  |  | 	"k8s.io/apimachinery/pkg/runtime/schema" | 
					
						
							| 
									
										
										
										
											2024-04-12 03:30:23 +08:00
										 |  |  | 	genericapiserver "k8s.io/apiserver/pkg/server" | 
					
						
							| 
									
										
										
										
											2024-02-07 00:40:35 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/apis/datasource/v0alpha1" | 
					
						
							| 
									
										
										
										
											2024-02-24 04:15:43 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/apiserver/builder" | 
					
						
							| 
									
										
										
										
											2024-03-09 00:12:59 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/tracing" | 
					
						
							| 
									
										
										
										
											2024-02-07 00:40:35 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/plugins" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/registry/apis/datasource" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/registry/apis/example" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/registry/apis/featuretoggle" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/registry/apis/query" | 
					
						
							| 
									
										
										
										
											2024-03-09 00:12:59 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/registry/apis/query/client" | 
					
						
							| 
									
										
										
										
											2024-02-07 00:40:35 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/accesscontrol/actest" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/services/apiserver/endpoints/request" | 
					
						
							| 
									
										
										
										
											2024-02-16 04:00:20 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/apiserver/options" | 
					
						
							| 
									
										
										
										
											2024-02-07 00:40:35 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/featuremgmt" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/setting" | 
					
						
							|  |  |  | 	testdatasource "github.com/grafana/grafana/pkg/tsdb/grafana-testdata-datasource" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type APIServerFactory interface { | 
					
						
							|  |  |  | 	// Called before the groups are loaded so any custom command can be registered
 | 
					
						
							| 
									
										
										
										
											2024-02-16 04:00:20 +08:00
										 |  |  | 	GetOptions() options.OptionsProvider | 
					
						
							| 
									
										
										
										
											2024-02-07 00:40:35 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Given the flags, what can we produce
 | 
					
						
							|  |  |  | 	GetEnabled(runtime []RuntimeConfig) ([]schema.GroupVersion, error) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Make an API server for a given group+version
 | 
					
						
							| 
									
										
										
										
											2024-04-19 14:22:14 +08:00
										 |  |  | 	MakeAPIServer(ctx context.Context, tracer tracing.Tracer, gv schema.GroupVersion) (builder.APIGroupBuilder, error) | 
					
						
							| 
									
										
										
										
											2024-02-07 00:40:35 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Zero dependency provider for testing
 | 
					
						
							|  |  |  | func GetDummyAPIFactory() APIServerFactory { | 
					
						
							|  |  |  | 	return &DummyAPIFactory{} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type DummyAPIFactory struct{} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-16 04:00:20 +08:00
										 |  |  | func (p *DummyAPIFactory) GetOptions() options.OptionsProvider { | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-02-07 00:40:35 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (p *DummyAPIFactory) GetEnabled(runtime []RuntimeConfig) ([]schema.GroupVersion, error) { | 
					
						
							|  |  |  | 	gv := []schema.GroupVersion{} | 
					
						
							|  |  |  | 	for _, cfg := range runtime { | 
					
						
							|  |  |  | 		if !cfg.Enabled { | 
					
						
							|  |  |  | 			return nil, fmt.Errorf("only enabled supported now") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if cfg.Group == "all" { | 
					
						
							|  |  |  | 			return nil, fmt.Errorf("all not yet supported") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		gv = append(gv, schema.GroupVersion{Group: cfg.Group, Version: cfg.Version}) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return gv, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-12 03:30:23 +08:00
										 |  |  | func (p *DummyAPIFactory) ApplyTo(config *genericapiserver.RecommendedConfig) error { | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-19 14:22:14 +08:00
										 |  |  | func (p *DummyAPIFactory) MakeAPIServer(_ context.Context, tracer tracing.Tracer, gv schema.GroupVersion) (builder.APIGroupBuilder, error) { | 
					
						
							| 
									
										
										
										
											2024-02-07 00:40:35 +08:00
										 |  |  | 	if gv.Version != "v0alpha1" { | 
					
						
							|  |  |  | 		return nil, fmt.Errorf("only alpha supported now") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	switch gv.Group { | 
					
						
							|  |  |  | 	case "example.grafana.app": | 
					
						
							|  |  |  | 		return example.NewTestingAPIBuilder(), nil | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Only works with testdata
 | 
					
						
							|  |  |  | 	case "query.grafana.app": | 
					
						
							|  |  |  | 		return query.NewQueryAPIBuilder( | 
					
						
							|  |  |  | 			featuremgmt.WithFeatures(), | 
					
						
							| 
									
										
										
										
											2024-03-09 00:12:59 +08:00
										 |  |  | 			&query.CommonDataSourceClientSupplier{ | 
					
						
							|  |  |  | 				Client: client.NewTestDataClient(), | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			client.NewTestDataRegistry(), | 
					
						
							| 
									
										
										
										
											2024-03-22 19:54:35 +08:00
										 |  |  | 			nil,                      // legacy lookup
 | 
					
						
							|  |  |  | 			prometheus.NewRegistry(), // ???
 | 
					
						
							|  |  |  | 			tracer, | 
					
						
							| 
									
										
										
										
											2024-03-09 00:12:59 +08:00
										 |  |  | 		) | 
					
						
							| 
									
										
										
										
											2024-02-07 00:40:35 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	case "featuretoggle.grafana.app": | 
					
						
							|  |  |  | 		return featuretoggle.NewFeatureFlagAPIBuilder( | 
					
						
							|  |  |  | 			featuremgmt.WithFeatureManager(setting.FeatureMgmtSettings{}, nil), // none... for now
 | 
					
						
							|  |  |  | 			&actest.FakeAccessControl{ExpectedEvaluate: false}, | 
					
						
							| 
									
										
										
										
											2024-02-10 00:48:56 +08:00
										 |  |  | 			&setting.Cfg{}, | 
					
						
							| 
									
										
										
										
											2024-02-07 00:40:35 +08:00
										 |  |  | 		), nil | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	case "testdata.datasource.grafana.app": | 
					
						
							|  |  |  | 		return datasource.NewDataSourceAPIBuilder( | 
					
						
							|  |  |  | 			plugins.JSONData{ | 
					
						
							|  |  |  | 				ID: "grafana-testdata-datasource", | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			testdatasource.ProvideService(), // the client
 | 
					
						
							|  |  |  | 			&pluginDatasourceImpl{ | 
					
						
							|  |  |  | 				startup: v1.Now(), | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			&pluginDatasourceImpl{}, // stub
 | 
					
						
							|  |  |  | 			&actest.FakeAccessControl{ExpectedEvaluate: true}, | 
					
						
							| 
									
										
										
										
											2024-05-24 00:46:28 +08:00
										 |  |  | 			true, // show query types
 | 
					
						
							| 
									
										
										
										
											2024-02-07 00:40:35 +08:00
										 |  |  | 		) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil, fmt.Errorf("unsupported group") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Simple stub for standalone datasource testing
 | 
					
						
							|  |  |  | type pluginDatasourceImpl struct { | 
					
						
							|  |  |  | 	startup v1.Time | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var ( | 
					
						
							|  |  |  | 	_ datasource.PluginDatasourceProvider = (*pluginDatasourceImpl)(nil) | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Get implements PluginDatasourceProvider.
 | 
					
						
							| 
									
										
										
										
											2024-03-20 20:49:19 +08:00
										 |  |  | func (p *pluginDatasourceImpl) Get(ctx context.Context, uid string) (*v0alpha1.DataSourceConnection, error) { | 
					
						
							|  |  |  | 	all, err := p.List(ctx) | 
					
						
							| 
									
										
										
										
											2024-02-07 00:40:35 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	for idx, v := range all.Items { | 
					
						
							|  |  |  | 		if v.Name == uid { | 
					
						
							|  |  |  | 			return &all.Items[idx], nil | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil, fmt.Errorf("not found") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // List implements PluginConfigProvider.
 | 
					
						
							| 
									
										
										
										
											2024-03-20 20:49:19 +08:00
										 |  |  | func (p *pluginDatasourceImpl) List(ctx context.Context) (*v0alpha1.DataSourceConnectionList, error) { | 
					
						
							| 
									
										
										
										
											2024-02-07 00:40:35 +08:00
										 |  |  | 	info, err := request.NamespaceInfoFrom(ctx, true) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return &v0alpha1.DataSourceConnectionList{ | 
					
						
							|  |  |  | 		TypeMeta: v0alpha1.GenericConnectionResourceInfo.TypeMeta(), | 
					
						
							|  |  |  | 		Items: []v0alpha1.DataSourceConnection{ | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				ObjectMeta: v1.ObjectMeta{ | 
					
						
							|  |  |  | 					Name:              "PD8C576611E62080A", | 
					
						
							|  |  |  | 					Namespace:         info.Value, // the raw namespace value
 | 
					
						
							|  |  |  | 					CreationTimestamp: p.startup, | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				Title: "gdev-testdata", | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // PluginContextForDataSource implements PluginConfigProvider.
 | 
					
						
							| 
									
										
										
										
											2024-03-20 20:49:19 +08:00
										 |  |  | func (*pluginDatasourceImpl) GetInstanceSettings(ctx context.Context, uid string) (*backend.DataSourceInstanceSettings, error) { | 
					
						
							| 
									
										
										
										
											2024-02-07 00:40:35 +08:00
										 |  |  | 	return &backend.DataSourceInstanceSettings{}, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // PluginContextWrapper
 | 
					
						
							|  |  |  | func (*pluginDatasourceImpl) PluginContextForDataSource(ctx context.Context, datasourceSettings *backend.DataSourceInstanceSettings) (backend.PluginContext, error) { | 
					
						
							|  |  |  | 	return backend.PluginContext{DataSourceInstanceSettings: datasourceSettings}, nil | 
					
						
							|  |  |  | } |