Plugins: Make it possible to support multiple plugin versions (#82116)

* first pass

* use version in more places

* add comment

* update installer

* fix wire

* fix tests

* tidy

* simplify changes

* fix in mem

* remove unused step

* fix step dupe logic for child plugins + add tests
This commit is contained in:
Will Browne
2024-02-12 12:47:49 +01:00
committed by GitHub
parent 730e1d2485
commit 788b9afda3
24 changed files with 292 additions and 131 deletions

View File

@ -11,29 +11,41 @@ import (
"github.com/grafana/grafana/pkg/plugins"
)
const pluginID = "test-ds"
const (
pluginID = "test-ds"
v1 = "1.0.0"
v2 = "2.0.0"
)
func TestInMemory(t *testing.T) {
t.Run("Test mix of registry operations", func(t *testing.T) {
i := NewInMemory()
ctx := context.Background()
p, exists := i.Plugin(ctx, pluginID)
p, exists := i.Plugin(ctx, pluginID, v1)
require.False(t, exists)
require.Nil(t, p)
err := i.Remove(ctx, pluginID)
err := i.Remove(ctx, pluginID, v1)
require.EqualError(t, err, fmt.Errorf("plugin %s is not registered", pluginID).Error())
pv1 := &plugins.Plugin{JSONData: plugins.JSONData{ID: pluginID, Info: plugins.Info{Version: v1}}}
err = i.Add(ctx, pv1)
require.NoError(t, err)
pv2 := &plugins.Plugin{JSONData: plugins.JSONData{ID: pluginID, Info: plugins.Info{Version: v2}}}
err = i.Add(ctx, pv2)
require.Errorf(t, err, fmt.Sprintf("plugin %s is already registered", pluginID))
existingP, exists := i.Plugin(ctx, pluginID, v1)
require.True(t, exists)
require.Equal(t, pv1, existingP)
p = &plugins.Plugin{JSONData: plugins.JSONData{ID: pluginID}}
err = i.Add(ctx, p)
require.NoError(t, err)
require.Errorf(t, err, fmt.Sprintf("plugin %s is already registered", pluginID))
existingP, exists := i.Plugin(ctx, pluginID)
require.True(t, exists)
require.Equal(t, p, existingP)
err = i.Remove(ctx, pluginID)
err = i.Remove(ctx, pluginID, v1)
require.NoError(t, err)
existingPlugins := i.Plugins(ctx)
@ -87,6 +99,28 @@ func TestInMemory_Add(t *testing.T) {
},
err: fmt.Errorf("plugin %s is already registered", pluginID),
},
{
name: "Cannot add a plugin to the registry even if it has a different version",
mocks: mocks{
store: map[string]*plugins.Plugin{
pluginID: {
JSONData: plugins.JSONData{
ID: pluginID,
Info: plugins.Info{Version: v1},
},
},
},
},
args: args{
p: &plugins.Plugin{
JSONData: plugins.JSONData{
ID: pluginID,
Info: plugins.Info{Version: v2},
},
},
},
err: fmt.Errorf("plugin %s is already registered", pluginID),
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
@ -151,7 +185,7 @@ func TestInMemory_Plugin(t *testing.T) {
i := &InMemory{
store: tt.mocks.store,
}
p, exists := i.Plugin(context.Background(), tt.args.pluginID)
p, exists := i.Plugin(context.Background(), tt.args.pluginID, "")
if exists != tt.exists {
t.Errorf("Plugin() got1 = %v, expected %v", exists, tt.exists)
}
@ -265,7 +299,7 @@ func TestInMemory_Remove(t *testing.T) {
i := &InMemory{
store: tt.mocks.store,
}
err := i.Remove(context.Background(), tt.args.pluginID)
err := i.Remove(context.Background(), tt.args.pluginID, "")
require.Equal(t, tt.err, err)
})
}
@ -280,7 +314,7 @@ func TestAliasSupport(t *testing.T) {
pluginIdOld := "plugin-old"
pluginIdOld2 := "plugin-old2"
p, exists := i.Plugin(ctx, pluginIdNew)
p, exists := i.Plugin(ctx, pluginIdNew, "")
require.False(t, exists)
require.Nil(t, p)
@ -294,17 +328,17 @@ func TestAliasSupport(t *testing.T) {
require.NoError(t, err)
// Can lookup by the new ID
found, exists := i.Plugin(ctx, pluginIdNew)
found, exists := i.Plugin(ctx, pluginIdNew, "")
require.True(t, exists)
require.Equal(t, pluginNew, found)
// Can lookup by the old ID
found, exists = i.Plugin(ctx, pluginIdOld)
found, exists = i.Plugin(ctx, pluginIdOld, "")
require.True(t, exists)
require.Equal(t, pluginNew, found)
// Can lookup by the other old ID
found, exists = i.Plugin(ctx, pluginIdOld2)
found, exists = i.Plugin(ctx, pluginIdOld2, "")
require.True(t, exists)
require.Equal(t, pluginNew, found)
@ -313,7 +347,7 @@ func TestAliasSupport(t *testing.T) {
ID: pluginIdOld,
}}
require.NoError(t, i.Add(ctx, pluginOld))
found, exists = i.Plugin(ctx, pluginIdOld)
found, exists = i.Plugin(ctx, pluginIdOld, "")
require.True(t, exists)
require.Equal(t, pluginOld, found)
})