@@ -49,9 +49,11 @@ import (
4949 crcache "sigs.k8s.io/controller-runtime/pkg/cache"
5050 "sigs.k8s.io/controller-runtime/pkg/certwatcher"
5151 "sigs.k8s.io/controller-runtime/pkg/client"
52+ crcontroller "sigs.k8s.io/controller-runtime/pkg/controller"
5253 crfinalizer "sigs.k8s.io/controller-runtime/pkg/finalizer"
5354 "sigs.k8s.io/controller-runtime/pkg/healthz"
5455 "sigs.k8s.io/controller-runtime/pkg/log"
56+ "sigs.k8s.io/controller-runtime/pkg/manager"
5557 "sigs.k8s.io/controller-runtime/pkg/metrics/filters"
5658 "sigs.k8s.io/controller-runtime/pkg/metrics/server"
5759
@@ -420,132 +422,14 @@ func run() error {
420422 return err
421423 }
422424
423- certProvider := getCertificateProvider ()
424425 if features .OperatorControllerFeatureGate .Enabled (features .BoxcutterRuntime ) {
425- // TODO: add support for preflight checks
426- // TODO: better scheme handling - which types do we want to support?
427- _ = apiextensionsv1 .AddToScheme (mgr .GetScheme ())
428- ceReconciler .Applier = & applier.Boxcutter {
429- Client : mgr .GetClient (),
430- Scheme : mgr .GetScheme (),
431- RevisionGenerator : & applier.SimpleRevisionGenerator {
432- Scheme : mgr .GetScheme (),
433- BundleRenderer : & applier.RegistryV1BundleRenderer {
434- BundleRenderer : registryv1 .Renderer ,
435- CertificateProvider : certProvider ,
436- },
437- },
438- Preflights : preflights ,
439- }
440- ceReconciler .RevisionStatesGetter = & controllers.BoxcutterRevisionStatesGetter {Reader : mgr .GetClient ()}
441-
442- // Boxcutter
443- const (
444- boxcutterSystemPrefixFieldOwner = "olm.operatorframework.io"
445- )
446-
447- discoveryClient , err := discovery .NewDiscoveryClientForConfig (restConfig )
448- if err != nil {
449- setupLog .Error (err , "unable to create discovery client" )
450- return err
451- }
452-
453- trackingCache , err := managedcache .NewTrackingCache (
454- ctrl .Log .WithName ("trackingCache" ),
455- restConfig ,
456- crcache.Options {
457- Scheme : mgr .GetScheme (), Mapper : mgr .GetRESTMapper (),
458- },
459- )
460- if err != nil {
461- setupLog .Error (err , "unable to create boxcutter tracking cache" )
462- }
463- if err := mgr .Add (trackingCache ); err != nil {
464- setupLog .Error (err , "unable to set up tracking cache" )
465- }
466-
467- if err = (& controllers.ClusterExtensionRevisionReconciler {
468- Client : cl ,
469- RevisionEngine : machinery .NewRevisionEngine (
470- machinery .NewPhaseEngine (
471- machinery .NewObjectEngine (
472- mgr .GetScheme (), trackingCache , mgr .GetClient (),
473- ownerhandling .NewNative (mgr .GetScheme ()),
474- machinery .NewComparator (ownerhandling .NewNative (mgr .GetScheme ()), discoveryClient , mgr .GetScheme (), boxcutterSystemPrefixFieldOwner ),
475- boxcutterSystemPrefixFieldOwner , boxcutterSystemPrefixFieldOwner ,
476- ),
477- validation .NewClusterPhaseValidator (mgr .GetRESTMapper (), mgr .GetClient ()),
478- ),
479- validation .NewRevisionValidator (), mgr .GetClient (),
480- ),
481- }).SetupWithManager (mgr , trackingCache ); err != nil {
482- setupLog .Error (err , "unable to create controller" , "controller" , "ClusterExtensionRevision" )
483- return err
484- }
426+ err = setupBoxcutter (mgr , ceReconciler , preflights )
485427 } else {
486- coreClient , err := corev1client .NewForConfig (mgr .GetConfig ())
487- if err != nil {
488- setupLog .Error (err , "unable to create core client" )
489- return err
490- }
491- tokenGetter := authentication .NewTokenGetter (coreClient , authentication .WithExpirationDuration (1 * time .Hour ))
492- clientRestConfigMapper := action .ServiceAccountRestConfigMapper (tokenGetter )
493- if features .OperatorControllerFeatureGate .Enabled (features .SyntheticPermissions ) {
494- clientRestConfigMapper = action .SyntheticUserRestConfigMapper (clientRestConfigMapper )
495- }
496-
497- cfgGetter , err := helmclient .NewActionConfigGetter (mgr .GetConfig (), mgr .GetRESTMapper (),
498- helmclient .StorageDriverMapper (action .ChunkedStorageDriverMapper (coreClient , mgr .GetAPIReader (), cfg .systemNamespace )),
499- helmclient .ClientNamespaceMapper (func (obj client.Object ) (string , error ) {
500- ext := obj .(* ocv1.ClusterExtension )
501- return ext .Spec .Namespace , nil
502- }),
503- helmclient .ClientRestConfigMapper (clientRestConfigMapper ),
504- )
505- if err != nil {
506- setupLog .Error (err , "unable to config for creating helm client" )
507- return err
508- }
509-
510- acg , err := action .NewWrappedActionClientGetter (cfgGetter ,
511- helmclient .WithFailureRollbacks (false ),
512- )
513- if err != nil {
514- setupLog .Error (err , "unable to create helm client" )
515- return err
516- }
517-
518- // determine if PreAuthorizer should be enabled based on feature gate
519- var preAuth authorization.PreAuthorizer
520- if features .OperatorControllerFeatureGate .Enabled (features .PreflightPermissions ) {
521- preAuth = authorization .NewRBACPreAuthorizer (mgr .GetClient ())
522- }
523-
524- cm := contentmanager .NewManager (clientRestConfigMapper , mgr .GetConfig (), mgr .GetRESTMapper ())
525- err = clusterExtensionFinalizers .Register (controllers .ClusterExtensionCleanupContentManagerCacheFinalizer , finalizers .FinalizerFunc (func (ctx context.Context , obj client.Object ) (crfinalizer.Result , error ) {
526- ext := obj .(* ocv1.ClusterExtension )
527- err := cm .Delete (ext )
528- return crfinalizer.Result {}, err
529- }))
530- if err != nil {
531- setupLog .Error (err , "unable to register content manager cleanup finalizer" )
532- return err
533- }
534- // now initialize the helmApplier, assigning the potentially nil preAuth
535- ceReconciler .Applier = & applier.Helm {
536- ActionClientGetter : acg ,
537- Preflights : preflights ,
538- BundleToHelmChartConverter : & convert.BundleToHelmChartConverter {
539- BundleRenderer : registryv1 .Renderer ,
540- CertificateProvider : certProvider ,
541- IsWebhookSupportEnabled : certProvider != nil ,
542- },
543- HelmReleaseToObjectsConverter : & applier.HelmReleaseToObjectsConverter {},
544- PreAuthorizer : preAuth ,
545- Watcher : ceController ,
546- Manager : cm ,
547- }
548- ceReconciler .RevisionStatesGetter = & controllers.HelmRevisionStatesGetter {ActionClientGetter : acg }
428+ err = setupHelm (mgr , ceReconciler , preflights , ceController , clusterExtensionFinalizers )
429+ }
430+ if err != nil {
431+ setupLog .Error (err , "unable to setup lifecycler" )
432+ return err
549433 }
550434
551435 if err = (& controllers.ClusterCatalogReconciler {
@@ -602,6 +486,143 @@ func getCertificateProvider() render.CertificateProvider {
602486 return nil
603487}
604488
489+ func setupBoxcutter (mgr manager.Manager , ceReconciler * controllers.ClusterExtensionReconciler , preflights []applier.Preflight ) error {
490+ certProvider := getCertificateProvider ()
491+
492+ // TODO: add support for preflight checks
493+ // TODO: better scheme handling - which types do we want to support?
494+ _ = apiextensionsv1 .AddToScheme (mgr .GetScheme ())
495+ ceReconciler .Applier = & applier.Boxcutter {
496+ Client : mgr .GetClient (),
497+ Scheme : mgr .GetScheme (),
498+ RevisionGenerator : & applier.SimpleRevisionGenerator {
499+ Scheme : mgr .GetScheme (),
500+ BundleRenderer : & applier.RegistryV1BundleRenderer {
501+ BundleRenderer : registryv1 .Renderer ,
502+ CertificateProvider : certProvider ,
503+ },
504+ },
505+ Preflights : preflights ,
506+ }
507+ ceReconciler .RevisionStatesGetter = & controllers.BoxcutterRevisionStatesGetter {Reader : mgr .GetClient ()}
508+
509+ // Boxcutter
510+ const (
511+ boxcutterSystemPrefixFieldOwner = "olm.operatorframework.io"
512+ )
513+
514+ discoveryClient , err := discovery .NewDiscoveryClientForConfig (mgr .GetConfig ())
515+ if err != nil {
516+ return fmt .Errorf ("unable to create discovery client: %w" , err )
517+ }
518+
519+ trackingCache , err := managedcache .NewTrackingCache (
520+ ctrl .Log .WithName ("trackingCache" ),
521+ mgr .GetConfig (),
522+ crcache.Options {
523+ Scheme : mgr .GetScheme (), Mapper : mgr .GetRESTMapper (),
524+ },
525+ )
526+ if err != nil {
527+ setupLog .Error (err , "unable to create boxcutter tracking cache" )
528+ }
529+ if err := mgr .Add (trackingCache ); err != nil {
530+ return fmt .Errorf ("unable to add tracking cache to manager: %w" , err )
531+ }
532+
533+ if err = (& controllers.ClusterExtensionRevisionReconciler {
534+ Client : mgr .GetClient (),
535+ RevisionEngine : machinery .NewRevisionEngine (
536+ machinery .NewPhaseEngine (
537+ machinery .NewObjectEngine (
538+ mgr .GetScheme (), trackingCache , mgr .GetClient (),
539+ ownerhandling .NewNative (mgr .GetScheme ()),
540+ machinery .NewComparator (ownerhandling .NewNative (mgr .GetScheme ()), discoveryClient , mgr .GetScheme (), boxcutterSystemPrefixFieldOwner ),
541+ boxcutterSystemPrefixFieldOwner , boxcutterSystemPrefixFieldOwner ,
542+ ),
543+ validation .NewClusterPhaseValidator (mgr .GetRESTMapper (), mgr .GetClient ()),
544+ ),
545+ validation .NewRevisionValidator (), mgr .GetClient (),
546+ ),
547+ }).SetupWithManager (mgr , trackingCache ); err != nil {
548+ return fmt .Errorf ("unable to setup ClusterExtensionRevision controller: %w" , err )
549+ }
550+ return nil
551+ }
552+
553+ func setupHelm (
554+ mgr manager.Manager ,
555+ ceReconciler * controllers.ClusterExtensionReconciler ,
556+ preflights []applier.Preflight ,
557+ ceController crcontroller.Controller ,
558+ clusterExtensionFinalizers crfinalizer.Registerer ,
559+ ) error {
560+ coreClient , err := corev1client .NewForConfig (mgr .GetConfig ())
561+ if err != nil {
562+ return fmt .Errorf ("unable to create core client: %w" , err )
563+ }
564+ tokenGetter := authentication .NewTokenGetter (coreClient , authentication .WithExpirationDuration (1 * time .Hour ))
565+ clientRestConfigMapper := action .ServiceAccountRestConfigMapper (tokenGetter )
566+ if features .OperatorControllerFeatureGate .Enabled (features .SyntheticPermissions ) {
567+ clientRestConfigMapper = action .SyntheticUserRestConfigMapper (clientRestConfigMapper )
568+ }
569+
570+ cfgGetter , err := helmclient .NewActionConfigGetter (mgr .GetConfig (), mgr .GetRESTMapper (),
571+ helmclient .StorageDriverMapper (action .ChunkedStorageDriverMapper (coreClient , mgr .GetAPIReader (), cfg .systemNamespace )),
572+ helmclient .ClientNamespaceMapper (func (obj client.Object ) (string , error ) {
573+ ext := obj .(* ocv1.ClusterExtension )
574+ return ext .Spec .Namespace , nil
575+ }),
576+ helmclient .ClientRestConfigMapper (clientRestConfigMapper ),
577+ )
578+ if err != nil {
579+ return fmt .Errorf ("unable to create helm action config getter: %w" , err )
580+ }
581+
582+ acg , err := action .NewWrappedActionClientGetter (cfgGetter ,
583+ helmclient .WithFailureRollbacks (false ),
584+ )
585+ if err != nil {
586+ return fmt .Errorf ("unable to create helm action client getter: %w" , err )
587+ }
588+
589+ // determine if PreAuthorizer should be enabled based on feature gate
590+ var preAuth authorization.PreAuthorizer
591+ if features .OperatorControllerFeatureGate .Enabled (features .PreflightPermissions ) {
592+ preAuth = authorization .NewRBACPreAuthorizer (mgr .GetClient ())
593+ }
594+
595+ cm := contentmanager .NewManager (clientRestConfigMapper , mgr .GetConfig (), mgr .GetRESTMapper ())
596+ err = clusterExtensionFinalizers .Register (controllers .ClusterExtensionCleanupContentManagerCacheFinalizer , finalizers .FinalizerFunc (func (ctx context.Context , obj client.Object ) (crfinalizer.Result , error ) {
597+ ext := obj .(* ocv1.ClusterExtension )
598+ err := cm .Delete (ext )
599+ return crfinalizer.Result {}, err
600+ }))
601+ if err != nil {
602+ setupLog .Error (err , "unable to register content manager cleanup finalizer" )
603+ return err
604+ }
605+
606+ certProvider := getCertificateProvider ()
607+
608+ // now initialize the helmApplier, assigning the potentially nil preAuth
609+ ceReconciler .Applier = & applier.Helm {
610+ ActionClientGetter : acg ,
611+ Preflights : preflights ,
612+ BundleToHelmChartConverter : & convert.BundleToHelmChartConverter {
613+ BundleRenderer : registryv1 .Renderer ,
614+ CertificateProvider : certProvider ,
615+ IsWebhookSupportEnabled : certProvider != nil ,
616+ },
617+ HelmReleaseToObjectsConverter : & applier.HelmReleaseToObjectsConverter {},
618+ PreAuthorizer : preAuth ,
619+ Watcher : ceController ,
620+ Manager : cm ,
621+ }
622+ ceReconciler .RevisionStatesGetter = & controllers.HelmRevisionStatesGetter {ActionClientGetter : acg }
623+ return nil
624+ }
625+
605626func main () {
606627 if err := operatorControllerCmd .Execute (); err != nil {
607628 fmt .Fprintf (os .Stderr , "Error: %v\n " , err )
0 commit comments