diff --git a/exp/addons/controllers/alias.go b/exp/addons/controllers/alias.go index 4954954dd694..63a1d324effe 100644 --- a/exp/addons/controllers/alias.go +++ b/exp/addons/controllers/alias.go @@ -20,6 +20,7 @@ import ( "context" ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" @@ -36,12 +37,12 @@ type ClusterResourceSetReconciler struct { WatchFilterValue string } -func (r *ClusterResourceSetReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, options controller.Options) error { +func (r *ClusterResourceSetReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, options controller.Options, partialSecretCache cache.Cache) error { return (&clusterresourcesets.ClusterResourceSetReconciler{ Client: r.Client, Tracker: r.Tracker, WatchFilterValue: r.WatchFilterValue, - }).SetupWithManager(ctx, mgr, options) + }).SetupWithManager(ctx, mgr, options, partialSecretCache) } // ClusterResourceSetBindingReconciler reconciles a ClusterResourceSetBinding object. diff --git a/exp/addons/internal/controllers/clusterresourceset_controller.go b/exp/addons/internal/controllers/clusterresourceset_controller.go index b04e36caf18f..3f7325e9f5b6 100644 --- a/exp/addons/internal/controllers/clusterresourceset_controller.go +++ b/exp/addons/internal/controllers/clusterresourceset_controller.go @@ -32,11 +32,13 @@ import ( "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" + "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/apiutil" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/handler" + "sigs.k8s.io/controller-runtime/pkg/source" clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/cluster-api/controllers/remote" @@ -65,7 +67,7 @@ type ClusterResourceSetReconciler struct { WatchFilterValue string } -func (r *ClusterResourceSetReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, options controller.Options) error { +func (r *ClusterResourceSetReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, options controller.Options, partialSecretCache cache.Cache) error { err := ctrl.NewControllerManagedBy(mgr). For(&addonsv1.ClusterResourceSet{}). Watches( @@ -74,18 +76,26 @@ func (r *ClusterResourceSetReconciler) SetupWithManager(ctx context.Context, mgr ). WatchesMetadata( &corev1.ConfigMap{}, - handler.EnqueueRequestsFromMapFunc(r.resourceToClusterResourceSet), - builder.WithPredicates( - resourcepredicates.ResourceCreateOrUpdate(ctrl.LoggerFrom(ctx)), + handler.EnqueueRequestsFromMapFunc( + resourceToClusterResourceSetFunc[client.Object](r.Client), ), - ). - WatchesMetadata( - &corev1.Secret{}, - handler.EnqueueRequestsFromMapFunc(r.resourceToClusterResourceSet), builder.WithPredicates( - resourcepredicates.ResourceCreateOrUpdate(ctrl.LoggerFrom(ctx)), + resourcepredicates.TypedResourceCreateOrUpdate[client.Object](ctrl.LoggerFrom(ctx)), ), ). + WatchesRawSource(source.Kind( + partialSecretCache, + &metav1.PartialObjectMetadata{ + TypeMeta: metav1.TypeMeta{ + Kind: "Secret", + APIVersion: "v1", + }, + }, + handler.TypedEnqueueRequestsFromMapFunc( + resourceToClusterResourceSetFunc[*metav1.PartialObjectMetadata](r.Client), + ), + resourcepredicates.TypedResourceCreateOrUpdate[*metav1.PartialObjectMetadata](ctrl.LoggerFrom(ctx)), + )). WithOptions(options). WithEventFilter(predicates.ResourceNotPausedAndHasFilterLabel(ctrl.LoggerFrom(ctx), r.WatchFilterValue)). Complete(r) @@ -471,46 +481,48 @@ func (r *ClusterResourceSetReconciler) clusterToClusterResourceSet(ctx context.C return result } -// resourceToClusterResourceSet is mapper function that maps resources to ClusterResourceSet. -func (r *ClusterResourceSetReconciler) resourceToClusterResourceSet(ctx context.Context, o client.Object) []ctrl.Request { - result := []ctrl.Request{} +// resourceToClusterResourceSetFunc returns a typed mapper function that maps resources to ClusterResourceSet. +func resourceToClusterResourceSetFunc[T client.Object](ctrlClient client.Client) handler.TypedMapFunc[T] { + return func(ctx context.Context, o T) []ctrl.Request { + result := []ctrl.Request{} - // Add all ClusterResourceSet owners. - for _, owner := range o.GetOwnerReferences() { - if owner.Kind == "ClusterResourceSet" { - name := client.ObjectKey{Namespace: o.GetNamespace(), Name: owner.Name} - result = append(result, ctrl.Request{NamespacedName: name}) + // Add all ClusterResourceSet owners. + for _, owner := range o.GetOwnerReferences() { + if owner.Kind == "ClusterResourceSet" { + name := client.ObjectKey{Namespace: o.GetNamespace(), Name: owner.Name} + result = append(result, ctrl.Request{NamespacedName: name}) + } } - } - // If there is any ClusterResourceSet owner, that means the resource is reconciled before, - // and existing owners are the only matching ClusterResourceSets to this resource, so no need to return all ClusterResourceSets. - if len(result) > 0 { - return result - } + // If there is any ClusterResourceSet owner, that means the resource is reconciled before, + // and existing owners are the only matching ClusterResourceSets to this resource, so no need to return all ClusterResourceSets. + if len(result) > 0 { + return result + } - // Only core group is accepted as resources group - if o.GetObjectKind().GroupVersionKind().Group != "" { - return result - } + // Only core group is accepted as resources group + if o.GetObjectKind().GroupVersionKind().Group != "" { + return result + } - crsList := &addonsv1.ClusterResourceSetList{} - if err := r.Client.List(ctx, crsList, client.InNamespace(o.GetNamespace())); err != nil { - return nil - } - objKind, err := apiutil.GVKForObject(o, r.Client.Scheme()) - if err != nil { - return nil - } - for _, crs := range crsList.Items { - for _, resource := range crs.Spec.Resources { - if resource.Kind == objKind.Kind && resource.Name == o.GetName() { - name := client.ObjectKey{Namespace: o.GetNamespace(), Name: crs.Name} - result = append(result, ctrl.Request{NamespacedName: name}) - break + crsList := &addonsv1.ClusterResourceSetList{} + if err := ctrlClient.List(ctx, crsList, client.InNamespace(o.GetNamespace())); err != nil { + return nil + } + objKind, err := apiutil.GVKForObject(o, ctrlClient.Scheme()) + if err != nil { + return nil + } + for _, crs := range crsList.Items { + for _, resource := range crs.Spec.Resources { + if resource.Kind == objKind.Kind && resource.Name == o.GetName() { + name := client.ObjectKey{Namespace: o.GetNamespace(), Name: crs.Name} + result = append(result, ctrl.Request{NamespacedName: name}) + break + } } } - } - return result + return result + } } diff --git a/exp/addons/internal/controllers/predicates/resource_predicates.go b/exp/addons/internal/controllers/predicates/resource_predicates.go index 7ad3322ec2c7..3d0fc173ecf6 100644 --- a/exp/addons/internal/controllers/predicates/resource_predicates.go +++ b/exp/addons/internal/controllers/predicates/resource_predicates.go @@ -19,16 +19,17 @@ package predicates import ( "github.com/go-logr/logr" + "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/event" "sigs.k8s.io/controller-runtime/pkg/predicate" ) -// ResourceCreateOrUpdate returns a predicate that returns true for create and update events. -func ResourceCreateOrUpdate(_ logr.Logger) predicate.Funcs { - return predicate.Funcs{ - CreateFunc: func(event.CreateEvent) bool { return true }, - UpdateFunc: func(event.UpdateEvent) bool { return true }, - DeleteFunc: func(event.DeleteEvent) bool { return false }, - GenericFunc: func(event.GenericEvent) bool { return false }, +// TypedResourceCreateOrUpdate returns a predicate that returns true for create and update events. +func TypedResourceCreateOrUpdate[T client.Object](_ logr.Logger) predicate.TypedFuncs[T] { + return predicate.TypedFuncs[T]{ + CreateFunc: func(event.TypedCreateEvent[T]) bool { return true }, + UpdateFunc: func(event.TypedUpdateEvent[T]) bool { return true }, + DeleteFunc: func(event.TypedDeleteEvent[T]) bool { return false }, + GenericFunc: func(event.TypedGenericEvent[T]) bool { return false }, } } diff --git a/exp/addons/internal/controllers/suite_test.go b/exp/addons/internal/controllers/suite_test.go index 0f9fcad54cb2..2a7f8deb650d 100644 --- a/exp/addons/internal/controllers/suite_test.go +++ b/exp/addons/internal/controllers/suite_test.go @@ -21,9 +21,13 @@ import ( "fmt" "os" "testing" + "time" corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/ptr" ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" @@ -46,6 +50,32 @@ func TestMain(m *testing.M) { } setupReconcilers := func(ctx context.Context, mgr ctrl.Manager) { + // Create partial cache analog to main.go. + partialSecretCache, err := cache.New(mgr.GetConfig(), cache.Options{ + Scheme: mgr.GetScheme(), + Mapper: mgr.GetRESTMapper(), + HTTPClient: mgr.GetHTTPClient(), + SyncPeriod: ptr.To(time.Minute * 10), + DefaultTransform: func(in interface{}) (interface{}, error) { + // Use DefaultTransform to drop objects we don't expect to get into this cache. + obj, ok := in.(*metav1.PartialObjectMetadata) + if !ok { + panic(fmt.Sprintf("cache expected to only get PartialObjectMetadata, got %T", in)) + } + if obj.GetObjectKind().GroupVersionKind() != corev1.SchemeGroupVersion.WithKind("Secret") { + panic(fmt.Sprintf("cache expected to only get Secrets, got %s", obj.GetObjectKind())) + } + // Additionally strip managed fields. + return cache.TransformStripManagedFields()(obj) + }, + }) + if err != nil { + panic(fmt.Sprintf("Failed to create cache for metadata only Secret watches: %v", err)) + } + if err := mgr.Add(partialSecretCache); err != nil { + panic(fmt.Sprintf("Failed to start cache for metadata only Secret watches: %v", err)) + } + tracker, err := remote.NewClusterCacheTracker(mgr, remote.ClusterCacheTrackerOptions{}) if err != nil { panic(fmt.Sprintf("Failed to create new cluster cache tracker: %v", err)) @@ -55,7 +85,7 @@ func TestMain(m *testing.M) { Client: mgr.GetClient(), Tracker: tracker, } - if err = reconciler.SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil { + if err = reconciler.SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}, partialSecretCache); err != nil { panic(fmt.Sprintf("Failed to set up cluster resource set reconciler: %v", err)) } bindingReconciler := ClusterResourceSetBindingReconciler{ diff --git a/exp/runtime/controllers/alias.go b/exp/runtime/controllers/alias.go index 4abf06afe467..acd88825d959 100644 --- a/exp/runtime/controllers/alias.go +++ b/exp/runtime/controllers/alias.go @@ -20,6 +20,7 @@ import ( "context" ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" @@ -37,11 +38,11 @@ type ExtensionConfigReconciler struct { WatchFilterValue string } -func (r *ExtensionConfigReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, options controller.Options) error { +func (r *ExtensionConfigReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, options controller.Options, partialSecretCache cache.Cache) error { return (&runtimecontrollers.Reconciler{ Client: r.Client, APIReader: r.APIReader, RuntimeClient: r.RuntimeClient, WatchFilterValue: r.WatchFilterValue, - }).SetupWithManager(ctx, mgr, options) + }).SetupWithManager(ctx, mgr, options, partialSecretCache) } diff --git a/exp/runtime/internal/controllers/extensionconfig_controller.go b/exp/runtime/internal/controllers/extensionconfig_controller.go index ffbe2ab3d793..5162d9ede30b 100644 --- a/exp/runtime/internal/controllers/extensionconfig_controller.go +++ b/exp/runtime/internal/controllers/extensionconfig_controller.go @@ -24,13 +24,16 @@ import ( "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" kerrors "k8s.io/apimachinery/pkg/util/errors" ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/reconcile" + "sigs.k8s.io/controller-runtime/pkg/source" clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" runtimev1 "sigs.k8s.io/cluster-api/exp/runtime/api/v1alpha1" @@ -59,13 +62,21 @@ type Reconciler struct { WatchFilterValue string } -func (r *Reconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, options controller.Options) error { +func (r *Reconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, options controller.Options, partialSecretCache cache.Cache) error { err := ctrl.NewControllerManagedBy(mgr). For(&runtimev1.ExtensionConfig{}). - WatchesMetadata( - &corev1.Secret{}, - handler.EnqueueRequestsFromMapFunc(r.secretToExtensionConfig), - ). + WatchesRawSource(source.Kind( + partialSecretCache, + &metav1.PartialObjectMetadata{ + TypeMeta: metav1.TypeMeta{ + Kind: "Secret", + APIVersion: "v1", + }, + }, + handler.TypedEnqueueRequestsFromMapFunc( + r.secretToExtensionConfig, + ), + )). WithOptions(options). WithEventFilter(predicates.ResourceNotPausedAndHasFilterLabel(ctrl.LoggerFrom(ctx), r.WatchFilterValue)). Complete(r) @@ -181,7 +192,7 @@ func (r *Reconciler) reconcileDelete(ctx context.Context, extensionConfig *runti // secretToExtensionConfig maps a secret to ExtensionConfigs with the corresponding InjectCAFromSecretAnnotation // to reconcile them on updates of the secrets. -func (r *Reconciler) secretToExtensionConfig(ctx context.Context, secret client.Object) []reconcile.Request { +func (r *Reconciler) secretToExtensionConfig(ctx context.Context, secret *metav1.PartialObjectMetadata) []reconcile.Request { result := []ctrl.Request{} extensionConfigs := runtimev1.ExtensionConfigList{} diff --git a/main.go b/main.go index affbcba5bf57..ba03d35be1f9 100644 --- a/main.go +++ b/main.go @@ -29,6 +29,7 @@ import ( "github.com/spf13/pflag" corev1 "k8s.io/api/core/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/selection" @@ -250,13 +251,13 @@ func main() { pflag.CommandLine.AddGoFlagSet(flag.CommandLine) // Set log level 2 as default. if err := pflag.CommandLine.Set("v", "2"); err != nil { - setupLog.Error(err, "failed to set default log level") + setupLog.Error(err, "Failed to set default log level") os.Exit(1) } pflag.Parse() if err := logsv1.ValidateAndApply(logOptions, nil); err != nil { - setupLog.Error(err, "unable to start manager") + setupLog.Error(err, "Unable to start manager") os.Exit(1) } @@ -279,13 +280,13 @@ func main() { } if err := version.CheckKubernetesVersion(restConfig, minVer); err != nil { - setupLog.Error(err, "unable to start manager") + setupLog.Error(err, "Unable to start manager") os.Exit(1) } tlsOptionOverrides, err := flags.GetTLSOptionOverrideFuncs(tlsOptions) if err != nil { - setupLog.Error(err, "unable to add TLS settings to the webhook server") + setupLog.Error(err, "Unable to add TLS settings to the webhook server") os.Exit(1) } @@ -351,7 +352,7 @@ func main() { mgr, err := ctrl.NewManager(restConfig, ctrlOptions) if err != nil { - setupLog.Error(err, "unable to start manager") + setupLog.Error(err, "Unable to start manager") os.Exit(1) } @@ -360,36 +361,36 @@ func main() { setupChecks(mgr) setupIndexes(ctx, mgr) - tracker := setupReconcilers(ctx, mgr) + tracker := setupReconcilers(ctx, mgr, watchNamespaces, &syncPeriod) setupWebhooks(mgr, tracker) setupLog.Info("Starting manager", "version", version.Get().String()) if err := mgr.Start(ctx); err != nil { - setupLog.Error(err, "problem running manager") + setupLog.Error(err, "Problem running manager") os.Exit(1) } } func setupChecks(mgr ctrl.Manager) { if err := mgr.AddReadyzCheck("webhook", mgr.GetWebhookServer().StartedChecker()); err != nil { - setupLog.Error(err, "unable to create ready check") + setupLog.Error(err, "Unable to create ready check") os.Exit(1) } if err := mgr.AddHealthzCheck("webhook", mgr.GetWebhookServer().StartedChecker()); err != nil { - setupLog.Error(err, "unable to create health check") + setupLog.Error(err, "Unable to create health check") os.Exit(1) } } func setupIndexes(ctx context.Context, mgr ctrl.Manager) { if err := index.AddDefaultIndexes(ctx, mgr); err != nil { - setupLog.Error(err, "unable to setup indexes") + setupLog.Error(err, "Unable to setup indexes") os.Exit(1) } } -func setupReconcilers(ctx context.Context, mgr ctrl.Manager) webhooks.ClusterCacheTrackerReader { +func setupReconcilers(ctx context.Context, mgr ctrl.Manager, watchNamespaces map[string]cache.Config, syncPeriod *time.Duration) webhooks.ClusterCacheTrackerReader { secretCachingClient, err := client.New(mgr.GetConfig(), client.Options{ HTTPClient: mgr.GetHTTPClient(), Cache: &client.CacheOptions{ @@ -397,7 +398,7 @@ func setupReconcilers(ctx context.Context, mgr ctrl.Manager) webhooks.ClusterCac }, }) if err != nil { - setupLog.Error(err, "unable to create secret caching client") + setupLog.Error(err, "Unable to create secret caching client") os.Exit(1) } @@ -413,7 +414,7 @@ func setupReconcilers(ctx context.Context, mgr ctrl.Manager) webhooks.ClusterCac }, ) if err != nil { - setupLog.Error(err, "unable to create cluster cache tracker") + setupLog.Error(err, "Unable to create cluster cache tracker") os.Exit(1) } @@ -422,7 +423,7 @@ func setupReconcilers(ctx context.Context, mgr ctrl.Manager) webhooks.ClusterCac Tracker: tracker, WatchFilterValue: watchFilterValue, }).SetupWithManager(ctx, mgr, concurrency(clusterCacheTrackerConcurrency)); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "ClusterCacheReconciler") + setupLog.Error(err, "Unable to create controller", "controller", "ClusterCacheReconciler") os.Exit(1) } @@ -436,13 +437,43 @@ func setupReconcilers(ctx context.Context, mgr ctrl.Manager) webhooks.ClusterCac }) } + // Setup a separate cache without label selector for secrets, to be used + // when we need to watch for secrets that are not specific to a single cluster (e.g. ClusterResourceSet or ExtensionConfig controllers). + partialSecretCache, err := cache.New(mgr.GetConfig(), cache.Options{ + Scheme: mgr.GetScheme(), + Mapper: mgr.GetRESTMapper(), + HTTPClient: mgr.GetHTTPClient(), + SyncPeriod: syncPeriod, + DefaultNamespaces: watchNamespaces, + DefaultTransform: func(in interface{}) (interface{}, error) { + // Use DefaultTransform to drop objects we don't expect to get into this cache. + obj, ok := in.(*metav1.PartialObjectMetadata) + if !ok { + panic(fmt.Sprintf("cache expected to only get PartialObjectMetadata, got %T", in)) + } + if obj.GetObjectKind().GroupVersionKind() != corev1.SchemeGroupVersion.WithKind("Secret") { + panic(fmt.Sprintf("cache expected to only get Secrets, got %s", obj.GetObjectKind())) + } + // Additionally strip managed fields. + return cache.TransformStripManagedFields()(obj) + }, + }) + if err != nil { + setupLog.Error(err, "Failed to create cache for metadata only Secret watches") + os.Exit(1) + } + if err := mgr.Add(partialSecretCache); err != nil { + setupLog.Error(err, "Failed to start cache for metadata only Secret watches") + os.Exit(1) + } + if feature.Gates.Enabled(feature.ClusterTopology) { if err := (&controllers.ClusterClassReconciler{ Client: mgr.GetClient(), RuntimeClient: runtimeClient, WatchFilterValue: watchFilterValue, }).SetupWithManager(ctx, mgr, concurrency(clusterClassConcurrency)); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "ClusterClass") + setupLog.Error(err, "Unable to create controller", "controller", "ClusterClass") os.Exit(1) } @@ -453,7 +484,7 @@ func setupReconcilers(ctx context.Context, mgr ctrl.Manager) webhooks.ClusterCac Tracker: tracker, WatchFilterValue: watchFilterValue, }).SetupWithManager(ctx, mgr, concurrency(clusterTopologyConcurrency)); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "ClusterTopology") + setupLog.Error(err, "Unable to create controller", "controller", "ClusterTopology") os.Exit(1) } @@ -462,7 +493,7 @@ func setupReconcilers(ctx context.Context, mgr ctrl.Manager) webhooks.ClusterCac APIReader: mgr.GetAPIReader(), WatchFilterValue: watchFilterValue, }).SetupWithManager(ctx, mgr, controller.Options{}); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "MachineDeploymentTopology") + setupLog.Error(err, "Unable to create controller", "controller", "MachineDeploymentTopology") os.Exit(1) } @@ -471,7 +502,7 @@ func setupReconcilers(ctx context.Context, mgr ctrl.Manager) webhooks.ClusterCac APIReader: mgr.GetAPIReader(), WatchFilterValue: watchFilterValue, }).SetupWithManager(ctx, mgr, controller.Options{}); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "MachineSetTopology") + setupLog.Error(err, "Unable to create controller", "controller", "MachineSetTopology") os.Exit(1) } } @@ -482,8 +513,8 @@ func setupReconcilers(ctx context.Context, mgr ctrl.Manager) webhooks.ClusterCac APIReader: mgr.GetAPIReader(), RuntimeClient: runtimeClient, WatchFilterValue: watchFilterValue, - }).SetupWithManager(ctx, mgr, concurrency(extensionConfigConcurrency)); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "ExtensionConfig") + }).SetupWithManager(ctx, mgr, concurrency(extensionConfigConcurrency), partialSecretCache); err != nil { + setupLog.Error(err, "Unable to create controller", "controller", "ExtensionConfig") os.Exit(1) } } @@ -493,7 +524,7 @@ func setupReconcilers(ctx context.Context, mgr ctrl.Manager) webhooks.ClusterCac APIReader: mgr.GetAPIReader(), WatchFilterValue: watchFilterValue, }).SetupWithManager(ctx, mgr, concurrency(clusterConcurrency)); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "Cluster") + setupLog.Error(err, "Unable to create controller", "controller", "Cluster") os.Exit(1) } if err := (&controllers.MachineReconciler{ @@ -503,7 +534,7 @@ func setupReconcilers(ctx context.Context, mgr ctrl.Manager) webhooks.ClusterCac WatchFilterValue: watchFilterValue, NodeDrainClientTimeout: nodeDrainClientTimeout, }).SetupWithManager(ctx, mgr, concurrency(machineConcurrency)); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "Machine") + setupLog.Error(err, "Unable to create controller", "controller", "Machine") os.Exit(1) } if err := (&controllers.MachineSetReconciler{ @@ -513,7 +544,7 @@ func setupReconcilers(ctx context.Context, mgr ctrl.Manager) webhooks.ClusterCac WatchFilterValue: watchFilterValue, DeprecatedInfraMachineNaming: useDeprecatedInfraMachineNaming, }).SetupWithManager(ctx, mgr, concurrency(machineSetConcurrency)); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "MachineSet") + setupLog.Error(err, "Unable to create controller", "controller", "MachineSet") os.Exit(1) } if err := (&controllers.MachineDeploymentReconciler{ @@ -521,7 +552,7 @@ func setupReconcilers(ctx context.Context, mgr ctrl.Manager) webhooks.ClusterCac APIReader: mgr.GetAPIReader(), WatchFilterValue: watchFilterValue, }).SetupWithManager(ctx, mgr, concurrency(machineDeploymentConcurrency)); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "MachineDeployment") + setupLog.Error(err, "Unable to create controller", "controller", "MachineDeployment") os.Exit(1) } @@ -532,7 +563,7 @@ func setupReconcilers(ctx context.Context, mgr ctrl.Manager) webhooks.ClusterCac Tracker: tracker, WatchFilterValue: watchFilterValue, }).SetupWithManager(ctx, mgr, concurrency(machinePoolConcurrency)); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "MachinePool") + setupLog.Error(err, "Unable to create controller", "controller", "MachinePool") os.Exit(1) } } @@ -542,15 +573,15 @@ func setupReconcilers(ctx context.Context, mgr ctrl.Manager) webhooks.ClusterCac Client: mgr.GetClient(), Tracker: tracker, WatchFilterValue: watchFilterValue, - }).SetupWithManager(ctx, mgr, concurrency(clusterResourceSetConcurrency)); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "ClusterResourceSet") + }).SetupWithManager(ctx, mgr, concurrency(clusterResourceSetConcurrency), partialSecretCache); err != nil { + setupLog.Error(err, "Unable to create controller", "controller", "ClusterResourceSet") os.Exit(1) } if err := (&addonscontrollers.ClusterResourceSetBindingReconciler{ Client: mgr.GetClient(), WatchFilterValue: watchFilterValue, }).SetupWithManager(ctx, mgr, concurrency(clusterResourceSetConcurrency)); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "ClusterResourceSetBinding") + setupLog.Error(err, "Unable to create controller", "controller", "ClusterResourceSetBinding") os.Exit(1) } } @@ -560,7 +591,7 @@ func setupReconcilers(ctx context.Context, mgr ctrl.Manager) webhooks.ClusterCac Tracker: tracker, WatchFilterValue: watchFilterValue, }).SetupWithManager(ctx, mgr, concurrency(machineHealthCheckConcurrency)); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "MachineHealthCheck") + setupLog.Error(err, "Unable to create controller", "controller", "MachineHealthCheck") os.Exit(1) } @@ -571,61 +602,61 @@ func setupWebhooks(mgr ctrl.Manager, tracker webhooks.ClusterCacheTrackerReader) // NOTE: ClusterClass and managed topologies are behind ClusterTopology feature gate flag; the webhook // is going to prevent creating or updating new objects in case the feature flag is disabled. if err := (&webhooks.ClusterClass{Client: mgr.GetClient()}).SetupWebhookWithManager(mgr); err != nil { - setupLog.Error(err, "unable to create webhook", "webhook", "ClusterClass") + setupLog.Error(err, "Unable to create webhook", "webhook", "ClusterClass") os.Exit(1) } // NOTE: ClusterClass and managed topologies are behind ClusterTopology feature gate flag; the webhook // is going to prevent usage of Cluster.Topology in case the feature flag is disabled. if err := (&webhooks.Cluster{Client: mgr.GetClient(), ClusterCacheTrackerReader: tracker}).SetupWebhookWithManager(mgr); err != nil { - setupLog.Error(err, "unable to create webhook", "webhook", "Cluster") + setupLog.Error(err, "Unable to create webhook", "webhook", "Cluster") os.Exit(1) } if err := (&webhooks.Machine{}).SetupWebhookWithManager(mgr); err != nil { - setupLog.Error(err, "unable to create webhook", "webhook", "Machine") + setupLog.Error(err, "Unable to create webhook", "webhook", "Machine") os.Exit(1) } if err := (&webhooks.MachineSet{}).SetupWebhookWithManager(mgr); err != nil { - setupLog.Error(err, "unable to create webhook", "webhook", "MachineSet") + setupLog.Error(err, "Unable to create webhook", "webhook", "MachineSet") os.Exit(1) } if err := (&webhooks.MachineDeployment{}).SetupWebhookWithManager(mgr); err != nil { - setupLog.Error(err, "unable to create webhook", "webhook", "MachineDeployment") + setupLog.Error(err, "Unable to create webhook", "webhook", "MachineDeployment") os.Exit(1) } // NOTE: MachinePool is behind MachinePool feature gate flag; the webhook // is going to prevent creating or updating new objects in case the feature flag is disabled if err := (&expwebhooks.MachinePool{}).SetupWebhookWithManager(mgr); err != nil { - setupLog.Error(err, "unable to create webhook", "webhook", "MachinePool") + setupLog.Error(err, "Unable to create webhook", "webhook", "MachinePool") os.Exit(1) } // NOTE: ClusterResourceSet is behind ClusterResourceSet feature gate flag; the webhook // is going to prevent creating or updating new objects in case the feature flag is disabled if err := (&addonswebhooks.ClusterResourceSet{}).SetupWebhookWithManager(mgr); err != nil { - setupLog.Error(err, "unable to create webhook", "webhook", "ClusterResourceSet") + setupLog.Error(err, "Unable to create webhook", "webhook", "ClusterResourceSet") os.Exit(1) } // NOTE: ClusterResourceSetBinding is behind ClusterResourceSet feature gate flag; the webhook // is going to prevent creating or updating new objects in case the feature flag is disabled if err := (&addonswebhooks.ClusterResourceSetBinding{}).SetupWebhookWithManager(mgr); err != nil { - setupLog.Error(err, "unable to create webhook", "webhook", "ClusterResourceSetBinding") + setupLog.Error(err, "Unable to create webhook", "webhook", "ClusterResourceSetBinding") os.Exit(1) } if err := (&webhooks.MachineHealthCheck{}).SetupWebhookWithManager(mgr); err != nil { - setupLog.Error(err, "unable to create webhook", "webhook", "MachineHealthCheck") + setupLog.Error(err, "Unable to create webhook", "webhook", "MachineHealthCheck") os.Exit(1) } // NOTE: ExtensionConfig is behind the RuntimeSDK feature gate flag. The webhook will prevent creating or updating // new objects if the feature flag is disabled. if err := (&runtimewebhooks.ExtensionConfig{}).SetupWebhookWithManager(mgr); err != nil { - setupLog.Error(err, "unable to create webhook", "webhook", "ExtensionConfig") + setupLog.Error(err, "Unable to create webhook", "webhook", "ExtensionConfig") os.Exit(1) } @@ -633,11 +664,11 @@ func setupWebhooks(mgr ctrl.Manager, tracker webhooks.ClusterCacheTrackerReader) // We are using GetAPIReader here to avoid caching all IPAddressClaims Client: mgr.GetAPIReader(), }).SetupWebhookWithManager(mgr); err != nil { - setupLog.Error(err, "unable to create webhook", "webhook", "IPAddress") + setupLog.Error(err, "Unable to create webhook", "webhook", "IPAddress") os.Exit(1) } if err := (&expipamwebhooks.IPAddressClaim{}).SetupWebhookWithManager(mgr); err != nil { - setupLog.Error(err, "unable to create webhook", "webhook", "IPAddressClaim") + setupLog.Error(err, "Unable to create webhook", "webhook", "IPAddressClaim") os.Exit(1) } }