diff --git a/pkg/plugins/datasource_plugin.go b/pkg/plugins/datasource_plugin.go index 2b3cf742ff8..c3fc50804d8 100644 --- a/pkg/plugins/datasource_plugin.go +++ b/pkg/plugins/datasource_plugin.go @@ -10,6 +10,7 @@ import ( "time" "github.com/grafana/grafana/pkg/setting" + "github.com/grafana/grafana/pkg/util/errutil" datasourceV1 "github.com/grafana/grafana-plugin-model/go/datasource" sdk "github.com/grafana/grafana-plugin-sdk-go" @@ -46,16 +47,16 @@ type DataSourcePlugin struct { } func (p *DataSourcePlugin) Load(decoder *json.Decoder, pluginDir string) error { - if err := decoder.Decode(&p); err != nil { - return err + if err := decoder.Decode(p); err != nil { + return errutil.Wrapf(err, "Failed to decode datasource plugin") } if !p.isVersionOne() && !setting.IsExpressionsEnabled() { - return errors.New("A plugin version 2 was found but expressions feature toggle is not enabled") + return errors.New("A plugin version 2 was found, but expressions feature toggle is not enabled") } if err := p.registerPlugin(pluginDir); err != nil { - return err + return errutil.Wrapf(err, "Failed to register plugin") } DataSources[p.Id] = p diff --git a/pkg/plugins/datasource_plugin_test.go b/pkg/plugins/datasource_plugin_test.go index a29961902ec..addc79c1636 100644 --- a/pkg/plugins/datasource_plugin_test.go +++ b/pkg/plugins/datasource_plugin_test.go @@ -5,30 +5,68 @@ import ( "encoding/json" "testing" + "github.com/grafana/grafana/pkg/setting" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestLoadDatasourceVersion(t *testing.T) { t.Run("If plugin version is not set, it should be treated as plugin version one", func(t *testing.T) { - pluginJSON, _ := json.Marshal(DataSourcePlugin{}) + refPlug := DataSourcePlugin{} + pluginJSON, err := json.Marshal(refPlug) + require.NoError(t, err) + datasourcePlugin := DataSourcePlugin{} - (&datasourcePlugin).Load(json.NewDecoder(bytes.NewReader(pluginJSON)), "/tmp") + err = datasourcePlugin.Load(json.NewDecoder(bytes.NewReader(pluginJSON)), "/tmp") + require.NoError(t, err) + delete(Plugins, refPlug.Id) + delete(DataSources, refPlug.Id) + assert.True(t, datasourcePlugin.isVersionOne()) }) t.Run("If plugin version is set to one, it should be treated as plugin version one", func(t *testing.T) { - pluginJSON, _ := json.Marshal(DataSourcePlugin{SDK: false}) + refPlug := DataSourcePlugin{SDK: false} + pluginJSON, err := json.Marshal(refPlug) + require.NoError(t, err) + datasourcePlugin := DataSourcePlugin{} - (&datasourcePlugin).Load(json.NewDecoder(bytes.NewReader(pluginJSON)), "/tmp") + err = datasourcePlugin.Load(json.NewDecoder(bytes.NewReader(pluginJSON)), "/tmp") + require.NoError(t, err) + delete(Plugins, refPlug.Id) + delete(DataSources, refPlug.Id) + assert.True(t, datasourcePlugin.isVersionOne()) assert.False(t, datasourcePlugin.SDK) }) t.Run("If plugin version is set to two, it should not be treated as plugin version one", func(t *testing.T) { - pluginJSON, _ := json.Marshal(DataSourcePlugin{SDK: true}) + refPlug := DataSourcePlugin{SDK: true} + pluginJSON, err := json.Marshal(refPlug) + require.NoError(t, err) + + origToggles := setting.FeatureToggles + setting.FeatureToggles = map[string]bool{"expressions": true} datasourcePlugin := DataSourcePlugin{} - (&datasourcePlugin).Load(json.NewDecoder(bytes.NewReader(pluginJSON)), "/tmp") + err = datasourcePlugin.Load(json.NewDecoder(bytes.NewReader(pluginJSON)), "/tmp") + setting.FeatureToggles = origToggles + require.NoError(t, err) + delete(Plugins, refPlug.Id) + delete(DataSources, refPlug.Id) + assert.False(t, datasourcePlugin.isVersionOne()) assert.True(t, datasourcePlugin.SDK) }) + + t.Run("Plugin version two requires expressions feature to be toggled", func(t *testing.T) { + refPlug := DataSourcePlugin{SDK: true} + pluginJSON, err := json.Marshal(refPlug) + require.NoError(t, err) + + require.Nil(t, setting.FeatureToggles, "setting.FeatureToggles shouldn't be set") + datasourcePlugin := DataSourcePlugin{} + err = datasourcePlugin.Load(json.NewDecoder(bytes.NewReader(pluginJSON)), "/tmp") + require.EqualError(t, err, "A plugin version 2 was found, but expressions feature toggle is not enabled") + }) } diff --git a/pkg/plugins/models.go b/pkg/plugins/models.go index 014c2d00bf2..eba868d6c44 100644 --- a/pkg/plugins/models.go +++ b/pkg/plugins/models.go @@ -2,7 +2,6 @@ package plugins import ( "encoding/json" - "errors" "fmt" "strings" @@ -61,7 +60,7 @@ type PluginBase struct { func (pb *PluginBase) registerPlugin(pluginDir string) error { if _, exists := Plugins[pb.Id]; exists { - return errors.New("Plugin with same id already exists") + return fmt.Errorf("Plugin with ID %q already exists", pb.Id) } if !strings.HasPrefix(pluginDir, setting.StaticRootPath) { diff --git a/scripts/go/configs/.golangci.yml b/scripts/go/configs/.golangci.yml index b59660c4d77..a62a619c764 100644 --- a/scripts/go/configs/.golangci.yml +++ b/scripts/go/configs/.golangci.yml @@ -1,7 +1,7 @@ enable: -run: - deadline: 10m +run: + deadline: 10m linters: disable-all: true @@ -15,11 +15,11 @@ linters: - typecheck - unconvert - unused - - varcheck - - goconst - - staticcheck + - varcheck + - goconst + - staticcheck + - errcheck linter-settings: goconst: ignore-tests: true - \ No newline at end of file