Renderer: Fix regression on callback URL in plugin mode (#103787)

* Renderer: Fix regression on callback URL in plugin mode

* cleanup

* refactor to not mutate cfg object

* apply review feedback
This commit is contained in:
Agnès Toulet
2025-04-11 15:34:10 +02:00
committed by GitHub
parent f1625d9e56
commit d7c554c25e
6 changed files with 133 additions and 74 deletions
+87 -13
View File
@@ -14,6 +14,7 @@ import (
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/services/featuremgmt"
"github.com/grafana/grafana/pkg/setting"
)
@@ -25,21 +26,21 @@ func TestGetUrl(t *testing.T) {
}
t.Run("When renderer and callback url configured should return callback url plus path", func(t *testing.T) {
rs.Cfg.RendererUrl = "http://localhost:8081/render"
rs.Cfg.RendererCallbackUrl = "http://public-grafana.com/"
rs.Cfg.RendererServerUrl = "http://localhost:8081/render"
rs.rendererCallbackURL = "http://public-grafana.com/"
url := rs.getGrafanaCallbackURL(path)
require.Equal(t, rs.Cfg.RendererCallbackUrl+path+"&render=1", url)
require.Equal(t, rs.rendererCallbackURL+path+"&render=1", url)
})
t.Run("When callback url is configured and https should return domain of callback url plus path", func(t *testing.T) {
rs.Cfg.RendererCallbackUrl = "https://public-grafana.com/"
rs.rendererCallbackURL = "https://public-grafana.com/"
url := rs.getGrafanaCallbackURL(path)
require.Equal(t, rs.Cfg.RendererCallbackUrl+path+"&render=1", url)
require.Equal(t, rs.rendererCallbackURL+path+"&render=1", url)
})
t.Run("When renderer url not configured", func(t *testing.T) {
rs.Cfg.RendererUrl = ""
rs.Cfg.RendererCallbackUrl = ""
rs.Cfg.RendererServerUrl = ""
rs.rendererCallbackURL = ""
rs.domain = "localhost"
rs.Cfg.HTTPPort = "3000"
@@ -128,8 +129,8 @@ func TestRenderLimitImage(t *testing.T) {
rs := RenderingService{
Cfg: &setting.Cfg{
HomePath: path,
RendererUrl: "http://localhost:8081/render",
HomePath: path,
RendererServerUrl: "http://localhost:8081/render",
},
inProgressCount: 2,
log: log.New("test"),
@@ -170,7 +171,7 @@ func TestRenderLimitImage(t *testing.T) {
func TestRenderLimitImageError(t *testing.T) {
rs := RenderingService{
Cfg: &setting.Cfg{
RendererUrl: "http://localhost:8081/render",
RendererServerUrl: "http://localhost:8081/render",
},
inProgressCount: 2,
log: log.New("test"),
@@ -201,7 +202,7 @@ func TestRenderingServiceGetRemotePluginVersion(t *testing.T) {
}))
defer server.Close()
rs.Cfg.RendererUrl = server.URL + "/render"
rs.Cfg.RendererServerUrl = server.URL + "/render"
version, err := rs.getRemotePluginVersion()
require.NoError(t, err)
@@ -214,7 +215,7 @@ func TestRenderingServiceGetRemotePluginVersion(t *testing.T) {
}))
defer server.Close()
rs.Cfg.RendererUrl = server.URL + "/render"
rs.Cfg.RendererServerUrl = server.URL + "/render"
version, err := rs.getRemotePluginVersion()
require.NoError(t, err)
@@ -239,7 +240,7 @@ func TestRenderingServiceGetRemotePluginVersion(t *testing.T) {
}))
defer server.Close()
rs.Cfg.RendererUrl = server.URL + "/render"
rs.Cfg.RendererServerUrl = server.URL + "/render"
remoteVersionFetchInterval = time.Millisecond
remoteVersionFetchRetries = 5
go func() {
@@ -249,3 +250,76 @@ func TestRenderingServiceGetRemotePluginVersion(t *testing.T) {
require.Eventually(t, func() bool { return rs.Version() == "3.1.4159" }, time.Second, time.Millisecond)
})
}
func TestProvideService(t *testing.T) {
cfg := setting.NewCfg()
cfg.AppURL = "http://app-url"
cfg.ImagesDir = filepath.Join(t.TempDir(), "images")
cfg.CSVsDir = filepath.Join(t.TempDir(), "csvs")
cfg.PDFsDir = filepath.Join(t.TempDir(), "pdfs")
t.Run("Default configuration values", func(t *testing.T) {
rs, err := ProvideService(cfg, featuremgmt.WithFeatures(), nil, &dummyPluginManager{})
require.NoError(t, err)
require.Equal(t, "", rs.Cfg.RendererServerUrl)
require.Equal(t, "", rs.rendererCallbackURL)
require.Equal(t, "", rs.domain)
})
t.Run("RendererURL is set but not RendererCallbackUrl", func(t *testing.T) {
cfg.RendererServerUrl = "http://custom-renderer:8081"
cfg.RendererCallbackUrl = ""
rs, err := ProvideService(cfg, featuremgmt.WithFeatures(), nil, &dummyPluginManager{})
require.NoError(t, err)
require.Equal(t, "http://custom-renderer:8081", rs.Cfg.RendererServerUrl)
require.Equal(t, "http://app-url/", rs.rendererCallbackURL)
require.Equal(t, "app-url", rs.domain)
})
t.Run("RendererURL and RendererCallbackUrl are set", func(t *testing.T) {
cfg.RendererServerUrl = "http://custom-renderer:8081"
cfg.RendererCallbackUrl = "http://public-grafana.com/"
rs, err := ProvideService(cfg, featuremgmt.WithFeatures(), nil, &dummyPluginManager{})
require.NoError(t, err)
require.Equal(t, "http://custom-renderer:8081", rs.Cfg.RendererServerUrl)
require.Equal(t, "http://public-grafana.com/", rs.rendererCallbackURL)
require.Equal(t, "public-grafana.com", rs.domain)
})
t.Run("RendererURL is not set but RendererCallbackUrl is set", func(t *testing.T) {
cfg.RendererServerUrl = ""
cfg.RendererCallbackUrl = "https://public-grafana.com/"
rs, err := ProvideService(cfg, featuremgmt.WithFeatures(), nil, &dummyPluginManager{})
require.NoError(t, err)
require.Equal(t, "", rs.Cfg.RendererServerUrl)
require.Equal(t, "https://public-grafana.com/", rs.rendererCallbackURL)
require.Equal(t, "public-grafana.com", rs.domain)
})
t.Run("RendererCallbackURL is missing trailing slash", func(t *testing.T) {
cfg.RendererServerUrl = ""
cfg.RendererCallbackUrl = "https://public-grafana.com"
rs, err := ProvideService(cfg, featuremgmt.WithFeatures(), nil, &dummyPluginManager{})
require.NoError(t, err)
require.Equal(t, "", rs.Cfg.RendererServerUrl)
require.Equal(t, "https://public-grafana.com/", rs.rendererCallbackURL)
require.Equal(t, "public-grafana.com", rs.domain)
})
t.Run("RendererCallbackURL is invalid", func(t *testing.T) {
cfg.RendererServerUrl = ""
cfg.RendererCallbackUrl = "http://public{grafana"
_, err := ProvideService(cfg, featuremgmt.WithFeatures(), nil, &dummyPluginManager{})
require.Error(t, err)
})
}