@@ -60,13 +60,22 @@ type Options struct {
6060 // will never be created.
6161 WatchFilterValue string
6262
63+ // ClusterFilter is a function that can be used to filter which clusters should be handled
64+ // by the ClusterCache. If nil, all clusters will be handled. If set, only clusters for which
65+ // the filter returns true will be handled.
66+ ClusterFilter ClusterFilter
67+
6368 // Cache are the cache options for the caches that are created per cluster.
6469 Cache CacheOptions
6570
6671 // Client are the client options for the clients that are created per cluster.
6772 Client ClientOptions
6873}
6974
75+ // ClusterFilter is a function that filters which clusters should be handled by the ClusterCache.
76+ // It returns true if the cluster should be handled, false otherwise.
77+ type ClusterFilter func (cluster * clusterv1.Cluster ) bool
78+
7079// CacheOptions are the cache options for the caches that are created per cluster.
7180type CacheOptions struct {
7281 // SyncPeriod is the sync period of the cache.
@@ -357,6 +366,11 @@ type clusterCache struct {
357366
358367 // cacheCtxCancel is used during Shutdown to stop caches.
359368 cacheCtxCancel context.CancelCauseFunc
369+
370+ // ClusterFilter is a function that can be used to filter which clusters should be handled
371+ // by the ClusterCache. If nil, all clusters will be handled. If set, only clusters for which
372+ // the filter returns true will be handled.
373+ clusterFilter ClusterFilter
360374}
361375
362376// clusterSource stores the necessary information so we can enqueue reconcile.Requests for reconcilers that
@@ -451,6 +465,15 @@ func (cc *clusterCache) Reconcile(ctx context.Context, req reconcile.Request) (r
451465 return ctrl.Result {RequeueAfter : defaultRequeueAfter }, nil
452466 }
453467
468+ // Apply cluster filter if set
469+ if cc .clusterFilter != nil && ! cc .clusterFilter (cluster ) {
470+ log .V (6 ).Info ("Cluster filtered out by ClusterFilter, not connecting" )
471+ accessor .Disconnect (ctx )
472+ cc .deleteClusterAccessor (clusterKey )
473+ cc .cleanupClusterSourcesForCluster (clusterKey )
474+ return ctrl.Result {}, nil
475+ }
476+
454477 // Return if infrastructure is not ready yet to avoid trying to open a connection when it cannot succeed.
455478 // Requeue is not needed as there will be a new reconcile.Request when Cluster.status.initialization.infrastructureProvisioned is set.
456479 if ! ptr .Deref (cluster .Status .Initialization .InfrastructureProvisioned , false ) {
0 commit comments