Plugins: Add support for fetching plugin includes from plugin CDN (#91476)

* update oss side

* add Rel func to plugins.FS

* update tests

* add comment

* fix fs paths for nested plugin

* fix test

* fix sources

* fix cdn class bug

* update tests

* remove commented out code
This commit is contained in:
Will Browne
2024-08-21 09:46:41 +01:00
committed by GitHub
parent e7c628f4e7
commit aea8b60849
12 changed files with 183 additions and 47 deletions
@@ -25,7 +25,8 @@ func NewDefaultPluginFactory(assetPath *assetpath.Service) *DefaultPluginFactory
func (f *DefaultPluginFactory) createPlugin(bundle *plugins.FoundBundle, class plugins.Class,
sig plugins.Signature) (*plugins.Plugin, error) {
plugin, err := f.newPlugin(bundle.Primary, class, sig)
parentInfo := assetpath.NewPluginInfo(bundle.Primary.JSONData, class, bundle.Primary.FS, nil)
plugin, err := f.newPlugin(bundle.Primary, class, sig, parentInfo)
if err != nil {
return nil, err
}
@@ -36,7 +37,8 @@ func (f *DefaultPluginFactory) createPlugin(bundle *plugins.FoundBundle, class p
plugin.Children = make([]*plugins.Plugin, 0, len(bundle.Children))
for _, child := range bundle.Children {
cp, err := f.newPlugin(*child, class, sig)
childInfo := assetpath.NewPluginInfo(child.JSONData, class, child.FS, &parentInfo)
cp, err := f.newPlugin(*child, class, sig, childInfo)
if err != nil {
return nil, err
}
@@ -47,8 +49,8 @@ func (f *DefaultPluginFactory) createPlugin(bundle *plugins.FoundBundle, class p
return plugin, nil
}
func (f *DefaultPluginFactory) newPlugin(p plugins.FoundPlugin, class plugins.Class, sig plugins.Signature) (*plugins.Plugin, error) {
info := assetpath.NewPluginInfo(p.JSONData, class, p.FS)
func (f *DefaultPluginFactory) newPlugin(p plugins.FoundPlugin, class plugins.Class, sig plugins.Signature,
info assetpath.PluginInfo) (*plugins.Plugin, error) {
baseURL, err := f.assetPath.Base(info)
if err != nil {
return nil, fmt.Errorf("base url: %w", err)
@@ -69,14 +71,13 @@ func (f *DefaultPluginFactory) newPlugin(p plugins.FoundPlugin, class plugins.Cl
}
plugin.SetLogger(log.New(fmt.Sprintf("plugin.%s", plugin.ID)))
if err = setImages(plugin, f.assetPath); err != nil {
if err = setImages(plugin, f.assetPath, info); err != nil {
return nil, err
}
return plugin, nil
}
func setImages(p *plugins.Plugin, assetPath *assetpath.Service) error {
info := assetpath.NewPluginInfo(p.JSONData, p.Class, p.FS)
func setImages(p *plugins.Plugin, assetPath *assetpath.Service, info assetpath.PluginInfo) error {
var err error
for _, dst := range []*string{&p.Info.Logos.Small, &p.Info.Logos.Large} {
if len(*dst) == 0 {
@@ -98,7 +98,7 @@ func TestTemplateDecorateFunc(t *testing.T) {
func Test_configureAppChildPlugin(t *testing.T) {
t.Run("Child plugin will inherit parent version information when version is empty", func(t *testing.T) {
child := &plugins.Plugin{
FS: fakes.NewFakePluginFiles("c:\\grafana\\public\\app\\plugins\\app\\testdata-app\\datasources\\datasource"),
FS: fakes.NewFakePluginFS("c:\\grafana\\public\\app\\plugins\\app\\testdata-app\\datasources\\datasource"),
}
parent := &plugins.Plugin{
JSONData: plugins.JSONData{
@@ -107,7 +107,7 @@ func Test_configureAppChildPlugin(t *testing.T) {
Info: plugins.Info{Version: "1.0.0"},
},
Class: plugins.ClassCore,
FS: fakes.NewFakePluginFiles("c:\\grafana\\public\\app\\plugins\\app\\testdata-app"),
FS: fakes.NewFakePluginFS("c:\\grafana\\public\\app\\plugins\\app\\testdata-app"),
BaseURL: "public/app/plugins/app/testdata-app",
}
@@ -119,7 +119,7 @@ func Test_configureAppChildPlugin(t *testing.T) {
t.Run("Child plugin will not inherit parent version information when version is non-empty", func(t *testing.T) {
child := &plugins.Plugin{
FS: fakes.NewFakePluginFiles("/plugins/parent-app/child-panel"),
FS: fakes.NewFakePluginFS("/plugins/parent-app/child-panel"),
JSONData: plugins.JSONData{
Info: plugins.Info{Version: "2.0.2"},
},
@@ -131,7 +131,7 @@ func Test_configureAppChildPlugin(t *testing.T) {
Info: plugins.Info{Version: "2.0.0"},
},
Class: plugins.ClassExternal,
FS: fakes.NewFakePluginFiles("/plugins/parent-app"),
FS: fakes.NewFakePluginFS("/plugins/parent-app"),
BaseURL: "plugins/parent-app",
}