mirror of
https://github.com/grafana/grafana.git
synced 2026-08-11 13:44:59 -05:00
manager exposes renderer + secrets manager (#54629)
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package rendering
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
|
||||
"github.com/Masterminds/semver"
|
||||
@@ -22,8 +23,8 @@ const (
|
||||
var ErrUnknownCapability = errors.New("unknown capability")
|
||||
var ErrInvalidPluginVersion = errors.New("invalid plugin version")
|
||||
|
||||
func (rs *RenderingService) HasCapability(capability CapabilityName) (CapabilitySupportRequestResult, error) {
|
||||
if !rs.IsAvailable() {
|
||||
func (rs *RenderingService) HasCapability(ctx context.Context, capability CapabilityName) (CapabilitySupportRequestResult, error) {
|
||||
if !rs.IsAvailable(ctx) {
|
||||
return CapabilitySupportRequestResult{IsSupported: false, SemverConstraint: ""}, ErrRenderUnavailable
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package rendering
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
@@ -12,7 +13,7 @@ import (
|
||||
|
||||
type dummyPluginManager struct{}
|
||||
|
||||
func (d *dummyPluginManager) Renderer() *plugins.Plugin {
|
||||
func (d *dummyPluginManager) Renderer(_ context.Context) *plugins.Plugin {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -123,7 +124,7 @@ func TestCapabilities(t *testing.T) {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
rs.Cfg.RendererUrl = tt.rendererUrl
|
||||
rs.version = tt.rendererVersion
|
||||
res, err := rs.HasCapability(tt.capabilityName)
|
||||
res, err := rs.HasCapability(context.Background(), tt.capabilityName)
|
||||
|
||||
if tt.expectedError == nil {
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -117,13 +117,13 @@ type CapabilitySupportRequestResult struct {
|
||||
|
||||
//go:generate mockgen -destination=mock.go -package=rendering github.com/grafana/grafana/pkg/services/rendering Service
|
||||
type Service interface {
|
||||
IsAvailable() bool
|
||||
IsAvailable(ctx context.Context) bool
|
||||
Version() string
|
||||
Render(ctx context.Context, opts Opts, session Session) (*RenderResult, error)
|
||||
RenderCSV(ctx context.Context, opts CSVOpts, session Session) (*RenderCSVResult, error)
|
||||
RenderErrorImage(theme models.Theme, error error) (*RenderResult, error)
|
||||
GetRenderUser(ctx context.Context, key string) (*RenderUser, bool)
|
||||
HasCapability(capability CapabilityName) (CapabilitySupportRequestResult, error)
|
||||
HasCapability(ctx context.Context, capability CapabilityName) (CapabilitySupportRequestResult, error)
|
||||
CreateRenderingSession(ctx context.Context, authOpts AuthOpts, sessionOpts SessionOpts) (Session, error)
|
||||
SanitizeSVG(ctx context.Context, req *SanitizeSVGRequest) (*SanitizeSVGResponse, error)
|
||||
}
|
||||
|
||||
@@ -66,32 +66,32 @@ func (mr *MockServiceMockRecorder) GetRenderUser(arg0, arg1 interface{}) *gomock
|
||||
}
|
||||
|
||||
// HasCapability mocks base method.
|
||||
func (m *MockService) HasCapability(arg0 CapabilityName) (CapabilitySupportRequestResult, error) {
|
||||
func (m *MockService) HasCapability(arg0 context.Context, arg1 CapabilityName) (CapabilitySupportRequestResult, error) {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "HasCapability", arg0)
|
||||
ret := m.ctrl.Call(m, "HasCapability", arg0, arg1)
|
||||
ret0, _ := ret[0].(CapabilitySupportRequestResult)
|
||||
ret1, _ := ret[1].(error)
|
||||
return ret0, ret1
|
||||
}
|
||||
|
||||
// HasCapability indicates an expected call of HasCapability.
|
||||
func (mr *MockServiceMockRecorder) HasCapability(arg0 interface{}) *gomock.Call {
|
||||
func (mr *MockServiceMockRecorder) HasCapability(arg0, arg1 interface{}) *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasCapability", reflect.TypeOf((*MockService)(nil).HasCapability), arg0)
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasCapability", reflect.TypeOf((*MockService)(nil).HasCapability), arg0, arg1)
|
||||
}
|
||||
|
||||
// IsAvailable mocks base method.
|
||||
func (m *MockService) IsAvailable() bool {
|
||||
func (m *MockService) IsAvailable(arg0 context.Context) bool {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "IsAvailable")
|
||||
ret := m.ctrl.Call(m, "IsAvailable", arg0)
|
||||
ret0, _ := ret[0].(bool)
|
||||
return ret0
|
||||
}
|
||||
|
||||
// IsAvailable indicates an expected call of IsAvailable.
|
||||
func (mr *MockServiceMockRecorder) IsAvailable() *gomock.Call {
|
||||
func (mr *MockServiceMockRecorder) IsAvailable(arg0 interface{}) *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsAvailable", reflect.TypeOf((*MockService)(nil).IsAvailable))
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsAvailable", reflect.TypeOf((*MockService)(nil).IsAvailable), arg0)
|
||||
}
|
||||
|
||||
// Render mocks base method.
|
||||
|
||||
@@ -156,9 +156,9 @@ func (rs *RenderingService) Run(ctx context.Context) error {
|
||||
}
|
||||
}
|
||||
|
||||
if rs.pluginAvailable() {
|
||||
if rs.pluginAvailable(ctx) {
|
||||
rs.log = rs.log.New("renderer", "plugin")
|
||||
rs.pluginInfo = rs.RendererPluginManager.Renderer()
|
||||
rs.pluginInfo = rs.RendererPluginManager.Renderer(ctx)
|
||||
|
||||
if err := rs.startPlugin(ctx); err != nil {
|
||||
return err
|
||||
@@ -191,16 +191,16 @@ func (rs *RenderingService) Run(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rs *RenderingService) pluginAvailable() bool {
|
||||
return rs.RendererPluginManager.Renderer() != nil
|
||||
func (rs *RenderingService) pluginAvailable(ctx context.Context) bool {
|
||||
return rs.RendererPluginManager.Renderer(ctx) != nil
|
||||
}
|
||||
|
||||
func (rs *RenderingService) remoteAvailable() bool {
|
||||
return rs.Cfg.RendererUrl != ""
|
||||
}
|
||||
|
||||
func (rs *RenderingService) IsAvailable() bool {
|
||||
return rs.remoteAvailable() || rs.pluginAvailable()
|
||||
func (rs *RenderingService) IsAvailable(ctx context.Context) bool {
|
||||
return rs.remoteAvailable() || rs.pluginAvailable(ctx)
|
||||
}
|
||||
|
||||
func (rs *RenderingService) Version() string {
|
||||
@@ -271,7 +271,7 @@ func (rs *RenderingService) render(ctx context.Context, opts Opts, renderKeyProv
|
||||
}, nil
|
||||
}
|
||||
|
||||
if !rs.IsAvailable() {
|
||||
if !rs.IsAvailable(ctx) {
|
||||
rs.log.Warn("Could not render image, no image renderer found/installed. " +
|
||||
"For image rendering support please install the grafana-image-renderer plugin. " +
|
||||
"Read more at https://grafana.com/docs/grafana/latest/administration/image_rendering/")
|
||||
@@ -316,7 +316,7 @@ func (rs *RenderingService) RenderCSV(ctx context.Context, opts CSVOpts, session
|
||||
}
|
||||
|
||||
func (rs *RenderingService) SanitizeSVG(ctx context.Context, req *SanitizeSVGRequest) (*SanitizeSVGResponse, error) {
|
||||
capability, err := rs.HasCapability(SvgSanitization)
|
||||
capability, err := rs.HasCapability(ctx, SvgSanitization)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -338,7 +338,7 @@ func (rs *RenderingService) renderCSV(ctx context.Context, opts CSVOpts, renderK
|
||||
return nil, ErrConcurrentLimitReached
|
||||
}
|
||||
|
||||
if !rs.IsAvailable() {
|
||||
if !rs.IsAvailable(ctx) {
|
||||
return nil, ErrRenderUnavailable
|
||||
}
|
||||
|
||||
|
||||
@@ -105,7 +105,7 @@ func TestRenderErrorImage(t *testing.T) {
|
||||
|
||||
type unavailableRendererManager struct{}
|
||||
|
||||
func (m unavailableRendererManager) Renderer() *plugins.Plugin { return nil }
|
||||
func (m unavailableRendererManager) Renderer(_ context.Context) *plugins.Plugin { return nil }
|
||||
|
||||
func TestRenderUnavailableError(t *testing.T) {
|
||||
rs := RenderingService{
|
||||
|
||||
Reference in New Issue
Block a user