K8s: Add App SDK installer (#107773)

This commit is contained in:
Todd Treece
2025-07-21 13:32:15 -04:00
committed by GitHub
parent 548964f728
commit e5d2f92384
107 changed files with 2772 additions and 1891 deletions
+13 -4
View File
@@ -5,6 +5,7 @@ import (
"slices"
"github.com/grafana/grafana-app-sdk/app"
appsdkapiserver "github.com/grafana/grafana-app-sdk/k8s/apiserver"
"k8s.io/client-go/rest"
"github.com/grafana/grafana/pkg/infra/log"
@@ -20,6 +21,14 @@ import (
"github.com/grafana/grafana/pkg/setting"
)
// ProvideAppInstallers returns a list of app installers that can be used to install apps.
// This is the pattern that should be used to provide app installers in the app registry.
func ProvideAppInstallers(
playlistAppInstaller *playlist.PlaylistAppInstaller,
) []appsdkapiserver.AppInstaller {
return []appsdkapiserver.AppInstaller{playlistAppInstaller}
}
var (
_ registry.BackgroundService = (*Service)(nil)
)
@@ -29,12 +38,12 @@ type Service struct {
log log.Logger
}
// ProvideRegistryServiceSink is an entry point for each service that will force initialization
func ProvideRegistryServiceSink(
// ProvideBuilderRunners adapts apps to the APIGroupBuilder interface.
// deprecated: Use ProvideAppInstallers instead.
func ProvideBuilderRunners(
registrar builder.APIRegistrar,
restConfigProvider apiserver.RestConfigProvider,
features featuremgmt.FeatureToggles,
playlistAppProvider *playlist.PlaylistAppProvider,
investigationAppProvider *investigations.InvestigationsAppProvider,
advisorAppProvider *advisor.AdvisorAppProvider,
alertingNotificationsAppProvider *notifications.AlertingNotificationsAppProvider,
@@ -56,7 +65,7 @@ func ProvideRegistryServiceSink(
logger := log.New("app-registry")
var apiGroupRunner *runner.APIGroupRunner
var err error
providers := []app.Provider{playlistAppProvider}
providers := []app.Provider{}
if features.IsEnabledGlobally(featuremgmt.FlagInvestigationsBackend) {
logger.Debug("Investigations backend is enabled")
providers = append(providers, investigationAppProvider)
+39 -17
View File
@@ -6,50 +6,65 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
restclient "k8s.io/client-go/rest"
"github.com/grafana/grafana-app-sdk/app"
appsdkapiserver "github.com/grafana/grafana-app-sdk/k8s/apiserver"
"github.com/grafana/grafana-app-sdk/simple"
"github.com/grafana/grafana/apps/playlist/pkg/apis"
playlistv0alpha1 "github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1"
playlistapp "github.com/grafana/grafana/apps/playlist/pkg/app"
"github.com/grafana/grafana/pkg/apimachinery/utils"
grafanarest "github.com/grafana/grafana/pkg/apiserver/rest"
"github.com/grafana/grafana/pkg/services/apiserver/builder/runner"
"github.com/grafana/grafana/pkg/services/apiserver/appinstaller"
"github.com/grafana/grafana/pkg/services/apiserver/endpoints/request"
"github.com/grafana/grafana/pkg/services/featuremgmt"
playlistsvc "github.com/grafana/grafana/pkg/services/playlist"
"github.com/grafana/grafana/pkg/setting"
)
type PlaylistAppProvider struct {
app.Provider
var (
_ appsdkapiserver.AppInstaller = (*PlaylistAppInstaller)(nil)
_ appinstaller.LegacyStorageProvider = (*PlaylistAppInstaller)(nil)
_ appinstaller.APIEnablementProvider = (*PlaylistAppInstaller)(nil)
)
type PlaylistAppInstaller struct {
appsdkapiserver.AppInstaller
cfg *setting.Cfg
service playlistsvc.Service
}
func RegisterApp(
func RegisterAppInstaller(
p playlistsvc.Service,
cfg *setting.Cfg,
features featuremgmt.FeatureToggles,
) *PlaylistAppProvider {
provider := &PlaylistAppProvider{
) (*PlaylistAppInstaller, error) {
installer := &PlaylistAppInstaller{
cfg: cfg,
service: p,
}
appCfg := &runner.AppBuilderConfig{
OpenAPIDefGetter: playlistv0alpha1.GetOpenAPIDefinitions,
LegacyStorageGetter: provider.legacyStorageGetter,
ManagedKinds: playlistapp.GetKinds(),
CustomConfig: any(&playlistapp.PlaylistConfig{
EnableReconcilers: features.IsEnabledGlobally(featuremgmt.FlagPlaylistsReconciler),
}),
AllowedV0Alpha1Resources: []string{playlistv0alpha1.PlaylistKind().Plural()},
specificConfig := any(&playlistapp.PlaylistConfig{
EnableReconcilers: features.IsEnabledGlobally(featuremgmt.FlagPlaylistsReconciler),
})
provider := simple.NewAppProvider(apis.LocalManifest(), specificConfig, playlistapp.New)
appConfig := app.Config{
KubeConfig: restclient.Config{}, // this will be overridden by the installer's InitializeApp method
ManifestData: *apis.LocalManifest().ManifestData,
SpecificConfig: specificConfig,
}
provider.Provider = simple.NewAppProvider(apis.LocalManifest(), appCfg, playlistapp.New)
return provider
i, err := appsdkapiserver.NewDefaultAppInstaller(provider, appConfig, apis.ManifestGoTypeAssociator, apis.ManifestCustomRouteResponsesAssociator)
if err != nil {
return nil, err
}
installer.AppInstaller = i
return installer, nil
}
func (p *PlaylistAppProvider) legacyStorageGetter(requested schema.GroupVersionResource) grafanarest.Storage {
// GetLegacyStorage returns the legacy storage for the playlist app.
func (p *PlaylistAppInstaller) GetLegacyStorage(requested schema.GroupVersionResource) grafanarest.Storage {
gvr := schema.GroupVersionResource{
Group: playlistv0alpha1.PlaylistKind().Group(),
Version: playlistv0alpha1.PlaylistKind().Version(),
@@ -87,3 +102,10 @@ func (p *PlaylistAppProvider) legacyStorageGetter(requested schema.GroupVersionR
)
return legacyStore
}
// GetAllowedV0Alpha1Resources returns the list of resources that are allowed to be accessed in v0alpha1.
func (p *PlaylistAppInstaller) GetAllowedV0Alpha1Resources() []string {
return []string{
playlistv0alpha1.PlaylistKind().Plural(),
}
}
+3 -2
View File
@@ -10,8 +10,9 @@ import (
)
var WireSet = wire.NewSet(
ProvideRegistryServiceSink,
playlist.RegisterApp,
ProvideAppInstallers,
ProvideBuilderRunners,
playlist.RegisterAppInstaller,
investigations.RegisterApp,
advisor.RegisterApp,
notifications.RegisterApp,