API Server: refactor plugin ID handling (#84753)

This commit is contained in:
Andres Martinez Gotor 2024-03-20 13:49:19 +01:00 committed by GitHub
parent d0935fe44c
commit a705ff7892
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 21 additions and 17 deletions

View File

@ -20,7 +20,6 @@ var (
) )
type connectionAccess struct { type connectionAccess struct {
pluginID string
resourceInfo common.ResourceInfo resourceInfo common.ResourceInfo
tableConverter rest.TableConvertor tableConverter rest.TableConvertor
datasources PluginDatasourceProvider datasources PluginDatasourceProvider
@ -53,9 +52,9 @@ func (s *connectionAccess) ConvertToTable(ctx context.Context, object runtime.Ob
} }
func (s *connectionAccess) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { func (s *connectionAccess) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) {
return s.datasources.Get(ctx, s.pluginID, name) return s.datasources.Get(ctx, name)
} }
func (s *connectionAccess) List(ctx context.Context, options *internalversion.ListOptions) (runtime.Object, error) { func (s *connectionAccess) List(ctx context.Context, options *internalversion.ListOptions) (runtime.Object, error) {
return s.datasources.List(ctx, s.pluginID) return s.datasources.List(ctx)
} }

View File

@ -9,6 +9,7 @@ import (
"github.com/grafana/grafana/pkg/apis/datasource/v0alpha1" "github.com/grafana/grafana/pkg/apis/datasource/v0alpha1"
"github.com/grafana/grafana/pkg/infra/appcontext" "github.com/grafana/grafana/pkg/infra/appcontext"
"github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/services/apiserver/endpoints/request" "github.com/grafana/grafana/pkg/services/apiserver/endpoints/request"
"github.com/grafana/grafana/pkg/services/apiserver/utils" "github.com/grafana/grafana/pkg/services/apiserver/utils"
"github.com/grafana/grafana/pkg/services/datasources" "github.com/grafana/grafana/pkg/services/datasources"
@ -20,14 +21,14 @@ import (
// limit which namespace/tenant/org we are talking to // limit which namespace/tenant/org we are talking to
type PluginDatasourceProvider interface { type PluginDatasourceProvider interface {
// Get gets a specific datasource (that the user in context can see) // Get gets a specific datasource (that the user in context can see)
Get(ctx context.Context, pluginID, uid string) (*v0alpha1.DataSourceConnection, error) Get(ctx context.Context, uid string) (*v0alpha1.DataSourceConnection, error)
// List lists all data sources the user in context can see // List lists all data sources the user in context can see
List(ctx context.Context, pluginID string) (*v0alpha1.DataSourceConnectionList, error) List(ctx context.Context) (*v0alpha1.DataSourceConnectionList, error)
// Return settings (decrypted!) for a specific plugin // Return settings (decrypted!) for a specific plugin
// This will require "query" permission for the user in context // This will require "query" permission for the user in context
GetInstanceSettings(ctx context.Context, pluginID, uid string) (*backend.DataSourceInstanceSettings, error) GetInstanceSettings(ctx context.Context, uid string) (*backend.DataSourceInstanceSettings, error)
} }
// PluginContext requires adding system settings (feature flags, etc) to the datasource config // PluginContext requires adding system settings (feature flags, etc) to the datasource config
@ -40,6 +41,9 @@ func ProvideDefaultPluginConfigs(
dsCache datasources.CacheService, dsCache datasources.CacheService,
contextProvider *plugincontext.Provider) PluginDatasourceProvider { contextProvider *plugincontext.Provider) PluginDatasourceProvider {
return &defaultPluginDatasourceProvider{ return &defaultPluginDatasourceProvider{
plugin: plugins.JSONData{
ID: datasources.DS_TESTDATA,
},
dsService: dsService, dsService: dsService,
dsCache: dsCache, dsCache: dsCache,
contextProvider: contextProvider, contextProvider: contextProvider,
@ -47,6 +51,7 @@ func ProvideDefaultPluginConfigs(
} }
type defaultPluginDatasourceProvider struct { type defaultPluginDatasourceProvider struct {
plugin plugins.JSONData
dsService datasources.DataSourceService dsService datasources.DataSourceService
dsCache datasources.CacheService dsCache datasources.CacheService
contextProvider *plugincontext.Provider contextProvider *plugincontext.Provider
@ -56,7 +61,7 @@ var (
_ PluginDatasourceProvider = (*defaultPluginDatasourceProvider)(nil) _ PluginDatasourceProvider = (*defaultPluginDatasourceProvider)(nil)
) )
func (q *defaultPluginDatasourceProvider) Get(ctx context.Context, pluginID, uid string) (*v0alpha1.DataSourceConnection, error) { func (q *defaultPluginDatasourceProvider) Get(ctx context.Context, uid string) (*v0alpha1.DataSourceConnection, error) {
info, err := request.NamespaceInfoFrom(ctx, true) info, err := request.NamespaceInfoFrom(ctx, true)
if err != nil { if err != nil {
return nil, err return nil, err
@ -72,15 +77,16 @@ func (q *defaultPluginDatasourceProvider) Get(ctx context.Context, pluginID, uid
return asConnection(ds, info.Value) return asConnection(ds, info.Value)
} }
func (q *defaultPluginDatasourceProvider) List(ctx context.Context, pluginID string) (*v0alpha1.DataSourceConnectionList, error) { func (q *defaultPluginDatasourceProvider) List(ctx context.Context) (*v0alpha1.DataSourceConnectionList, error) {
info, err := request.NamespaceInfoFrom(ctx, true) info, err := request.NamespaceInfoFrom(ctx, true)
if err != nil { if err != nil {
return nil, err return nil, err
} }
dss, err := q.dsService.GetDataSourcesByType(ctx, &datasources.GetDataSourcesByTypeQuery{ dss, err := q.dsService.GetDataSourcesByType(ctx, &datasources.GetDataSourcesByTypeQuery{
OrgID: info.OrgID, OrgID: info.OrgID,
Type: pluginID, Type: q.plugin.ID,
AliasIDs: q.plugin.AliasIDs,
}) })
if err != nil { if err != nil {
return nil, err return nil, err
@ -95,7 +101,7 @@ func (q *defaultPluginDatasourceProvider) List(ctx context.Context, pluginID str
return result, nil return result, nil
} }
func (q *defaultPluginDatasourceProvider) GetInstanceSettings(ctx context.Context, pluginID, uid string) (*backend.DataSourceInstanceSettings, error) { func (q *defaultPluginDatasourceProvider) GetInstanceSettings(ctx context.Context, uid string) (*backend.DataSourceInstanceSettings, error) {
if q.contextProvider == nil { if q.contextProvider == nil {
// NOTE!!! this is only here for the standalone example // NOTE!!! this is only here for the standalone example
// if we cleanup imports this can throw an error // if we cleanup imports this can throw an error

View File

@ -175,7 +175,6 @@ func (b *DataSourceAPIBuilder) GetAPIGroupInfo(
conn := b.connectionResourceInfo conn := b.connectionResourceInfo
storage[conn.StoragePath()] = &connectionAccess{ storage[conn.StoragePath()] = &connectionAccess{
pluginID: b.pluginJSON.ID,
datasources: b.datasources, datasources: b.datasources,
resourceInfo: conn, resourceInfo: conn,
tableConverter: utils.NewTableConverter( tableConverter: utils.NewTableConverter(
@ -220,7 +219,7 @@ func (b *DataSourceAPIBuilder) GetAPIGroupInfo(
} }
func (b *DataSourceAPIBuilder) getPluginContext(ctx context.Context, uid string) (backend.PluginContext, error) { func (b *DataSourceAPIBuilder) getPluginContext(ctx context.Context, uid string) (backend.PluginContext, error) {
instance, err := b.datasources.GetInstanceSettings(ctx, b.pluginJSON.ID, uid) instance, err := b.datasources.GetInstanceSettings(ctx, uid)
if err != nil { if err != nil {
return backend.PluginContext{}, err return backend.PluginContext{}, err
} }

View File

@ -118,8 +118,8 @@ var (
) )
// Get implements PluginDatasourceProvider. // Get implements PluginDatasourceProvider.
func (p *pluginDatasourceImpl) Get(ctx context.Context, pluginID string, uid string) (*v0alpha1.DataSourceConnection, error) { func (p *pluginDatasourceImpl) Get(ctx context.Context, uid string) (*v0alpha1.DataSourceConnection, error) {
all, err := p.List(ctx, pluginID) all, err := p.List(ctx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -132,7 +132,7 @@ func (p *pluginDatasourceImpl) Get(ctx context.Context, pluginID string, uid str
} }
// List implements PluginConfigProvider. // List implements PluginConfigProvider.
func (p *pluginDatasourceImpl) List(ctx context.Context, pluginID string) (*v0alpha1.DataSourceConnectionList, error) { func (p *pluginDatasourceImpl) List(ctx context.Context) (*v0alpha1.DataSourceConnectionList, error) {
info, err := request.NamespaceInfoFrom(ctx, true) info, err := request.NamespaceInfoFrom(ctx, true)
if err != nil { if err != nil {
return nil, err return nil, err
@ -154,7 +154,7 @@ func (p *pluginDatasourceImpl) List(ctx context.Context, pluginID string) (*v0al
} }
// PluginContextForDataSource implements PluginConfigProvider. // PluginContextForDataSource implements PluginConfigProvider.
func (*pluginDatasourceImpl) GetInstanceSettings(ctx context.Context, pluginID, uid string) (*backend.DataSourceInstanceSettings, error) { func (*pluginDatasourceImpl) GetInstanceSettings(ctx context.Context, uid string) (*backend.DataSourceInstanceSettings, error) {
return &backend.DataSourceInstanceSettings{}, nil return &backend.DataSourceInstanceSettings{}, nil
} }