mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Chore: Add grafana-apiserver (#70721)
* add grafana-apiserver * remove watchset & move provisioning and http server to background services * remove scheme * otel fixes (#70874) * remove module ProvideRegistry test * use certgenerator from apiserver package * Control collector/pdata from going to v1.0.0-rc8 (as Tempo 1.5.1 would have it)
This commit is contained in:
@@ -5,9 +5,18 @@ const (
|
||||
All string = "all"
|
||||
// BackgroundServices includes all Grafana services that run in the background
|
||||
BackgroundServices string = "background-services"
|
||||
// CertGenerator generates certificates for grafana-apiserver
|
||||
CertGenerator string = "cert-generator"
|
||||
// GrafanaAPIServer is the Kubertenes API server for Grafana Resources
|
||||
GrafanaAPIServer string = "grafana-apiserver"
|
||||
)
|
||||
|
||||
// dependencyMap defines Module Targets => Dependencies
|
||||
var dependencyMap = map[string][]string{
|
||||
BackgroundServices: {},
|
||||
|
||||
CertGenerator: {},
|
||||
GrafanaAPIServer: {CertGenerator},
|
||||
|
||||
All: {BackgroundServices},
|
||||
}
|
||||
|
||||
@@ -3,11 +3,13 @@ package modules
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/grafana/dskit/modules"
|
||||
"github.com/grafana/dskit/services"
|
||||
|
||||
"github.com/grafana/grafana/pkg/infra/log"
|
||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||
"github.com/grafana/grafana/pkg/setting"
|
||||
"github.com/grafana/grafana/pkg/systemd"
|
||||
)
|
||||
@@ -35,9 +37,14 @@ type service struct {
|
||||
moduleManager *modules.Manager
|
||||
serviceManager *services.Manager
|
||||
serviceMap map[string]services.Service
|
||||
|
||||
features *featuremgmt.FeatureManager
|
||||
}
|
||||
|
||||
func ProvideService(cfg *setting.Cfg) *service {
|
||||
func ProvideService(
|
||||
cfg *setting.Cfg,
|
||||
features *featuremgmt.FeatureManager,
|
||||
) *service {
|
||||
logger := log.New("modules")
|
||||
|
||||
return &service{
|
||||
@@ -47,6 +54,8 @@ func ProvideService(cfg *setting.Cfg) *service {
|
||||
|
||||
moduleManager: modules.NewManager(logger),
|
||||
serviceMap: map[string]services.Service{},
|
||||
|
||||
features: features,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,6 +63,11 @@ func ProvideService(cfg *setting.Cfg) *service {
|
||||
func (m *service) Init(_ context.Context) error {
|
||||
var err error
|
||||
|
||||
if err = m.processFeatureFlags(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
m.log.Debug("Initializing module manager", "targets", m.targets)
|
||||
for mod, targets := range dependencyMap {
|
||||
if err := m.moduleManager.AddDependency(mod, targets...); err != nil {
|
||||
return err
|
||||
@@ -93,6 +107,7 @@ func (m *service) Run(ctx context.Context) error {
|
||||
listener := newServiceListener(m.log, m)
|
||||
m.serviceManager.AddListener(listener)
|
||||
|
||||
m.log.Debug("Starting module service manager")
|
||||
// wait until a service fails or stop signal was received
|
||||
err := m.serviceManager.StartAsync(ctx)
|
||||
if err != nil {
|
||||
@@ -149,3 +164,31 @@ func (m *service) RegisterInvisibleModule(name string, initFn func() (services.S
|
||||
func (m *service) IsModuleEnabled(name string) bool {
|
||||
return stringsContain(m.targets, name)
|
||||
}
|
||||
|
||||
// processFeatureFlags adds or removes targets based on feature flags.
|
||||
func (m *service) processFeatureFlags() error {
|
||||
// add GrafanaAPIServer to targets if feature is enabled
|
||||
if m.features.IsEnabled(featuremgmt.FlagGrafanaAPIServer) {
|
||||
m.targets = append(m.targets, GrafanaAPIServer)
|
||||
}
|
||||
|
||||
if !m.features.IsEnabled(featuremgmt.FlagGrafanaAPIServer) {
|
||||
// error if GrafanaAPIServer is in targets
|
||||
for _, t := range m.targets {
|
||||
if t == GrafanaAPIServer {
|
||||
return fmt.Errorf("feature flag %s is disabled, but target %s is still enabled", featuremgmt.FlagGrafanaAPIServer, GrafanaAPIServer)
|
||||
}
|
||||
}
|
||||
|
||||
// error if GrafanaAPIServer is a dependency of a target
|
||||
for parent, targets := range dependencyMap {
|
||||
for _, t := range targets {
|
||||
if t == GrafanaAPIServer && m.IsModuleEnabled(parent) {
|
||||
return fmt.Errorf("feature flag %s is disabled, but target %s is enabled with dependency on %s", featuremgmt.FlagGrafanaAPIServer, parent, GrafanaAPIServer)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -3,9 +3,11 @@ package registry
|
||||
import (
|
||||
"github.com/grafana/dskit/services"
|
||||
|
||||
"github.com/grafana/grafana-apiserver/pkg/certgenerator"
|
||||
"github.com/grafana/grafana/pkg/infra/log"
|
||||
"github.com/grafana/grafana/pkg/modules"
|
||||
"github.com/grafana/grafana/pkg/server/backgroundsvcs"
|
||||
grafanaapiserver "github.com/grafana/grafana/pkg/services/grafana-apiserver"
|
||||
)
|
||||
|
||||
type Registry interface{}
|
||||
@@ -17,12 +19,16 @@ type registry struct {
|
||||
|
||||
func ProvideRegistry(
|
||||
moduleManager modules.Manager,
|
||||
apiServer grafanaapiserver.Service,
|
||||
backgroundServiceRunner *backgroundsvcs.BackgroundServiceRunner,
|
||||
certGenerator certgenerator.ServiceInterface,
|
||||
) *registry {
|
||||
return newRegistry(
|
||||
log.New("modules.registry"),
|
||||
moduleManager,
|
||||
apiServer,
|
||||
backgroundServiceRunner,
|
||||
certGenerator,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -41,7 +47,6 @@ func newRegistry(logger log.Logger, moduleManager modules.Manager, svcs ...servi
|
||||
})
|
||||
}
|
||||
|
||||
// Register module targets
|
||||
logger.Debug("Registering module", "name", modules.All)
|
||||
r.moduleManager.RegisterModule(modules.All, nil)
|
||||
|
||||
|
||||
@@ -9,31 +9,8 @@ import (
|
||||
|
||||
"github.com/grafana/grafana/pkg/infra/log"
|
||||
"github.com/grafana/grafana/pkg/modules"
|
||||
"github.com/grafana/grafana/pkg/server/backgroundsvcs"
|
||||
)
|
||||
|
||||
func TestProvideRegistry(t *testing.T) {
|
||||
var registeredInvisibleModules []string
|
||||
var registeredModules []string
|
||||
|
||||
moduleManager := &modules.MockModuleManager{
|
||||
RegisterModuleFunc: func(name string, initFn func() (services.Service, error)) {
|
||||
registeredModules = append(registeredModules, name)
|
||||
},
|
||||
RegisterInvisibleModuleFunc: func(name string, initFn func() (services.Service, error)) {
|
||||
registeredInvisibleModules = append(registeredInvisibleModules, name)
|
||||
},
|
||||
}
|
||||
|
||||
svcRegistry := backgroundsvcs.NewBackgroundServiceRegistry()
|
||||
svcRunner := backgroundsvcs.ProvideBackgroundServiceRunner(svcRegistry)
|
||||
|
||||
r := ProvideRegistry(moduleManager, svcRunner)
|
||||
require.NotNil(t, r)
|
||||
require.Equal(t, []string{modules.BackgroundServices}, registeredInvisibleModules)
|
||||
require.Equal(t, []string{modules.All}, registeredModules)
|
||||
}
|
||||
|
||||
func TestNewRegistry(t *testing.T) {
|
||||
var registeredInvisibleModules []string
|
||||
var registeredModules []string
|
||||
|
||||
Reference in New Issue
Block a user