| 
									
										
										
										
											2023-08-10 00:25:28 +08:00
										 |  |  | package pluginsintegration | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/stretchr/testify/require" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 23:41:10 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/tracing" | 
					
						
							| 
									
										
										
										
											2023-08-10 00:25:28 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/plugins" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/plugins/backendplugin" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/plugins/backendplugin/coreplugin" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/plugins/backendplugin/provider" | 
					
						
							|  |  |  | 	pluginsCfg "github.com/grafana/grafana/pkg/plugins/config" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/plugins/manager/client" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/plugins/manager/fakes" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/plugins/manager/loader" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/plugins/manager/loader/angular/angularinspector" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/plugins/manager/loader/assetpath" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/plugins/manager/loader/finder" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/plugins/manager/pipeline/bootstrap" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/plugins/manager/pipeline/discovery" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/plugins/manager/pipeline/initialization" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/plugins/manager/pipeline/termination" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/plugins/manager/pipeline/validation" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/plugins/manager/process" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/plugins/manager/registry" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/plugins/manager/signature" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/plugins/manager/signature/statickey" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/plugins/manager/sources" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/plugins/pluginscdn" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/services/featuremgmt" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/services/pluginsintegration/pipeline" | 
					
						
							| 
									
										
										
										
											2024-02-27 19:38:02 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginconfig" | 
					
						
							| 
									
										
										
										
											2023-08-10 00:25:28 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginerrs" | 
					
						
							| 
									
										
										
										
											2023-09-11 19:59:24 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore" | 
					
						
							| 
									
										
										
										
											2023-08-10 00:25:28 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/setting" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type IntegrationTestCtx struct { | 
					
						
							|  |  |  | 	PluginClient   plugins.Client | 
					
						
							| 
									
										
										
										
											2023-09-11 19:59:24 +08:00
										 |  |  | 	PluginStore    *pluginstore.Service | 
					
						
							| 
									
										
										
										
											2023-08-10 00:25:28 +08:00
										 |  |  | 	PluginRegistry registry.Service | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func CreateIntegrationTestCtx(t *testing.T, cfg *setting.Cfg, coreRegistry *coreplugin.Registry) *IntegrationTestCtx { | 
					
						
							| 
									
										
										
										
											2024-02-27 19:38:02 +08:00
										 |  |  | 	pCfg, err := pluginconfig.ProvidePluginManagementConfig(cfg, setting.ProvideProvider(cfg), featuremgmt.WithFeatures()) | 
					
						
							| 
									
										
										
										
											2023-08-10 00:25:28 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	cdn := pluginscdn.ProvideService(pCfg) | 
					
						
							|  |  |  | 	reg := registry.ProvideService() | 
					
						
							|  |  |  | 	angularInspector := angularinspector.NewStaticInspector() | 
					
						
							| 
									
										
										
										
											2023-08-16 16:46:00 +08:00
										 |  |  | 	proc := process.ProvideService() | 
					
						
							| 
									
										
										
										
											2023-08-10 00:25:28 +08:00
										 |  |  | 	errTracker := pluginerrs.ProvideSignatureErrorTracker() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-15 17:58:51 +08:00
										 |  |  | 	disc := pipeline.ProvideDiscoveryStage(pCfg, finder.NewLocalFinder(true), reg) | 
					
						
							| 
									
										
										
										
											2023-08-31 21:45:44 +08:00
										 |  |  | 	boot := pipeline.ProvideBootstrapStage(pCfg, signature.ProvideService(pCfg, statickey.New()), assetpath.ProvideService(pCfg, cdn)) | 
					
						
							| 
									
										
										
										
											2023-08-10 00:25:28 +08:00
										 |  |  | 	valid := pipeline.ProvideValidationStage(pCfg, signature.NewValidator(signature.NewUnsignedAuthorizer(pCfg)), angularInspector, errTracker) | 
					
						
							| 
									
										
										
										
											2024-03-21 23:41:10 +08:00
										 |  |  | 	init := pipeline.ProvideInitializationStage(pCfg, reg, provider.ProvideService(coreRegistry), proc, &fakes.FakeAuthService{}, fakes.NewFakeRoleRegistry(), nil, tracing.InitializeTracerForTest()) | 
					
						
							| 
									
										
										
										
											2023-08-10 00:25:28 +08:00
										 |  |  | 	term, err := pipeline.ProvideTerminationStage(pCfg, reg, proc) | 
					
						
							|  |  |  | 	require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	l := CreateTestLoader(t, pCfg, LoaderOpts{ | 
					
						
							|  |  |  | 		Discoverer:   disc, | 
					
						
							|  |  |  | 		Bootstrapper: boot, | 
					
						
							|  |  |  | 		Validator:    valid, | 
					
						
							|  |  |  | 		Initializer:  init, | 
					
						
							|  |  |  | 		Terminator:   term, | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-08 18:45:03 +08:00
										 |  |  | 	ps, err := pluginstore.ProvideService(reg, sources.ProvideService(cfg), l) | 
					
						
							| 
									
										
										
										
											2023-08-10 00:25:28 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return &IntegrationTestCtx{ | 
					
						
							| 
									
										
										
										
											2024-03-11 23:28:46 +08:00
										 |  |  | 		PluginClient:   client.ProvideService(reg), | 
					
						
							| 
									
										
										
										
											2023-08-10 00:25:28 +08:00
										 |  |  | 		PluginStore:    ps, | 
					
						
							|  |  |  | 		PluginRegistry: reg, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type LoaderOpts struct { | 
					
						
							|  |  |  | 	Discoverer   discovery.Discoverer | 
					
						
							|  |  |  | 	Bootstrapper bootstrap.Bootstrapper | 
					
						
							|  |  |  | 	Validator    validation.Validator | 
					
						
							|  |  |  | 	Terminator   termination.Terminator | 
					
						
							|  |  |  | 	Initializer  initialization.Initializer | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-27 19:38:02 +08:00
										 |  |  | func CreateTestLoader(t *testing.T, cfg *pluginsCfg.PluginManagementCfg, opts LoaderOpts) *loader.Loader { | 
					
						
							| 
									
										
										
										
											2023-08-10 00:25:28 +08:00
										 |  |  | 	if opts.Discoverer == nil { | 
					
						
							| 
									
										
										
										
											2024-03-15 17:58:51 +08:00
										 |  |  | 		opts.Discoverer = pipeline.ProvideDiscoveryStage(cfg, finder.NewLocalFinder(cfg.DevMode), registry.ProvideService()) | 
					
						
							| 
									
										
										
										
											2023-08-10 00:25:28 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if opts.Bootstrapper == nil { | 
					
						
							| 
									
										
										
										
											2023-08-31 21:45:44 +08:00
										 |  |  | 		opts.Bootstrapper = pipeline.ProvideBootstrapStage(cfg, signature.ProvideService(cfg, statickey.New()), assetpath.ProvideService(cfg, pluginscdn.ProvideService(cfg))) | 
					
						
							| 
									
										
										
										
											2023-08-10 00:25:28 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if opts.Validator == nil { | 
					
						
							|  |  |  | 		opts.Validator = pipeline.ProvideValidationStage(cfg, signature.NewValidator(signature.NewUnsignedAuthorizer(cfg)), angularinspector.NewStaticInspector(), pluginerrs.ProvideSignatureErrorTracker()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if opts.Initializer == nil { | 
					
						
							|  |  |  | 		reg := registry.ProvideService() | 
					
						
							|  |  |  | 		coreRegistry := coreplugin.NewRegistry(make(map[string]backendplugin.PluginFactoryFunc)) | 
					
						
							| 
									
										
										
										
											2024-03-21 23:41:10 +08:00
										 |  |  | 		opts.Initializer = pipeline.ProvideInitializationStage(cfg, reg, provider.ProvideService(coreRegistry), process.ProvideService(), &fakes.FakeAuthService{}, fakes.NewFakeRoleRegistry(), nil, tracing.InitializeTracerForTest()) | 
					
						
							| 
									
										
										
										
											2023-08-10 00:25:28 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if opts.Terminator == nil { | 
					
						
							|  |  |  | 		var err error | 
					
						
							|  |  |  | 		reg := registry.ProvideService() | 
					
						
							| 
									
										
										
										
											2023-08-16 16:46:00 +08:00
										 |  |  | 		opts.Terminator, err = pipeline.ProvideTerminationStage(cfg, reg, process.ProvideService()) | 
					
						
							| 
									
										
										
										
											2023-08-10 00:25:28 +08:00
										 |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return loader.New(opts.Discoverer, opts.Bootstrapper, opts.Validator, opts.Initializer, opts.Terminator) | 
					
						
							|  |  |  | } |