feat: pass gcom sso_api_token to repo created from install command (#98973)

* feat: pass gcom sso_api_token to repo created from install command

* fix

* fix: extract gcom section to a func

* Update pkg/cmd/grafana-cli/utils/command_line.go

Co-authored-by: Giuseppe Guerra <giuseppe.guerra@grafana.com>

* fix: only set gcom token when the request is to GCOM

---------

Co-authored-by: Giuseppe Guerra <giuseppe.guerra@grafana.com>
This commit is contained in:
Syerikjan Kh
2025-01-15 08:15:18 -05:00
committed by GitHub
co-authored by Giuseppe Guerra
parent 79fc26ea87
commit dfe0712955
8 changed files with 88 additions and 22 deletions
+5 -2
View File
@@ -14,6 +14,7 @@ import (
"net/http"
"net/url"
"os"
"strings"
"time"
"github.com/grafana/grafana/pkg/plugins/log"
@@ -24,16 +25,18 @@ type Client struct {
httpClientNoTimeout http.Client
retryCount int
grafanaComAPIToken string
grafanaComAPIURL string
log log.PrettyLogger
}
func NewClient(skipTLSVerify bool, grafanaComAPIToken string, logger log.PrettyLogger) *Client {
func NewClient(skipTLSVerify bool, grafanaComAPIToken, grafanaComAPIURL string, logger log.PrettyLogger) *Client {
return &Client{
httpClient: MakeHttpClient(skipTLSVerify, 10*time.Second),
httpClientNoTimeout: MakeHttpClient(skipTLSVerify, 0),
log: logger,
grafanaComAPIToken: grafanaComAPIToken,
grafanaComAPIURL: grafanaComAPIURL,
}
}
@@ -233,7 +236,7 @@ func (c *Client) createReq(ctx context.Context, url *url.URL, compatOpts CompatO
req.Header.Set("grafana-origin", orig.(string))
}
if c.grafanaComAPIToken != "" {
if strings.HasPrefix(url.String(), c.grafanaComAPIURL) && c.grafanaComAPIToken != "" {
req.Header.Set("Authorization", "Bearer "+c.grafanaComAPIToken)
}
+23 -3
View File
@@ -70,7 +70,7 @@ func Test_Download(t *testing.T) {
require.Equal(t, 2, count, "should retry on error")
})
t.Run("it should use gcom token when it's available", func(t *testing.T) {
t.Run("it should use gcom token when the token is available and request is to GCOM", func(t *testing.T) {
expectedToken := "token-test"
var gcomCalled bool
fakeServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
@@ -82,9 +82,29 @@ func Test_Download(t *testing.T) {
}))
defer fakeServer.Close()
cli := fakeServer.Client()
repo := Client{httpClient: *cli, httpClientNoTimeout: *cli, log: log.NewPrettyLogger("test"), grafanaComAPIToken: expectedToken}
_, err := repo.Download(context.Background(), fakeServer.URL, "", CompatOpts{})
pluginURL := fakeServer.URL + "/api/plugins/test-datasource"
gcomAPIURL := fakeServer.URL + "/api/plugins"
repo := Client{httpClient: *cli, httpClientNoTimeout: *cli, log: log.NewPrettyLogger("test"), grafanaComAPIToken: expectedToken, grafanaComAPIURL: gcomAPIURL}
_, err := repo.Download(context.Background(), pluginURL, "", CompatOpts{})
require.NoError(t, err)
require.True(t, gcomCalled)
})
t.Run("it should not set gcom token when the token is available but request is NOT to GCOM", func(t *testing.T) {
expectedToken := "token-test"
var serverCalled bool
fakeServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
token := r.Header.Get("Authorization")
require.Empty(t, token, "token should not be set")
err := writeFakeZip(w)
require.NoError(t, err)
serverCalled = true
}))
defer fakeServer.Close()
cli := fakeServer.Client()
repo := Client{httpClient: *cli, httpClientNoTimeout: *cli, log: log.NewPrettyLogger("test"), grafanaComAPIToken: expectedToken, grafanaComAPIURL: "https://grafana.com/api/plugins"}
_, err := repo.Download(context.Background(), fakeServer.URL, "", CompatOpts{})
require.NoError(t, err)
require.True(t, serverCalled)
})
}
+5 -7
View File
@@ -14,8 +14,7 @@ import (
)
type Manager struct {
client *Client
baseURL string
client *Client
log log.PrettyLogger
}
@@ -43,9 +42,8 @@ type ManagerCfg struct {
func NewManager(cfg ManagerCfg) *Manager {
return &Manager{
baseURL: cfg.BaseURL,
client: NewClient(cfg.SkipTLSVerify, cfg.GrafanaComAPIToken, cfg.Logger),
log: cfg.Logger,
client: NewClient(cfg.SkipTLSVerify, cfg.GrafanaComAPIToken, cfg.BaseURL, cfg.Logger),
log: cfg.Logger,
}
}
@@ -101,12 +99,12 @@ func (m *Manager) PluginVersion(ctx context.Context, pluginID, version string, c
}
func (m *Manager) downloadURL(pluginID, version string) string {
return fmt.Sprintf("%s/%s/versions/%s/download", m.baseURL, pluginID, version)
return fmt.Sprintf("%s/%s/versions/%s/download", m.client.grafanaComAPIURL, pluginID, version)
}
// grafanaCompatiblePluginVersions will get version info from /api/plugins/$pluginID/versions
func (m *Manager) grafanaCompatiblePluginVersions(ctx context.Context, pluginID string, compatOpts CompatOpts) ([]Version, error) {
u, err := url.Parse(m.baseURL)
u, err := url.Parse(m.client.grafanaComAPIURL)
if err != nil {
return nil, err
}