Plugins API: Merge meta and installs (#112962)

This commit is contained in:
Todd Treece
2025-10-29 13:32:31 -04:00
committed by GitHub
parent 6a3e95913e
commit de88abafdd
33 changed files with 1350 additions and 2007 deletions
+35 -8
View File
@@ -2,8 +2,11 @@ package app
import (
"context"
"net/http"
"github.com/grafana/grafana-app-sdk/app"
"github.com/grafana/grafana-app-sdk/k8s"
"github.com/grafana/grafana-app-sdk/logging"
"github.com/grafana/grafana-app-sdk/operator"
"github.com/grafana/grafana-app-sdk/resource"
"github.com/grafana/grafana-app-sdk/simple"
@@ -11,16 +14,15 @@ import (
"k8s.io/klog/v2"
pluginsapi "github.com/grafana/grafana/apps/plugins/pkg/apis"
pluginsv0alpha1 "github.com/grafana/grafana/apps/plugins/pkg/apis/plugins/v0alpha1"
)
func New(cfg app.Config) (app.App, error) {
managedKinds := []simple.AppManagedKind{}
for _, kinds := range GetKinds() {
for _, k := range kinds {
managedKinds = append(managedKinds, simple.AppManagedKind{
Kind: k,
})
}
cfg.KubeConfig.APIPath = "apis"
clientGenerator := k8s.NewClientRegistry(cfg.KubeConfig, k8s.DefaultClientConfig())
client, err := pluginsv0alpha1.NewPluginClientFromGenerator(clientGenerator)
if err != nil {
return nil, err
}
simpleConfig := simple.AppConfig{
@@ -33,7 +35,32 @@ func New(cfg app.Config) (app.App, error) {
},
},
},
ManagedKinds: managedKinds,
ManagedKinds: []simple.AppManagedKind{
{
Kind: pluginsv0alpha1.PluginKind(),
CustomRoutes: simple.AppCustomRouteHandlers{
simple.AppCustomRoute{
Method: http.MethodGet,
Path: "meta",
}: func(ctx context.Context, w app.CustomRouteResponseWriter, req *app.CustomRouteRequest) error {
plugin, err := client.Get(ctx, resource.Identifier{
Namespace: req.ResourceIdentifier.Namespace,
Name: req.ResourceIdentifier.Name,
})
if err != nil {
return err
}
logging.DefaultLogger.Debug("fetched plugin", "plugin", plugin)
// TODO: Implement this in future PR
w.WriteHeader(http.StatusNotImplemented)
if _, err := w.Write([]byte("Not implemented")); err != nil {
return err
}
return nil
},
},
},
},
}
a, err := simple.NewApp(simpleConfig)
+8 -8
View File
@@ -41,12 +41,12 @@ type PluginInstall struct {
Source Source
}
func (p *PluginInstall) ToPluginInstallV0Alpha1(namespace string) *pluginsv0alpha1.PluginInstall {
func (p *PluginInstall) ToPluginInstallV0Alpha1(namespace string) *pluginsv0alpha1.Plugin {
var url *string = nil
if p.URL != "" {
url = &p.URL
}
return &pluginsv0alpha1.PluginInstall{
return &pluginsv0alpha1.Plugin{
ObjectMeta: metav1.ObjectMeta{
Namespace: namespace,
Name: p.ID,
@@ -54,16 +54,16 @@ func (p *PluginInstall) ToPluginInstallV0Alpha1(namespace string) *pluginsv0alph
PluginInstallSourceAnnotation: p.Source,
},
},
Spec: pluginsv0alpha1.PluginInstallSpec{
Spec: pluginsv0alpha1.PluginSpec{
Id: p.ID,
Version: p.Version,
Url: url,
Class: pluginsv0alpha1.PluginInstallSpecClass(p.Class),
Class: pluginsv0alpha1.PluginSpecClass(p.Class),
},
}
}
func (p *PluginInstall) ShouldUpdate(existing *pluginsv0alpha1.PluginInstall) bool {
func (p *PluginInstall) ShouldUpdate(existing *pluginsv0alpha1.Plugin) bool {
update := p.ToPluginInstallV0Alpha1(existing.Namespace)
if source, ok := existing.Annotations[PluginInstallSourceAnnotation]; ok && source != p.Source {
return true
@@ -92,7 +92,7 @@ func equalStringPointers(a, b *string) bool {
type InstallRegistrar struct {
clientGenerator resource.ClientGenerator
client *pluginsv0alpha1.PluginInstallClient
client *pluginsv0alpha1.PluginClient
clientOnce sync.Once
}
@@ -103,9 +103,9 @@ func NewInstallRegistrar(clientGenerator resource.ClientGenerator) *InstallRegis
}
}
func (r *InstallRegistrar) GetClient() (*pluginsv0alpha1.PluginInstallClient, error) {
func (r *InstallRegistrar) GetClient() (*pluginsv0alpha1.PluginClient, error) {
r.clientOnce.Do(func() {
client, err := pluginsv0alpha1.NewPluginInstallClientFromGenerator(r.clientGenerator)
client, err := pluginsv0alpha1.NewPluginClientFromGenerator(r.clientGenerator)
if err != nil {
r.client = nil
return
-75
View File
@@ -1,75 +0,0 @@
package app
import (
"context"
"strings"
apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/apis/meta/internalversion"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apiserver/pkg/registry/rest"
claims "github.com/grafana/authlib/types"
pluginsv0alpha1 "github.com/grafana/grafana/apps/plugins/pkg/apis/plugins/v0alpha1"
)
var (
_ rest.Scoper = (*PluginMetaStorage)(nil)
_ rest.SingularNameProvider = (*PluginMetaStorage)(nil)
_ rest.Getter = (*PluginMetaStorage)(nil)
_ rest.Lister = (*PluginMetaStorage)(nil)
_ rest.Storage = (*PluginMetaStorage)(nil)
_ rest.TableConvertor = (*PluginMetaStorage)(nil)
)
type PluginMetaStorage struct {
gr schema.GroupResource
namespacer claims.NamespaceFormatter
tableConverter rest.TableConvertor
}
func NewPluginMetaStorage(
namespacer claims.NamespaceFormatter,
) *PluginMetaStorage {
gr := schema.GroupResource{
Group: pluginsv0alpha1.PluginMetaKind().Group(),
Resource: strings.ToLower(pluginsv0alpha1.PluginMetaKind().Plural()),
}
return &PluginMetaStorage{
gr: gr,
namespacer: namespacer,
tableConverter: rest.NewDefaultTableConvertor(gr),
}
}
func (s *PluginMetaStorage) New() runtime.Object {
return pluginsv0alpha1.PluginMetaKind().ZeroValue()
}
func (s *PluginMetaStorage) Destroy() {}
func (s *PluginMetaStorage) NamespaceScoped() bool {
return true
}
func (s *PluginMetaStorage) GetSingularName() string {
return strings.ToLower(pluginsv0alpha1.PluginMetaKind().Kind())
}
func (s *PluginMetaStorage) NewList() runtime.Object {
return pluginsv0alpha1.PluginMetaKind().ZeroListValue()
}
func (s *PluginMetaStorage) ConvertToTable(ctx context.Context, object runtime.Object, tableOptions runtime.Object) (*metav1.Table, error) {
return s.tableConverter.ConvertToTable(ctx, object, tableOptions)
}
func (s *PluginMetaStorage) List(ctx context.Context, options *internalversion.ListOptions) (runtime.Object, error) {
return s.NewList(), nil
}
func (s *PluginMetaStorage) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) {
return nil, apierrors.NewNotFound(s.gr, name)
}