K8s: Add App SDK installer (#107773)
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,8 +10,9 @@ import (
|
||||
)
|
||||
|
||||
var WireSet = wire.NewSet(
|
||||
ProvideRegistryServiceSink,
|
||||
playlist.RegisterApp,
|
||||
ProvideAppInstallers,
|
||||
ProvideBuilderRunners,
|
||||
playlist.RegisterAppInstaller,
|
||||
investigations.RegisterApp,
|
||||
advisor.RegisterApp,
|
||||
notifications.RegisterApp,
|
||||
|
||||
Reference in New Issue
Block a user