in pkg/operator/rules.go [42:96]
func setupRulesControllers(op *Operator) error {
// The singleton OperatorConfig is the request object we reconcile against.
objRequest := reconcile.Request{
NamespacedName: types.NamespacedName{
Namespace: op.opts.PublicNamespace,
Name: NameOperatorConfig,
},
}
// Default OperatorConfig filter.
objFilterOperatorConfig := namespacedNamePredicate{
namespace: op.opts.PublicNamespace,
name: NameOperatorConfig,
}
// Rule-evaluator rules ConfigMap filter.
objFilterRulesGenerated := namespacedNamePredicate{
namespace: op.opts.OperatorNamespace,
name: nameRulesGenerated,
}
// Reconcile the generated rules that are used by the rule-evaluator deployment.
err := ctrl.NewControllerManagedBy(op.manager).
Named("rules").
// Filter events without changes for all watches.
WithEventFilter(predicate.ResourceVersionChangedPredicate{}).
// OperatorConfig is our root resource that ensures we reconcile
// at least once initially.
For(
&monitoringv1.OperatorConfig{},
builder.WithPredicates(objFilterOperatorConfig),
).
// Any update to a Rules object requires re-generating the config.
Watches(
&monitoringv1.GlobalRules{},
enqueueConst(objRequest),
).
Watches(
&monitoringv1.ClusterRules{},
enqueueConst(objRequest),
).
Watches(
&monitoringv1.Rules{},
enqueueConst(objRequest),
).
// The configuration we generate for the rule-evaluator.
Watches(
&corev1.ConfigMap{},
enqueueConst(objRequest),
builder.WithPredicates(objFilterRulesGenerated),
).
Complete(newRulesReconciler(op.manager.GetClient(), op.opts))
if err != nil {
return fmt.Errorf("create rules config controller: %w", err)
}
return nil
}