From 003f0e59183652a128f712fe21342b570ed92a34 Mon Sep 17 00:00:00 2001 From: Andres Martinez Gotor Date: Wed, 22 Jan 2025 15:41:34 +0100 Subject: [PATCH] Plugins: Expose function to retrieve gcom info (#99372) --- pkg/plugins/manager/fakes/fakes.go | 4 ++++ pkg/plugins/repo/ifaces.go | 2 ++ pkg/plugins/repo/models.go | 7 +++++++ pkg/plugins/repo/service.go | 23 +++++++++++++++++++++++ pkg/plugins/repo/service_test.go | 25 +++++++++++++++++++++++++ 5 files changed, 61 insertions(+) diff --git a/pkg/plugins/manager/fakes/fakes.go b/pkg/plugins/manager/fakes/fakes.go index 04623adda41..d84de30e969 100644 --- a/pkg/plugins/manager/fakes/fakes.go +++ b/pkg/plugins/manager/fakes/fakes.go @@ -272,6 +272,10 @@ func (r *FakePluginRepo) PluginVersion(ctx context.Context, pluginID, version st return repo.VersionData{}, nil } +func (r *FakePluginRepo) PluginInfo(ctx context.Context, pluginID string) (*repo.PluginInfo, error) { + return &repo.PluginInfo{}, nil +} + type fakeTracerProvider struct { noop.TracerProvider } diff --git a/pkg/plugins/repo/ifaces.go b/pkg/plugins/repo/ifaces.go index a03194b7597..a21edd846e3 100644 --- a/pkg/plugins/repo/ifaces.go +++ b/pkg/plugins/repo/ifaces.go @@ -16,6 +16,8 @@ type Service interface { GetPluginArchiveInfo(ctx context.Context, pluginID, version string, opts CompatOpts) (*PluginArchiveInfo, error) // PluginVersion will return plugin version based on the requested information. PluginVersion(ctx context.Context, pluginID, version string, compatOpts CompatOpts) (VersionData, error) + // PluginInfo will return generic plugin information from grafana.com/api/plugins. + PluginInfo(ctx context.Context, pluginID string) (*PluginInfo, error) } type CompatOpts struct { diff --git a/pkg/plugins/repo/models.go b/pkg/plugins/repo/models.go index 73c06259810..2b3e7123124 100644 --- a/pkg/plugins/repo/models.go +++ b/pkg/plugins/repo/models.go @@ -32,3 +32,10 @@ type ArchMeta struct { PackageName string `json:"packageName"` DownloadURL string `json:"downloadUrl"` } + +// PluginInfo is (a subset of) the JSON response from grafana.com/api/plugins/$pluginID +type PluginInfo struct { + ID int `json:"id"` + Status string `json:"status"` + Slug string `json:"slug"` +} diff --git a/pkg/plugins/repo/service.go b/pkg/plugins/repo/service.go index a7a1a7f8660..ef4c55e7d4f 100644 --- a/pkg/plugins/repo/service.go +++ b/pkg/plugins/repo/service.go @@ -131,3 +131,26 @@ func (m *Manager) grafanaCompatiblePluginVersions(ctx context.Context, pluginID return v.Versions, nil } + +func (m *Manager) PluginInfo(ctx context.Context, pluginID string) (*PluginInfo, error) { + u, err := url.Parse(m.client.grafanaComAPIURL) + if err != nil { + return nil, err + } + + u.Path = path.Join(u.Path, pluginID) + + body, err := m.client.SendReq(ctx, u, CompatOpts{}) + if err != nil { + return nil, err + } + + var v PluginInfo + err = json.Unmarshal(body, &v) + if err != nil { + m.log.Error("Failed to unmarshal plugin repo response", "error", err) + return nil, err + } + + return &v, nil +} diff --git a/pkg/plugins/repo/service_test.go b/pkg/plugins/repo/service_test.go index 887fe42868f..c7a51834c11 100644 --- a/pkg/plugins/repo/service_test.go +++ b/pkg/plugins/repo/service_test.go @@ -108,6 +108,31 @@ func TestGetPluginArchive(t *testing.T) { } } +func TestPluginInfo(t *testing.T) { + const ( + pluginID = "grafana-test-datasource" + ) + + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, fmt.Sprintf("/%s", pluginID), r.URL.Path) + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write([]byte(fmt.Sprintf(`{ "id": 1, "slug": "%s", "status": "active" }`, pluginID))) + })) + t.Cleanup(srv.Close) + + m := NewManager(ManagerCfg{ + SkipTLSVerify: false, + BaseURL: srv.URL, + Logger: log.NewTestPrettyLogger(), + }) + pi, err := m.PluginInfo(context.Background(), pluginID) + require.NoError(t, err) + require.Equal(t, 1, pi.ID) + require.Equal(t, pluginID, pi.Slug) + require.Equal(t, "active", pi.Status) +} + func verifyArchive(t *testing.T, archive *PluginArchive) { t.Helper() require.NotNil(t, archive)