Plugins: StaticFS should implement FSRemover (#110706) (#110944)

make staticfs implement fs removal interface
This commit is contained in:
Will Browne
2025-09-11 14:44:29 +01:00
committed by GitHub
parent 8b83e016ec
commit 4bd77ff7bb
6 changed files with 406 additions and 1 deletions
+99
View File
@@ -5,6 +5,8 @@ import (
"context"
"errors"
"fmt"
"os"
"path/filepath"
"runtime"
"testing"
@@ -422,3 +424,100 @@ func createPlugin(t *testing.T, pluginID string, class plugins.Class, managed, b
func testCompatOpts() plugins.AddOpts {
return plugins.NewAddOpts("10.0.0", runtime.GOOS, runtime.GOARCH, "")
}
func TestPluginInstaller_Removal(t *testing.T) {
tmpDir := t.TempDir()
t.Run("LocalFS plugin removal succeeds via installer.Remove", func(t *testing.T) {
pluginDir := filepath.Join(tmpDir, "localfs-plugin")
err := os.MkdirAll(pluginDir, 0750)
require.NoError(t, err)
pluginJSON := `{
"id": "localfs-plugin",
"name": "LocalFS Plugin",
"type": "datasource",
"info": {
"version": "1.0.0"
}
}`
err = os.WriteFile(filepath.Join(pluginDir, "plugin.json"), []byte(pluginJSON), 0644)
require.NoError(t, err)
localFS := plugins.NewLocalFS(pluginDir)
pluginV1 := createPlugin(t, "localfs-plugin", plugins.ClassExternal, true, true, func(plugin *plugins.Plugin) {
plugin.Info.Version = "1.0.0"
plugin.FS = localFS
})
registry := &fakes.FakePluginRegistry{
Store: map[string]*plugins.Plugin{
"localfs-plugin": pluginV1,
},
}
loader := &fakes.FakeLoader{
UnloadFunc: func(_ context.Context, p *plugins.Plugin) (*plugins.Plugin, error) {
return p, nil
},
}
_, err = os.Stat(pluginDir)
require.NoError(t, err)
inst := New(&config.PluginManagementCfg{}, registry, loader, &fakes.FakePluginRepo{}, &fakes.FakePluginStorage{}, storage.SimpleDirNameGeneratorFunc, &fakes.FakeAuthService{})
err = inst.Remove(context.Background(), "localfs-plugin", "1.0.0")
require.NoError(t, err)
_, err = os.Stat(pluginDir)
require.True(t, os.IsNotExist(err))
})
t.Run("StaticFS plugin removal is skipped via installer.Remove", func(t *testing.T) {
pluginDir := filepath.Join(tmpDir, "staticfs-plugin")
err := os.MkdirAll(pluginDir, 0750)
require.NoError(t, err)
pluginJSON := `{
"id": "staticfs-plugin",
"name": "StaticFS Plugin",
"type": "datasource",
"info": {
"version": "1.0.0"
}
}`
err = os.WriteFile(filepath.Join(pluginDir, "plugin.json"), []byte(pluginJSON), 0644)
require.NoError(t, err)
localFS := plugins.NewLocalFS(pluginDir)
staticFS, err := plugins.NewStaticFS(localFS)
require.NoError(t, err)
pluginV1 := createPlugin(t, "staticfs-plugin", plugins.ClassExternal, true, true, func(plugin *plugins.Plugin) {
plugin.Info.Version = "1.0.0"
plugin.FS = staticFS
})
registry := &fakes.FakePluginRegistry{
Store: map[string]*plugins.Plugin{
"staticfs-plugin": pluginV1,
},
}
loader := &fakes.FakeLoader{
UnloadFunc: func(_ context.Context, p *plugins.Plugin) (*plugins.Plugin, error) {
return p, nil
},
}
_, err = os.Stat(pluginDir)
require.NoError(t, err)
inst := New(&config.PluginManagementCfg{}, registry, loader, &fakes.FakePluginRepo{}, &fakes.FakePluginStorage{}, storage.SimpleDirNameGeneratorFunc, &fakes.FakeAuthService{})
err = inst.Remove(context.Background(), "staticfs-plugin", "1.0.0")
require.NoError(t, err)
_, err = os.Stat(pluginDir)
require.ErrorIs(t, err, os.ErrNotExist)
})
}
@@ -2,6 +2,7 @@ package sources
import (
"errors"
"os"
"path/filepath"
"testing"
@@ -110,3 +111,32 @@ func TestDirAsLocalSources(t *testing.T) {
})
}
}
func TestLocalSource(t *testing.T) {
t.Run("NewLocalSource should always return plugins with StaticFS", func(t *testing.T) {
tmpDir := t.TempDir()
pluginID := "test-plugin"
pluginDir := filepath.Join(tmpDir, pluginID)
err := os.MkdirAll(pluginDir, 0750)
require.NoError(t, err)
pluginJSON := `{
"id": "test-plugin",
"name": "Test Plugin",
"type": "datasource",
"info": {
"version": "1.0.0"
}
}`
err = os.WriteFile(filepath.Join(pluginDir, "plugin.json"), []byte(pluginJSON), 0644)
require.NoError(t, err)
bundles, err := NewLocalSource(plugins.ClassExternal, []string{pluginDir}).Discover(t.Context())
require.NoError(t, err)
require.Len(t, bundles, 1, "Should discover exactly one plugin")
require.Equal(t, pluginID, bundles[0].Primary.JSONData.ID)
_, canRemove := bundles[0].Primary.FS.(plugins.FSRemover)
require.True(t, canRemove)
})
}