Plugins: API sync (#112452)

This commit is contained in:
Todd Treece
2025-10-24 08:09:26 -04:00
committed by GitHub
parent 8b12bbcc55
commit dc77da11cf
25 changed files with 1214 additions and 47 deletions
@@ -6,13 +6,16 @@ import (
"time"
"github.com/grafana/dskit/services"
"golang.org/x/sync/errgroup"
"github.com/grafana/grafana/apps/plugins/pkg/app/install"
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/plugins/manager/loader"
"github.com/grafana/grafana/pkg/plugins/manager/registry"
"github.com/grafana/grafana/pkg/plugins/manager/sources"
"github.com/grafana/grafana/pkg/services/featuremgmt"
"golang.org/x/sync/errgroup"
"github.com/grafana/grafana/pkg/services/pluginsintegration/installsync"
)
var _ Store = (*Service)(nil)
@@ -31,16 +34,17 @@ type Store interface {
type Service struct {
services.NamedService
pluginRegistry registry.Service
pluginLoader loader.Service
pluginSources sources.Registry
loadOnStartup bool
pluginRegistry registry.Service
pluginLoader loader.Service
pluginSources sources.Registry
installsRegistrar installsync.Syncer
loadOnStartup bool
}
func ProvideService(pluginRegistry registry.Service, pluginSources sources.Registry,
pluginLoader loader.Service, features featuremgmt.FeatureToggles) (*Service, error) {
pluginLoader loader.Service, installsRegistrar installsync.Syncer, features featuremgmt.FeatureToggles) (*Service, error) {
if features.IsEnabledGlobally(featuremgmt.FlagPluginStoreServiceLoading) {
s := New(pluginRegistry, pluginLoader, pluginSources)
s := New(pluginRegistry, pluginLoader, pluginSources, installsRegistrar)
s.loadOnStartup = true
return s, nil
}
@@ -51,19 +55,24 @@ func ProvideService(pluginRegistry registry.Service, pluginSources sources.Regis
logger := log.New("plugin.store")
logger.Info("Loading plugins...")
loadedPluginsToSync := make([]*plugins.Plugin, 0)
for _, ps := range pluginSources.List(ctx) {
loadedPlugins, err := pluginLoader.Load(ctx, ps)
if err != nil {
logger.Error("Loading plugin source failed", "source", ps.PluginClass(ctx), "error", err)
return nil, err
}
loadedPluginsToSync = append(loadedPluginsToSync, loadedPlugins...)
totalPlugins += len(loadedPlugins)
}
if err := installsRegistrar.Sync(ctx, install.SourcePluginStore, loadedPluginsToSync); err != nil {
logger.Error("Syncing plugin installations failed", "error", err)
}
logger.Info("Plugins loaded", "count", totalPlugins, "duration", time.Since(start))
return New(pluginRegistry, pluginLoader, pluginSources), nil
return New(pluginRegistry, pluginLoader, pluginSources, installsRegistrar), nil
}
func (s *Service) Run(ctx context.Context) error {
@@ -74,8 +83,8 @@ func (s *Service) Run(ctx context.Context) error {
return s.AwaitTerminated(stopCtx)
}
func NewPluginStoreForTest(pluginRegistry registry.Service, pluginLoader loader.Service, pluginSources sources.Registry) (*Service, error) {
s := New(pluginRegistry, pluginLoader, pluginSources)
func NewPluginStoreForTest(pluginRegistry registry.Service, pluginLoader loader.Service, pluginSources sources.Registry, installsRegistrar installsync.Syncer) (*Service, error) {
s := New(pluginRegistry, pluginLoader, pluginSources, installsRegistrar)
s.loadOnStartup = true
if err := s.StartAsync(context.Background()); err != nil {
return nil, err
@@ -86,11 +95,12 @@ func NewPluginStoreForTest(pluginRegistry registry.Service, pluginLoader loader.
return s, nil
}
func New(pluginRegistry registry.Service, pluginLoader loader.Service, pluginSources sources.Registry) *Service {
func New(pluginRegistry registry.Service, pluginLoader loader.Service, pluginSources sources.Registry, installsRegistrar installsync.Syncer) *Service {
s := &Service{
pluginRegistry: pluginRegistry,
pluginLoader: pluginLoader,
pluginSources: pluginSources,
pluginRegistry: pluginRegistry,
pluginLoader: pluginLoader,
pluginSources: pluginSources,
installsRegistrar: installsRegistrar,
}
s.NamedService = services.NewBasicService(s.starting, s.running, s.stopping).WithName(ServiceName)
return s
@@ -105,15 +115,21 @@ func (s *Service) starting(ctx context.Context) error {
logger := log.New(ServiceName)
logger.Info("Loading plugins...")
loadedPluginsToSync := make([]*plugins.Plugin, 0)
for _, ps := range s.pluginSources.List(ctx) {
loadedPlugins, err := s.pluginLoader.Load(ctx, ps)
if err != nil {
logger.Error("Loading plugin source failed", "source", ps.PluginClass(ctx), "error", err)
return err
}
loadedPluginsToSync = append(loadedPluginsToSync, loadedPlugins...)
totalPlugins += len(loadedPlugins)
}
if err := s.installsRegistrar.Sync(ctx, install.SourcePluginStore, loadedPluginsToSync); err != nil {
logger.Error("Syncing plugin installations failed", "error", err)
}
logger.Info("Plugins loaded", "count", totalPlugins, "duration", time.Since(start))
return nil
}