@@ -474,11 +474,26 @@ func run() error {
474474 }
475475
476476 certProvider := getCertificateProvider ()
477+
478+ // Read proxy configuration from environment variables
479+ var proxy * render.Proxy
480+ httpProxy := os .Getenv ("HTTP_PROXY" )
481+ httpsProxy := os .Getenv ("HTTPS_PROXY" )
482+ noProxy := os .Getenv ("NO_PROXY" )
483+ if httpProxy != "" || httpsProxy != "" || noProxy != "" {
484+ proxy = & render.Proxy {
485+ HTTPProxy : httpProxy ,
486+ HTTPSProxy : httpsProxy ,
487+ NoProxy : noProxy ,
488+ }
489+ }
490+
477491 regv1ManifestProvider := & applier.RegistryV1ManifestProvider {
478492 BundleRenderer : registryv1 .Renderer ,
479493 CertificateProvider : certProvider ,
480494 IsWebhookSupportEnabled : certProvider != nil ,
481495 IsSingleOwnNamespaceEnabled : features .OperatorControllerFeatureGate .Enabled (features .SingleOwnNamespaceInstallSupport ),
496+ Proxy : proxy ,
482497 }
483498 var cerCfg reconcilerConfigurator
484499 if features .OperatorControllerFeatureGate .Enabled (features .BoxcutterRuntime ) {
@@ -540,6 +555,50 @@ func run() error {
540555 return err
541556 }
542557
558+ // Add a runnable to trigger reconciliation of all ClusterExtensions on startup.
559+ // This ensures existing deployments get updated when proxy configuration changes
560+ // (added, modified, or removed).
561+ if err := mgr .Add (manager .RunnableFunc (func (ctx context.Context ) error {
562+ // Wait for the cache to sync
563+ if ! mgr .GetCache ().WaitForCacheSync (ctx ) {
564+ return fmt .Errorf ("failed to wait for cache sync" )
565+ }
566+
567+ // Always trigger reconciliation on startup to handle proxy config changes
568+ if proxy != nil {
569+ setupLog .Info ("proxy configuration detected, triggering reconciliation of all ClusterExtensions" ,
570+ "httpProxy" , proxy .HTTPProxy , "httpsProxy" , proxy .HTTPSProxy , "noProxy" , proxy .NoProxy )
571+ } else {
572+ setupLog .Info ("no proxy configuration detected, triggering reconciliation to remove proxy vars from existing deployments" )
573+ }
574+
575+ extList := & ocv1.ClusterExtensionList {}
576+ if err := cl .List (ctx , extList ); err != nil {
577+ setupLog .Error (err , "failed to list ClusterExtensions for proxy update" )
578+ return nil // Don't fail startup
579+ }
580+
581+ for i := range extList .Items {
582+ ext := & extList .Items [i ]
583+ // Trigger reconciliation by adding an annotation
584+ if ext .Annotations == nil {
585+ ext .Annotations = make (map [string ]string )
586+ }
587+ ext .Annotations ["olm.operatorframework.io/proxy-reconcile" ] = time .Now ().Format (time .RFC3339 )
588+ if err := cl .Update (ctx , ext ); err != nil {
589+ setupLog .Error (err , "failed to trigger reconciliation for ClusterExtension" , "name" , ext .Name )
590+ // Continue with other ClusterExtensions
591+ }
592+ }
593+
594+ setupLog .Info ("triggered reconciliation for existing ClusterExtensions" , "count" , len (extList .Items ))
595+
596+ return nil
597+ })); err != nil {
598+ setupLog .Error (err , "unable to add startup reconciliation trigger" )
599+ return err
600+ }
601+
543602 setupLog .Info ("starting manager" )
544603 ctx := ctrl .SetupSignalHandler ()
545604 if err := mgr .Start (ctx ); err != nil {
@@ -625,13 +684,18 @@ func (c *boxcutterReconcilerConfigurator) Configure(ceReconciler *controllers.Cl
625684 ActionClientGetter : acg ,
626685 RevisionGenerator : rg ,
627686 }
687+ // Get the ManifestProvider to extract proxy fingerprint
688+ regv1Provider , ok := c .regv1ManifestProvider .(* applier.RegistryV1ManifestProvider )
689+ if ! ok {
690+ return fmt .Errorf ("manifest provider is not of type *applier.RegistryV1ManifestProvider" )
691+ }
628692 ceReconciler .ReconcileSteps = []controllers.ReconcileStepFunc {
629693 controllers .HandleFinalizers (c .finalizers ),
630694 controllers .MigrateStorage (storageMigrator ),
631695 controllers .RetrieveRevisionStates (revisionStatesGetter ),
632696 controllers .ResolveBundle (c .resolver , c .mgr .GetClient ()),
633697 controllers .UnpackBundle (c .imagePuller , c .imageCache ),
634- controllers .ApplyBundleWithBoxcutter (appl .Apply ),
698+ controllers .ApplyBundleWithBoxcutter (appl .Apply , regv1Provider . ProxyFingerprint ),
635699 }
636700
637701 baseDiscoveryClient , err := discovery .NewDiscoveryClientForConfig (c .mgr .GetConfig ())
0 commit comments