@@ -22,13 +22,18 @@ import (
2222 "flag"
2323 "os"
2424
25- // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
26- // to ensure that exec-entrypoint and run can make use of them.
27- _ "k8s.io/client-go/plugin/pkg/client/auth"
28-
25+ corev1 "k8s.io/api/core/v1"
26+ "k8s.io/apimachinery/pkg/labels"
2927 "k8s.io/apimachinery/pkg/runtime"
28+ "k8s.io/apimachinery/pkg/selection"
3029 utilruntime "k8s.io/apimachinery/pkg/util/runtime"
3130 clientgoscheme "k8s.io/client-go/kubernetes/scheme"
31+ "sigs.k8s.io/controller-runtime/pkg/cache"
32+ "sigs.k8s.io/controller-runtime/pkg/client"
33+
34+ // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
35+ // to ensure that exec-entrypoint and run can make use of them.
36+ _ "k8s.io/client-go/plugin/pkg/client/auth"
3237 ctrl "sigs.k8s.io/controller-runtime"
3338 "sigs.k8s.io/controller-runtime/pkg/healthz"
3439 "sigs.k8s.io/controller-runtime/pkg/log/zap"
@@ -38,6 +43,7 @@ import (
3843
3944 kvmv1 "github.com/cobaltcore-dev/openstack-hypervisor-operator/api/v1"
4045 "github.com/cobaltcore-dev/openstack-hypervisor-operator/internal/controller"
46+ "github.com/cobaltcore-dev/openstack-hypervisor-operator/internal/global"
4147
4248 // +kubebuilder:scaffold:imports
4349
@@ -78,6 +84,7 @@ func main() {
7884 "If set, the metrics endpoint is served securely via HTTPS. Use --metrics-secure=false to use HTTP instead." )
7985 flag .BoolVar (& enableHTTP2 , "enable-http2" , false ,
8086 "If set, HTTP/2 will be enabled for the metrics and webhook servers" )
87+ flag .StringVar (& global .LabelSelector , "label-selector" , "" , "Label selector to filter watched resources (namely nodes)." )
8188
8289 flag .StringVar (& certificateNamespace , "certificate-namespace" , "monsoon3" , "The namespace for the certificates. " )
8390 flag .StringVar (& certificateIssuerName , "certificate-issuer-name" , "nova-hypervisor-agents-ca-issuer" ,
@@ -135,6 +142,28 @@ func main() {
135142 }
136143 restConfig := ctrl .GetConfigOrDie ()
137144
145+ var cacheOptions cache.Options
146+ if global .LabelSelector != "" {
147+ setupLog .Info ("setting up cache with label selector" , "selector" , global .LabelSelector )
148+ selector := labels .NewSelector ()
149+ req , err := labels .NewRequirement (global .LabelSelector , selection .Exists , nil )
150+ if err != nil {
151+ setupLog .Error (err , "unable to parse label selector" )
152+ os .Exit (1 )
153+ }
154+
155+ cacheOptions = cache.Options {
156+ ByObject : map [client.Object ]cache.ByObject {
157+ & corev1.Node {}: {
158+ Label : selector .Add (* req ),
159+ },
160+ & kvmv1.Hypervisor {}: {
161+ Label : selector .Add (* req ),
162+ },
163+ },
164+ }
165+ }
166+
138167 mgr , err := ctrl .NewManager (restConfig , ctrl.Options {
139168 Scheme : scheme ,
140169 Metrics : metricsServerOptions ,
@@ -153,6 +182,9 @@ func main() {
153182 // if you are doing or is intended to do any operation such as perform cleanups
154183 // after the manager stops then its usage might be unsafe.
155184 // LeaderElectionReleaseOnCancel: true,
185+
186+ // Optionally configure the cache to listen/watch for specific labeled resources only
187+ Cache : cacheOptions ,
156188 })
157189
158190 if err != nil {
0 commit comments