@@ -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,133 +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- TrackingCache : trackingCache ,
482- }).SetupWithManager (mgr ); err != nil {
483- setupLog .Error (err , "unable to create controller" , "controller" , "ClusterExtensionRevision" )
484- return err
485- }
426+ err = setupBoxcutter (mgr , ceReconciler , preflights )
486427 } else {
487- coreClient , err := corev1client .NewForConfig (mgr .GetConfig ())
488- if err != nil {
489- setupLog .Error (err , "unable to create core client" )
490- return err
491- }
492- tokenGetter := authentication .NewTokenGetter (coreClient , authentication .WithExpirationDuration (1 * time .Hour ))
493- clientRestConfigMapper := action .ServiceAccountRestConfigMapper (tokenGetter )
494- if features .OperatorControllerFeatureGate .Enabled (features .SyntheticPermissions ) {
495- clientRestConfigMapper = action .SyntheticUserRestConfigMapper (clientRestConfigMapper )
496- }
497-
498- cfgGetter , err := helmclient .NewActionConfigGetter (mgr .GetConfig (), mgr .GetRESTMapper (),
499- helmclient .StorageDriverMapper (action .ChunkedStorageDriverMapper (coreClient , mgr .GetAPIReader (), cfg .systemNamespace )),
500- helmclient .ClientNamespaceMapper (func (obj client.Object ) (string , error ) {
501- ext := obj .(* ocv1.ClusterExtension )
502- return ext .Spec .Namespace , nil
503- }),
504- helmclient .ClientRestConfigMapper (clientRestConfigMapper ),
505- )
506- if err != nil {
507- setupLog .Error (err , "unable to config for creating helm client" )
508- return err
509- }
510-
511- acg , err := action .NewWrappedActionClientGetter (cfgGetter ,
512- helmclient .WithFailureRollbacks (false ),
513- )
514- if err != nil {
515- setupLog .Error (err , "unable to create helm client" )
516- return err
517- }
518-
519- // determine if PreAuthorizer should be enabled based on feature gate
520- var preAuth authorization.PreAuthorizer
521- if features .OperatorControllerFeatureGate .Enabled (features .PreflightPermissions ) {
522- preAuth = authorization .NewRBACPreAuthorizer (mgr .GetClient ())
523- }
524-
525- cm := contentmanager .NewManager (clientRestConfigMapper , mgr .GetConfig (), mgr .GetRESTMapper ())
526- err = clusterExtensionFinalizers .Register (controllers .ClusterExtensionCleanupContentManagerCacheFinalizer , finalizers .FinalizerFunc (func (ctx context.Context , obj client.Object ) (crfinalizer.Result , error ) {
527- ext := obj .(* ocv1.ClusterExtension )
528- err := cm .Delete (ext )
529- return crfinalizer.Result {}, err
530- }))
531- if err != nil {
532- setupLog .Error (err , "unable to register content manager cleanup finalizer" )
533- return err
534- }
535- // now initialize the helmApplier, assigning the potentially nil preAuth
536- ceReconciler .Applier = & applier.Helm {
537- ActionClientGetter : acg ,
538- Preflights : preflights ,
539- BundleToHelmChartConverter : & convert.BundleToHelmChartConverter {
540- BundleRenderer : registryv1 .Renderer ,
541- CertificateProvider : certProvider ,
542- IsWebhookSupportEnabled : certProvider != nil ,
543- },
544- HelmReleaseToObjectsConverter : & applier.HelmReleaseToObjectsConverter {},
545- PreAuthorizer : preAuth ,
546- Watcher : ceController ,
547- Manager : cm ,
548- }
549- 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
550433 }
551434
552435 if err = (& controllers.ClusterCatalogReconciler {
@@ -603,6 +486,144 @@ func getCertificateProvider() render.CertificateProvider {
603486 return nil
604487}
605488
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+ return fmt .Errorf ("unable to create boxcutter tracking cache: %v" , err )
528+ }
529+ if err := mgr .Add (trackingCache ); err != nil {
530+ return fmt .Errorf ("unable to add tracking cache to manager: %v" , 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+ TrackingCache : trackingCache ,
548+ }).SetupWithManager (mgr ); err != nil {
549+ return fmt .Errorf ("unable to setup ClusterExtensionRevision controller: %w" , err )
550+ }
551+ return nil
552+ }
553+
554+ func setupHelm (
555+ mgr manager.Manager ,
556+ ceReconciler * controllers.ClusterExtensionReconciler ,
557+ preflights []applier.Preflight ,
558+ ceController crcontroller.Controller ,
559+ clusterExtensionFinalizers crfinalizer.Registerer ,
560+ ) error {
561+ coreClient , err := corev1client .NewForConfig (mgr .GetConfig ())
562+ if err != nil {
563+ return fmt .Errorf ("unable to create core client: %w" , err )
564+ }
565+ tokenGetter := authentication .NewTokenGetter (coreClient , authentication .WithExpirationDuration (1 * time .Hour ))
566+ clientRestConfigMapper := action .ServiceAccountRestConfigMapper (tokenGetter )
567+ if features .OperatorControllerFeatureGate .Enabled (features .SyntheticPermissions ) {
568+ clientRestConfigMapper = action .SyntheticUserRestConfigMapper (clientRestConfigMapper )
569+ }
570+
571+ cfgGetter , err := helmclient .NewActionConfigGetter (mgr .GetConfig (), mgr .GetRESTMapper (),
572+ helmclient .StorageDriverMapper (action .ChunkedStorageDriverMapper (coreClient , mgr .GetAPIReader (), cfg .systemNamespace )),
573+ helmclient .ClientNamespaceMapper (func (obj client.Object ) (string , error ) {
574+ ext := obj .(* ocv1.ClusterExtension )
575+ return ext .Spec .Namespace , nil
576+ }),
577+ helmclient .ClientRestConfigMapper (clientRestConfigMapper ),
578+ )
579+ if err != nil {
580+ return fmt .Errorf ("unable to create helm action config getter: %w" , err )
581+ }
582+
583+ acg , err := action .NewWrappedActionClientGetter (cfgGetter ,
584+ helmclient .WithFailureRollbacks (false ),
585+ )
586+ if err != nil {
587+ return fmt .Errorf ("unable to create helm action client getter: %w" , err )
588+ }
589+
590+ // determine if PreAuthorizer should be enabled based on feature gate
591+ var preAuth authorization.PreAuthorizer
592+ if features .OperatorControllerFeatureGate .Enabled (features .PreflightPermissions ) {
593+ preAuth = authorization .NewRBACPreAuthorizer (mgr .GetClient ())
594+ }
595+
596+ cm := contentmanager .NewManager (clientRestConfigMapper , mgr .GetConfig (), mgr .GetRESTMapper ())
597+ err = clusterExtensionFinalizers .Register (controllers .ClusterExtensionCleanupContentManagerCacheFinalizer , finalizers .FinalizerFunc (func (ctx context.Context , obj client.Object ) (crfinalizer.Result , error ) {
598+ ext := obj .(* ocv1.ClusterExtension )
599+ err := cm .Delete (ext )
600+ return crfinalizer.Result {}, err
601+ }))
602+ if err != nil {
603+ setupLog .Error (err , "unable to register content manager cleanup finalizer" )
604+ return err
605+ }
606+
607+ certProvider := getCertificateProvider ()
608+
609+ // now initialize the helmApplier, assigning the potentially nil preAuth
610+ ceReconciler .Applier = & applier.Helm {
611+ ActionClientGetter : acg ,
612+ Preflights : preflights ,
613+ BundleToHelmChartConverter : & convert.BundleToHelmChartConverter {
614+ BundleRenderer : registryv1 .Renderer ,
615+ CertificateProvider : certProvider ,
616+ IsWebhookSupportEnabled : certProvider != nil ,
617+ },
618+ HelmReleaseToObjectsConverter : & applier.HelmReleaseToObjectsConverter {},
619+ PreAuthorizer : preAuth ,
620+ Watcher : ceController ,
621+ Manager : cm ,
622+ }
623+ ceReconciler .RevisionStatesGetter = & controllers.HelmRevisionStatesGetter {ActionClientGetter : acg }
624+ return nil
625+ }
626+
606627func main () {
607628 if err := operatorControllerCmd .Execute (); err != nil {
608629 fmt .Fprintf (os .Stderr , "Error: %v\n " , err )
0 commit comments