diff --git a/cmd/operator/main.go b/cmd/operator/main.go index cda219f00..b73dadc9f 100644 --- a/cmd/operator/main.go +++ b/cmd/operator/main.go @@ -246,6 +246,8 @@ func run(fs *flag.FlagSet) int { } cfg.KubernetesVersion = *kubernetesVersion level.Info(logger).Log("msg", "connection established", "cluster-version", cfg.KubernetesVersion) + + promControllerOptions := make([]prometheuscontroller.ControllerOptions, 0) // Check if we can read the storage classs canReadStorageClass, err := checkPrerequisites( ctx, @@ -261,12 +263,14 @@ func run(fs *flag.FlagSet) int { Verbs: []string{"get"}, }, ) - if err != nil { level.Error(logger).Log("msg", "failed to check StorageClass support", "err", err) cancel() return 1 } + if canReadStorageClass { + promControllerOptions = append(promControllerOptions, prometheuscontroller.WithStorageClassValidation()) + } canEmitEvents, reasons, err := k8sutil.IsAllowed(ctx, kclient.AuthorizationV1().SelfSubjectAccessReviews(), nil, k8sutil.ResourceAttribute{ @@ -307,6 +311,9 @@ func run(fs *flag.FlagSet) int { cancel() return 1 } + if scrapeConfigSupported { + promControllerOptions = append(promControllerOptions, prometheuscontroller.WithScrapeConfig()) + } prometheusSupported, err := checkPrerequisites( ctx, @@ -336,7 +343,7 @@ func run(fs *flag.FlagSet) int { var po *prometheuscontroller.Operator if prometheusSupported { - po, err = prometheuscontroller.New(ctx, restConfig, cfg, logger, r, scrapeConfigSupported, canReadStorageClass, eventRecorderFactory) + po, err = prometheuscontroller.New(ctx, restConfig, cfg, logger, r, eventRecorderFactory, promControllerOptions...) if err != nil { level.Error(logger).Log("msg", "instantiating prometheus controller failed", "err", err) cancel() diff --git a/pkg/prometheus/server/operator.go b/pkg/prometheus/server/operator.go index abf566877..142b5b22b 100644 --- a/pkg/prometheus/server/operator.go +++ b/pkg/prometheus/server/operator.go @@ -95,8 +95,28 @@ type Operator struct { eventRecorder record.EventRecorder } +type ControllerOptions func(*Operator) + +func WithEndpointSlice() ControllerOptions { + return func(o *Operator) { + o.endpointSliceSupported = true + } +} + +func WithScrapeConfig() ControllerOptions { + return func(o *Operator) { + o.scrapeConfigSupported = true + } +} + +func WithStorageClassValidation() ControllerOptions { + return func(o *Operator) { + o.canReadStorageClass = true + } +} + // New creates a new controller. -func New(ctx context.Context, restConfig *rest.Config, c operator.Config, logger log.Logger, r prometheus.Registerer, scrapeConfigSupported, canReadStorageClass bool, erf operator.EventRecorderFactory) (*Operator, error) { +func New(ctx context.Context, restConfig *rest.Config, c operator.Config, logger log.Logger, r prometheus.Registerer, erf operator.EventRecorderFactory, opts ...ControllerOptions) (*Operator, error) { logger = log.With(logger, "component", controllerName) client, err := kubernetes.NewForConfig(restConfig) @@ -135,13 +155,14 @@ func New(ctx context.Context, restConfig *rest.Config, c operator.Config, logger metrics: operator.NewMetrics(r), reconciliations: &operator.ReconciliationTracker{}, - controllerID: c.ControllerID, - - scrapeConfigSupported: scrapeConfigSupported, - canReadStorageClass: canReadStorageClass, - + controllerID: c.ControllerID, eventRecorder: erf(client, controllerName), } + // Process options, enabling or disabling features. + for _, opt := range opts { + opt(o) + } + o.metrics.MustRegister(o.reconciliations) o.rr = operator.NewResourceReconciler(