1414//
1515// SPDX-License-Identifier: Apache-2.0
1616
17- // Package controller defines controllers' logic.
18-
1917package rulesfile
2018
2119import (
@@ -25,12 +23,10 @@ import (
2523 apierrors "k8s.io/apimachinery/pkg/api/errors"
2624 "k8s.io/apimachinery/pkg/runtime"
2725 ctrl "sigs.k8s.io/controller-runtime"
28- "sigs.k8s.io/controller-runtime/pkg/builder"
2926 "sigs.k8s.io/controller-runtime/pkg/client"
3027 "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3128 "sigs.k8s.io/controller-runtime/pkg/handler"
3229 "sigs.k8s.io/controller-runtime/pkg/log"
33- "sigs.k8s.io/controller-runtime/pkg/predicate"
3430 "sigs.k8s.io/controller-runtime/pkg/reconcile"
3531
3632 artifactv1alpha1 "github.com/falcosecurity/falco-operator/api/artifact/v1alpha1"
@@ -42,6 +38,8 @@ import (
4238const (
4339 // rulesfileFinalizerPrefix is the prefix for the finalizer name.
4440 rulesfileFinalizerPrefix = "rulesfile.artifact.falcosecurity.dev/finalizer"
41+ // configMapRefIndexField is the field used for indexing Rulesfiles by ConfigMap reference.
42+ configMapRefIndexField = ".spec.configMapRef.name"
4543)
4644
4745// NewRulesfileReconciler returns a new RulesfileReconciler.
@@ -115,41 +113,53 @@ func (r *RulesfileReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
115113
116114// SetupWithManager sets up the controller with the Manager.
117115func (r * RulesfileReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
118- // Filter ConfigMap watches to only the operator's namespace to reduce overhead.
119- namespaceFilter := predicate .NewPredicateFuncs (func (object client.Object ) bool {
120- return object .GetNamespace () == r .namespace
121- })
116+ // Create an index for Rulesfiles by ConfigMap reference for efficient lookups.
117+ if err := mgr .GetFieldIndexer ().IndexField (
118+ context .Background (),
119+ & artifactv1alpha1.Rulesfile {},
120+ configMapRefIndexField ,
121+ indexRulesfileByConfigMapRef ,
122+ ); err != nil {
123+ return err
124+ }
122125
123126 return ctrl .NewControllerManagedBy (mgr ).
124127 For (& artifactv1alpha1.Rulesfile {}).
125128 Watches (
126129 & corev1.ConfigMap {},
127130 handler .EnqueueRequestsFromMapFunc (r .findRulesfilesForConfigMap ),
128- builder .WithPredicates (namespaceFilter ),
129131 ).
130132 Named ("artifact-rulesfile" ).
131133 Complete (r )
132134}
133135
134- // findRulesfilesForConfigMap finds all Rulesfiles that reference a given ConfigMap.
136+ func indexRulesfileByConfigMapRef (obj client.Object ) []string {
137+ rulesfile := obj .(* artifactv1alpha1.Rulesfile )
138+ if rulesfile .Spec .ConfigMapRef == nil {
139+ return nil
140+ }
141+ return []string {rulesfile .Namespace + "/" + rulesfile .Spec .ConfigMapRef .Name }
142+ }
143+
144+ // findRulesfilesForConfigMap finds all Rulesfiles that reference a given ConfigMap using the index.
135145func (r * RulesfileReconciler ) findRulesfilesForConfigMap (ctx context.Context , configMap client.Object ) []reconcile.Request {
136146 logger := log .FromContext (ctx )
137147 rulesfileList := & artifactv1alpha1.RulesfileList {}
138148
139- if err := r .List (ctx , rulesfileList , client .InNamespace (configMap .GetNamespace ())); err != nil {
140- logger .Error (err , "unable to list Rulesfiles" )
149+ // Use the index to find Rulesfiles that reference this ConfigMap
150+ indexKey := configMap .GetNamespace () + "/" + configMap .GetName ()
151+ if err := r .List (ctx , rulesfileList , client.MatchingFields {configMapRefIndexField : indexKey }); err != nil {
152+ logger .Error (err , "unable to list Rulesfiles by ConfigMap index" )
141153 return []reconcile.Request {}
142154 }
143155
144- var requests []reconcile.Request
156+ requests := make ( []reconcile.Request , len ( rulesfileList . Items ))
145157 for i := range rulesfileList .Items {
146- if rulesfileList .Items [i ].Spec .ConfigMapRef != nil && rulesfileList .Items [i ].Spec .ConfigMapRef .Name == configMap .GetName () {
147- requests = append (requests , reconcile.Request {
148- NamespacedName : client.ObjectKey {
149- Name : rulesfileList .Items [i ].Name ,
150- Namespace : rulesfileList .Items [i ].Namespace ,
151- },
152- })
158+ requests [i ] = reconcile.Request {
159+ NamespacedName : client.ObjectKey {
160+ Name : rulesfileList .Items [i ].Name ,
161+ Namespace : rulesfileList .Items [i ].Namespace ,
162+ },
153163 }
154164 }
155165
@@ -188,7 +198,8 @@ func (r *RulesfileReconciler) ensureRulesfile(ctx context.Context, rulesfile *ar
188198 return err
189199 }
190200
191- if err := r .artifactManager .StoreFromConfigMap (ctx , rulesfile .Name , p , rulesfile .Spec .ConfigMapRef , artifact .TypeRulesfile ); err != nil {
201+ if err := r .artifactManager .StoreFromConfigMap (
202+ ctx , rulesfile .Name , rulesfile .Namespace , p , rulesfile .Spec .ConfigMapRef , artifact .TypeRulesfile ); err != nil {
192203 return err
193204 }
194205
0 commit comments