Advisor: Avoid one GCOM request per plugin (#105180)
This commit is contained in:
@@ -16,8 +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, compatOpts CompatOpts) (*PluginInfo, error)
|
||||
// GetPluginsInfo will return a list of plugins from grafana.com/api/plugins.
|
||||
GetPluginsInfo(ctx context.Context, compatOpts CompatOpts) ([]PluginInfo, error)
|
||||
}
|
||||
|
||||
type CompatOpts struct {
|
||||
|
||||
@@ -35,7 +35,8 @@ type ArchMeta struct {
|
||||
|
||||
// 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"`
|
||||
ID int `json:"id"`
|
||||
Status string `json:"status"`
|
||||
Slug string `json:"slug"`
|
||||
Version string `json:"version"`
|
||||
}
|
||||
|
||||
@@ -132,25 +132,25 @@ func (m *Manager) grafanaCompatiblePluginVersions(ctx context.Context, pluginID
|
||||
return v.Versions, nil
|
||||
}
|
||||
|
||||
func (m *Manager) PluginInfo(ctx context.Context, pluginID string, compatOpts CompatOpts) (*PluginInfo, error) {
|
||||
func (m *Manager) GetPluginsInfo(ctx context.Context, compatOpts CompatOpts) ([]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
|
||||
var v struct {
|
||||
Items []PluginInfo `json:"items"`
|
||||
}
|
||||
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
|
||||
return v.Items, nil
|
||||
}
|
||||
|
||||
@@ -108,16 +108,17 @@ func TestGetPluginArchive(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestPluginInfo(t *testing.T) {
|
||||
func TestPluginIndex(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)
|
||||
require.Equal(t, "12.0.0", r.Header.Get("grafana-version"))
|
||||
require.Equal(t, "grafana 12.0.0", r.Header.Get("User-Agent"))
|
||||
w.WriteHeader(http.StatusOK)
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
_, _ = fmt.Fprintf(w, `{ "id": 1, "slug": "%s", "status": "active" }`, pluginID)
|
||||
_, _ = fmt.Fprintf(w, `{"items": [{ "id": 1, "slug": "%s", "status": "active" }]}`, pluginID)
|
||||
}))
|
||||
t.Cleanup(srv.Close)
|
||||
|
||||
@@ -126,11 +127,18 @@ func TestPluginInfo(t *testing.T) {
|
||||
BaseURL: srv.URL,
|
||||
Logger: log.NewTestPrettyLogger(),
|
||||
})
|
||||
pi, err := m.PluginInfo(context.Background(), pluginID, CompatOpts{})
|
||||
pi, err := m.GetPluginsInfo(context.Background(), CompatOpts{
|
||||
grafanaVersion: "12.0.0",
|
||||
system: SystemCompatOpts{
|
||||
os: "darwin",
|
||||
arch: "amd64",
|
||||
},
|
||||
})
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, 1, pi.ID)
|
||||
require.Equal(t, pluginID, pi.Slug)
|
||||
require.Equal(t, "active", pi.Status)
|
||||
require.Len(t, pi, 1)
|
||||
require.Equal(t, 1, pi[0].ID)
|
||||
require.Equal(t, pluginID, pi[0].Slug)
|
||||
require.Equal(t, "active", pi[0].Status)
|
||||
}
|
||||
|
||||
func verifyArchive(t *testing.T, archive *PluginArchive) {
|
||||
|
||||
Reference in New Issue
Block a user