K8s: refactor build handler chain func to allow easier injection from enterprise (#100777)

This commit is contained in:
Charandas
2025-02-14 18:08:00 -08:00
committed by GitHub
parent e5b49a406f
commit ea788975e0
10 changed files with 50 additions and 51 deletions

View File

@ -78,7 +78,7 @@ func readCABundlePEM(path string, devMode bool) ([]byte, error) {
return io.ReadAll(f)
}
func readRemoteServices(path string) ([]RemoteService, error) {
func ReadRemoteServices(path string) ([]RemoteService, error) {
// We can ignore the gosec G304 warning on this one because `path` comes
// from Grafana configuration (commandOptions.AggregatorOptions.RemoteServicesFile)
//nolint:gosec
@ -127,8 +127,9 @@ func CreateAggregatorConfig(commandOptions *options.Options, sharedConfig generi
ClientConfig: sharedConfig.LoopbackClientConfig,
},
ExtraConfig: aggregatorapiserver.ExtraConfig{
ProxyClientCertFile: commandOptions.KubeAggregatorOptions.ProxyClientCertFile,
ProxyClientKeyFile: commandOptions.KubeAggregatorOptions.ProxyClientKeyFile,
DisableRemoteAvailableConditionController: true,
ProxyClientCertFile: commandOptions.KubeAggregatorOptions.ProxyClientCertFile,
ProxyClientKeyFile: commandOptions.KubeAggregatorOptions.ProxyClientKeyFile,
// NOTE: while ProxyTransport can be skipped in the configuration, it allows honoring
// DISABLE_HTTP2, HTTPS_PROXY and NO_PROXY env vars as needed
ProxyTransport: createProxyTransport(),
@ -155,7 +156,7 @@ func CreateAggregatorConfig(commandOptions *options.Options, sharedConfig generi
if err != nil {
return nil, err
}
remoteServices, err := readRemoteServices(commandOptions.KubeAggregatorOptions.RemoteServicesFile)
remoteServices, err := ReadRemoteServices(commandOptions.KubeAggregatorOptions.RemoteServicesFile)
if err != nil {
return nil, err
}

View File

@ -36,8 +36,13 @@ import (
"github.com/grafana/grafana/pkg/storage/unified/apistore"
)
type BuildHandlerChainFuncFromBuilders = func([]APIGroupBuilder) BuildHandlerChainFunc
type BuildHandlerChainFunc = func(delegateHandler http.Handler, c *genericapiserver.Config) http.Handler
func ProvideDefaultBuildHandlerChainFuncFromBuilders() BuildHandlerChainFuncFromBuilders {
return GetDefaultBuildHandlerChainFunc
}
// PathRewriters is a temporary hack to make rest.Connecter work with resource level routes (TODO)
var PathRewriters = []filters.PathRewriter{
{
@ -60,7 +65,7 @@ var PathRewriters = []filters.PathRewriter{
},
}
func getDefaultBuildHandlerChainFunc(builders []APIGroupBuilder) BuildHandlerChainFunc {
func GetDefaultBuildHandlerChainFunc(builders []APIGroupBuilder) BuildHandlerChainFunc {
return func(delegateHandler http.Handler, c *genericapiserver.Config) http.Handler {
requestHandler, err := GetCustomRoutesHandler(
delegateHandler,
@ -100,7 +105,7 @@ func SetupConfig(
buildVersion string,
buildCommit string,
buildBranch string,
buildHandlerChainFunc func(delegateHandler http.Handler, c *genericapiserver.Config) http.Handler,
buildHandlerChainFuncFromBuilders BuildHandlerChainFuncFromBuilders,
) error {
serverConfig.AdmissionControl = NewAdmissionFromBuilders(builders)
defsGetter := GetOpenAPIDefinitions(builders)
@ -220,11 +225,7 @@ func SetupConfig(
serverConfig.OpenAPIV3Config.Info.Version = buildVersion
serverConfig.SkipOpenAPIInstallation = false
serverConfig.BuildHandlerChainFunc = getDefaultBuildHandlerChainFunc(builders)
if buildHandlerChainFunc != nil {
serverConfig.BuildHandlerChainFunc = buildHandlerChainFunc
}
serverConfig.BuildHandlerChainFunc = buildHandlerChainFuncFromBuilders(builders)
v := utilversion.DefaultKubeEffectiveVersion()
patchver := 0 // required for semver

View File

@ -36,6 +36,11 @@ func (o *KubeAggregatorOptions) AddFlags(fs *pflag.FlagSet) {
return
}
// the following two config variables are slated to be faded out in cloud deployments after which
// their scope is restricted to local development and non Grafana Cloud use-cases only
// leaving them unspecified leads to graceful behavior in grafana-aggregator
// and would work for configurations where the aggregated servers and aggregator are auth-less and trusting
// of each other
fs.StringVar(&o.ProxyClientCertFile, "proxy-client-cert-file", o.ProxyClientCertFile,
"path to proxy client cert file")
@ -101,9 +106,8 @@ func (o *KubeAggregatorOptions) ApplyTo(aggregatorConfig *aggregatorapiserver.Co
genericConfig.PostStartHooks = map[string]genericapiserver.PostStartHookConfigEntry{}
// These hooks use v1 informers, which are not available in the grafana aggregator.
genericConfig.DisabledPostStartHooks = genericConfig.DisabledPostStartHooks.Insert("apiservice-status-local-available-controller")
genericConfig.DisabledPostStartHooks = genericConfig.DisabledPostStartHooks.Insert("apiservice-status-remote-available-controller")
genericConfig.DisabledPostStartHooks = genericConfig.DisabledPostStartHooks.Insert("start-kube-aggregator-informers")
genericConfig.DisabledPostStartHooks = genericConfig.DisabledPostStartHooks.Insert("apiservice-status-local-available-controller")
return nil
}

View File

@ -144,6 +144,8 @@ type service struct {
contextProvider datasource.PluginContextWrapper
pluginStore pluginstore.Store
unified resource.ResourceClient
buildHandlerChainFuncFromBuilders builder.BuildHandlerChainFuncFromBuilders
}
func ProvideService(
@ -160,25 +162,27 @@ func ProvideService(
contextProvider datasource.PluginContextWrapper,
pluginStore pluginstore.Store,
unified resource.ResourceClient,
buildHandlerChainFuncFromBuilders builder.BuildHandlerChainFuncFromBuilders,
) (*service, error) {
s := &service{
log: log.New(modules.GrafanaAPIServer),
cfg: cfg,
features: features,
rr: rr,
stopCh: make(chan struct{}),
builders: []builder.APIGroupBuilder{},
authorizer: authorizer.NewGrafanaAuthorizer(cfg, orgService),
tracing: tracing,
db: db, // For Unified storage
metrics: metrics.ProvideRegisterer(),
kvStore: kvStore,
pluginClient: pluginClient,
datasources: datasources,
contextProvider: contextProvider,
pluginStore: pluginStore,
serverLockService: serverLockService,
unified: unified,
log: log.New(modules.GrafanaAPIServer),
cfg: cfg,
features: features,
rr: rr,
stopCh: make(chan struct{}),
builders: []builder.APIGroupBuilder{},
authorizer: authorizer.NewGrafanaAuthorizer(cfg, orgService),
tracing: tracing,
db: db, // For Unified storage
metrics: metrics.ProvideRegisterer(),
kvStore: kvStore,
pluginClient: pluginClient,
datasources: datasources,
contextProvider: contextProvider,
pluginStore: pluginStore,
serverLockService: serverLockService,
unified: unified,
buildHandlerChainFuncFromBuilders: buildHandlerChainFuncFromBuilders,
}
// This will be used when running as a dskit service
service := services.NewBasicService(s.start, s.running, nil).WithName(modules.GrafanaAPIServer)
@ -349,7 +353,7 @@ func (s *service) start(ctx context.Context) error {
s.cfg.BuildVersion,
s.cfg.BuildCommit,
s.cfg.BuildBranch,
nil,
s.buildHandlerChainFuncFromBuilders,
)
if err != nil {
return err