@@ -2,6 +2,7 @@ package main
22
33import (
44 "context"
5+ "encoding/json"
56 "errors"
67 "flag"
78 "fmt"
@@ -16,6 +17,8 @@ import (
1617 "github.com/rancher-sandbox/runtime-enforcer/internal/grpcexporter"
1718 "github.com/rancher-sandbox/runtime-enforcer/internal/nri"
1819 "github.com/rancher-sandbox/runtime-enforcer/internal/resolver"
20+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
21+ "k8s.io/apimachinery/pkg/labels"
1922 "k8s.io/apimachinery/pkg/runtime"
2023 ctrl "sigs.k8s.io/controller-runtime"
2124 "sigs.k8s.io/controller-runtime/pkg/manager"
@@ -30,14 +33,15 @@ import (
3033)
3134
3235type Config struct {
33- enableTracing bool
34- enableOtelSidecar bool
35- enableLearning bool
36- nriSocketPath string
37- nriPluginIdx string
38- probeAddr string
39- grpcConf grpcexporter.Config
40- logLevel string
36+ enableTracing bool
37+ enableOtelSidecar bool
38+ enableLearning bool
39+ learningNamespaceSelector string
40+ nriSocketPath string
41+ nriPluginIdx string
42+ probeAddr string
43+ grpcConf grpcexporter.Config
44+ logLevel string
4145}
4246
4347// +kubebuilder:rbac:groups=security.rancher.io,resources=workloadpolicies,verbs=get;list;watch
@@ -87,11 +91,22 @@ func setupLearningReconciler(
8791 }, nil
8892 }
8993
90- learningReconciler := eventhandler .NewLearningReconciler (ctrlMgr .GetClient ())
94+ var nsSelector labels.Selector
95+ // If the learning namespace selector is empty, the learning will apply to all namespaces.
96+ // Otherwise, we parse the learning namespace selector.
97+ if config .learningNamespaceSelector != "" {
98+ selector , err := parseLearningNamespaceSelector (config .learningNamespaceSelector )
99+ if err != nil {
100+ return nil , fmt .Errorf ("invalid learning-namespace-selector %q: %w" , config .learningNamespaceSelector , err )
101+ }
102+ nsSelector = selector
103+ }
104+
105+ learningReconciler := eventhandler .NewLearningReconciler (ctrlMgr .GetClient (), nsSelector )
91106 if err := learningReconciler .SetupWithManager (ctrlMgr ); err != nil {
92107 return nil , fmt .Errorf ("unable to create learning reconciler: %w" , err )
93108 }
94- logger .InfoContext (ctx , "learning mode is enabled" )
109+ logger .InfoContext (ctx , "learning mode is enabled" , "namespaceSelector" , config . learningNamespaceSelector )
95110 return learningReconciler .EnqueueEvent , nil
96111}
97112
@@ -242,6 +257,21 @@ func parseLogLevel(level string) slog.Level {
242257 }
243258}
244259
260+ // parseLearningNamespaceSelector parses the learning namespace selector from either:
261+ // - A JSON object (e.g. {"matchLabels":{"env":"prod"}}.
262+ // - A string in Kubernetes label selector format (e.g. "env=prod").
263+ func parseLearningNamespaceSelector (s string ) (labels.Selector , error ) {
264+ s = strings .TrimSpace (s )
265+ if strings .HasPrefix (s , "{" ) {
266+ var ls metav1.LabelSelector
267+ if err := json .Unmarshal ([]byte (s ), & ls ); err != nil {
268+ return nil , fmt .Errorf ("invalid JSON label selector %q: %w" , s , err )
269+ }
270+ return metav1 .LabelSelectorAsSelector (& ls )
271+ }
272+ return labels .Parse (s )
273+ }
274+
245275func main () {
246276 var err error
247277 var config Config
@@ -253,6 +283,12 @@ func main() {
253283 flag .BoolVar (& config .enableTracing , "enable-tracing" , false , "Enable tracing collection" )
254284 flag .BoolVar (& config .enableOtelSidecar , "enable-otel-sidecar" , false , "Enable OpenTelemetry sidecar" )
255285 flag .BoolVar (& config .enableLearning , "enable-learning" , false , "Enable learning mode" )
286+ flag .StringVar (
287+ & config .learningNamespaceSelector ,
288+ "learning-namespace-selector" ,
289+ "" ,
290+ "Label selector for namespaces to include in learning (empty = all)" ,
291+ )
256292 flag .StringVar (& config .nriSocketPath , "nri-socket-path" , "/var/run/nri/nri.sock" , "NRI socket path" )
257293 flag .StringVar (& config .nriPluginIdx , "nri-plugin-index" , "00" , "NRI plugin index" )
258294 flag .StringVar (& config .probeAddr , "health-probe-bind-address" , ":8081" , "The address the probe endpoint binds to." )
0 commit comments