Plugins: Remove bundled plugins feature (#96490)

* remove bundled plugins

* Add echo to command

Co-authored-by: Andres Martinez Gotor <andres.martinez@grafana.com>

* remove folder entirely

* remove folder from CODEOWNERS

---------

Co-authored-by: Andres Martinez Gotor <andres.martinez@grafana.com>
This commit is contained in:
Will Browne
2025-01-14 12:04:01 +00:00
committed by GitHub
co-authored by Andres Martinez Gotor
parent ff032a61d5
commit 70fb7b9545
23 changed files with 46 additions and 207 deletions
+2 -2
View File
@@ -95,7 +95,7 @@ func (m *PluginInstaller) install(ctx context.Context, pluginID, version string,
return nil, err
}
if plugin, exists := m.plugin(ctx, pluginID, version); exists {
if plugin.IsCorePlugin() || plugin.IsBundledPlugin() {
if plugin.IsCorePlugin() {
return nil, plugins.ErrInstallCorePlugin
}
@@ -194,7 +194,7 @@ func (m *PluginInstaller) Remove(ctx context.Context, pluginID, version string)
return plugins.ErrPluginNotInstalled
}
if plugin.IsCorePlugin() || plugin.IsBundledPlugin() {
if plugin.IsCorePlugin() {
return plugins.ErrUninstallCorePlugin
}
+18 -27
View File
@@ -212,37 +212,28 @@ func TestPluginManager_Add_Remove(t *testing.T) {
})
})
t.Run("Can't update core or bundled plugin", func(t *testing.T) {
tcs := []struct {
class plugins.Class
}{
{class: plugins.ClassCore},
{class: plugins.ClassBundled},
t.Run("Can't update core plugin", func(t *testing.T) {
p := createPlugin(t, testPluginID, plugins.ClassCore, true, true, func(plugin *plugins.Plugin) {
plugin.Info.Version = "1.0.0"
})
reg := &fakes.FakePluginRegistry{
Store: map[string]*plugins.Plugin{
testPluginID: p,
},
}
for _, tc := range tcs {
p := createPlugin(t, testPluginID, tc.class, true, true, func(plugin *plugins.Plugin) {
plugin.Info.Version = "1.0.0"
})
pm := New(reg, &fakes.FakeLoader{}, &fakes.FakePluginRepo{}, &fakes.FakePluginStorage{}, storage.SimpleDirNameGeneratorFunc, &fakes.FakeAuthService{})
err := pm.Add(context.Background(), p.ID, "3.2.0", testCompatOpts())
require.ErrorIs(t, err, plugins.ErrInstallCorePlugin)
reg := &fakes.FakePluginRegistry{
Store: map[string]*plugins.Plugin{
testPluginID: p,
},
}
err = pm.Add(context.Background(), testPluginID, "", testCompatOpts())
require.Equal(t, plugins.ErrInstallCorePlugin, err)
pm := New(reg, &fakes.FakeLoader{}, &fakes.FakePluginRepo{}, &fakes.FakePluginStorage{}, storage.SimpleDirNameGeneratorFunc, &fakes.FakeAuthService{})
err := pm.Add(context.Background(), p.ID, "3.2.0", testCompatOpts())
require.ErrorIs(t, err, plugins.ErrInstallCorePlugin)
err = pm.Add(context.Background(), testPluginID, "", testCompatOpts())
require.Equal(t, plugins.ErrInstallCorePlugin, err)
t.Run(fmt.Sprintf("Can't uninstall %s plugin", tc.class), func(t *testing.T) {
err = pm.Remove(context.Background(), p.ID, p.Info.Version)
require.Equal(t, plugins.ErrUninstallCorePlugin, err)
})
}
t.Run("Can't uninstall core plugin", func(t *testing.T) {
err = pm.Remove(context.Background(), p.ID, p.Info.Version)
require.Equal(t, plugins.ErrUninstallCorePlugin, err)
})
})
t.Run("Can install multiple dependency levels", func(t *testing.T) {
-50
View File
@@ -124,56 +124,6 @@ func TestLoader_Load(t *testing.T) {
},
},
},
{
name: "Load a Bundled plugin",
class: plugins.ClassBundled,
cfg: &config.PluginManagementCfg{},
pluginPaths: []string{"../testdata/valid-v2-signature"},
want: []*plugins.Plugin{
{
JSONData: plugins.JSONData{
ID: "test-datasource",
Type: plugins.TypeDataSource,
Name: "Test",
Info: plugins.Info{
Author: plugins.InfoLink{
Name: "Will Browne",
URL: "https://willbrowne.com",
},
Version: "1.0.0",
Logos: plugins.Logos{
Small: "public/img/icn-datasource.svg",
Large: "public/img/icn-datasource.svg",
},
Description: "Test",
},
Dependencies: plugins.Dependencies{
GrafanaVersion: "*",
Plugins: []plugins.Dependency{},
Extensions: plugins.ExtensionsDependencies{
ExposedComponents: []string{},
},
},
Extensions: plugins.Extensions{
AddedLinks: []plugins.AddedLink{},
AddedComponents: []plugins.AddedComponent{},
ExposedComponents: []plugins.ExposedComponent{},
ExtensionPoints: []plugins.ExtensionPoint{},
},
Executable: "test",
Backend: true,
State: "alpha",
},
Module: "public/plugins/test-datasource/module.js",
BaseURL: "public/plugins/test-datasource",
FS: mustNewStaticFSForTests(t, filepath.Join(parentDir, "testdata/valid-v2-signature/plugin/")),
Signature: "valid",
SignatureType: plugins.SignatureTypeGrafana,
SignatureOrg: "Grafana Labs",
Class: plugins.ClassBundled,
},
},
},
{
name: "Load plugin with symbolic links",
class: plugins.ClassExternal,
+1 -1
View File
@@ -49,7 +49,7 @@ func (s *Validation) ValidateSignature(plugin *plugins.Plugin) error {
}
}
if plugin.IsCorePlugin() || plugin.IsBundledPlugin() {
if plugin.IsCorePlugin() {
return nil
}
-1
View File
@@ -24,7 +24,6 @@ func ProvideService(cfg *setting.Cfg) *Service {
func (s *Service) List(_ context.Context) []plugins.PluginSource {
r := []plugins.PluginSource{
NewLocalSource(plugins.ClassCore, corePluginPaths(s.cfg.StaticRootPath)),
NewLocalSource(plugins.ClassBundled, []string{s.cfg.BundledPluginsPath}),
}
r = append(r, s.externalPluginSources()...)
r = append(r, s.pluginSettingSources()...)
+11 -23
View File
@@ -17,9 +17,8 @@ func TestSources_List(t *testing.T) {
require.NoError(t, err)
cfg := &setting.Cfg{
StaticRootPath: testdata,
PluginsPath: filepath.Join(testdata, "pluginRootWithDist"),
BundledPluginsPath: filepath.Join(testdata, "unsigned-panel"),
StaticRootPath: testdata,
PluginsPath: filepath.Join(testdata, "pluginRootWithDist"),
PluginSettings: setting.PluginSettings{
"foo": map[string]string{
"path": filepath.Join(testdata, "test-app"),
@@ -35,7 +34,7 @@ func TestSources_List(t *testing.T) {
ctx := context.Background()
require.Len(t, srcs, 6)
require.Len(t, srcs, 5)
require.Equal(t, srcs[0].PluginClass(ctx), plugins.ClassCore)
require.Equal(t, srcs[0].PluginURIs(ctx), []string{
@@ -48,15 +47,17 @@ func TestSources_List(t *testing.T) {
require.Equal(t, plugins.SignatureType(""), sig.Type)
require.Equal(t, "", sig.SigningOrg)
require.Equal(t, srcs[1].PluginClass(ctx), plugins.ClassBundled)
require.Equal(t, srcs[1].PluginURIs(ctx), []string{filepath.Join(testdata, "unsigned-panel")})
require.Equal(t, srcs[1].PluginClass(ctx), plugins.ClassExternal)
require.Equal(t, srcs[1].PluginURIs(ctx), []string{
filepath.Join(testdata, "pluginRootWithDist", "datasource"),
})
sig, exists = srcs[1].DefaultSignature(ctx)
require.False(t, exists)
require.Equal(t, plugins.Signature{}, sig)
require.Equal(t, srcs[2].PluginClass(ctx), plugins.ClassExternal)
require.Equal(t, srcs[2].PluginURIs(ctx), []string{
filepath.Join(testdata, "pluginRootWithDist", "datasource"),
filepath.Join(testdata, "pluginRootWithDist", "dist"),
})
sig, exists = srcs[2].DefaultSignature(ctx)
require.False(t, exists)
@@ -64,17 +65,9 @@ func TestSources_List(t *testing.T) {
require.Equal(t, srcs[3].PluginClass(ctx), plugins.ClassExternal)
require.Equal(t, srcs[3].PluginURIs(ctx), []string{
filepath.Join(testdata, "pluginRootWithDist", "dist"),
})
sig, exists = srcs[3].DefaultSignature(ctx)
require.False(t, exists)
require.Equal(t, plugins.Signature{}, sig)
require.Equal(t, srcs[4].PluginClass(ctx), plugins.ClassExternal)
require.Equal(t, srcs[4].PluginURIs(ctx), []string{
filepath.Join(testdata, "pluginRootWithDist", "panel"),
})
sig, exists = srcs[4].DefaultSignature(ctx)
sig, exists = srcs[3].DefaultSignature(ctx)
require.False(t, exists)
require.Equal(t, plugins.Signature{}, sig)
})
@@ -84,9 +77,8 @@ func TestSources_List(t *testing.T) {
require.NoError(t, err)
cfg := &setting.Cfg{
StaticRootPath: testdata,
PluginsPath: filepath.Join(testdata, "symbolic-plugin-dirs"),
BundledPluginsPath: filepath.Join(testdata, "unsigned-panel"),
StaticRootPath: testdata,
PluginsPath: filepath.Join(testdata, "symbolic-plugin-dirs"),
}
s := ProvideService(cfg)
ctx := context.Background()
@@ -107,10 +99,6 @@ func TestSources_List(t *testing.T) {
filepath.Join(testdata, "app", "plugins", "panel"): {},
}, "should include core plugins")
require.Equal(t, uris[plugins.ClassBundled], map[string]struct{}{
filepath.Join(testdata, "unsigned-panel"): {},
}, "should include bundle plugin")
require.Equal(t, uris[plugins.ClassExternal], map[string]struct{}{
filepath.Join(testdata, "symbolic-plugin-dirs", "plugin"): {},
}, "should include external symlinked plugin")
+1 -6
View File
@@ -494,19 +494,14 @@ func (p *Plugin) IsCorePlugin() bool {
return p.Class == ClassCore
}
func (p *Plugin) IsBundledPlugin() bool {
return p.Class == ClassBundled
}
func (p *Plugin) IsExternalPlugin() bool {
return !p.IsCorePlugin() && !p.IsBundledPlugin()
return !p.IsCorePlugin()
}
type Class string
const (
ClassCore Class = "core"
ClassBundled Class = "bundled"
ClassExternal Class = "external"
ClassCDN Class = "cdn"
)