@@ -25,6 +25,7 @@ import (
25
25
"net/url"
26
26
"os"
27
27
"strings"
28
+ "time"
28
29
29
30
corev1 "k8s.io/api/core/v1"
30
31
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -458,7 +459,7 @@ func (p *phaseReconciler) fetch(ctx context.Context) (reconcile.Result, error) {
458
459
}
459
460
460
461
// preInstall ensure all the clusterctl CRDs are available before installing the provider,
461
- // and delete existing components if required for upgrade .
462
+ // and update existing components if required.
462
463
func (p * phaseReconciler ) preInstall (ctx context.Context ) (reconcile.Result , error ) {
463
464
log := ctrl .LoggerFrom (ctx )
464
465
@@ -467,9 +468,23 @@ func (p *phaseReconciler) preInstall(ctx context.Context) (reconcile.Result, err
467
468
return reconcile.Result {}, nil
468
469
}
469
470
470
- log .Info ("Changes detected, deleting existing components" )
471
+ if * p .provider .GetStatus ().InstalledVersion == p .provider .GetSpec ().Version {
472
+ return reconcile.Result {}, nil
473
+ }
474
+
475
+ log .Info ("Version changes detected, updating existing components" )
471
476
472
- return p .delete (ctx )
477
+ if err := p .newClusterClient ().ProviderUpgrader ().ApplyCustomPlan (ctx , cluster.UpgradeOptions {
478
+ WaitProviders : true ,
479
+ WaitProviderTimeout : 5 * time .Minute ,
480
+ }, cluster.UpgradeItem {
481
+ NextVersion : p .provider .GetSpec ().Version ,
482
+ Provider : getProvider (p .provider , p .options .Version ),
483
+ }); err != nil {
484
+ return reconcile.Result {}, err
485
+ }
486
+
487
+ return reconcile.Result {}, nil
473
488
}
474
489
475
490
// install installs the provider components using clusterctl library.
@@ -501,26 +516,31 @@ func (p *phaseReconciler) install(ctx context.Context) (reconcile.Result, error)
501
516
return reconcile.Result {}, nil
502
517
}
503
518
519
+ func getProvider (provider operatorv1.GenericProvider , defaultVersion string ) clusterctlv1.Provider {
520
+ clusterctlProvider := & clusterctlv1.Provider {}
521
+ clusterctlProvider .Name = clusterctlProviderName (provider ).Name
522
+ clusterctlProvider .Namespace = provider .GetNamespace ()
523
+ clusterctlProvider .Type = string (util .ClusterctlProviderType (provider ))
524
+ clusterctlProvider .ProviderName = provider .GetName ()
525
+
526
+ if provider .GetStatus ().InstalledVersion != nil {
527
+ clusterctlProvider .Version = * provider .GetStatus ().InstalledVersion
528
+ } else {
529
+ clusterctlProvider .Version = defaultVersion
530
+ }
531
+
532
+ return * clusterctlProvider
533
+ }
534
+
504
535
// delete deletes the provider components using clusterctl library.
505
536
func (p * phaseReconciler ) delete (ctx context.Context ) (reconcile.Result , error ) {
506
537
log := ctrl .LoggerFrom (ctx )
507
538
log .Info ("Deleting provider" )
508
539
509
540
clusterClient := p .newClusterClient ()
510
541
511
- p .clusterctlProvider .Name = clusterctlProviderName (p .provider ).Name
512
- p .clusterctlProvider .Namespace = p .provider .GetNamespace ()
513
- p .clusterctlProvider .Type = string (util .ClusterctlProviderType (p .provider ))
514
- p .clusterctlProvider .ProviderName = p .provider .GetName ()
515
-
516
- if p .provider .GetStatus ().InstalledVersion != nil {
517
- p .clusterctlProvider .Version = * p .provider .GetStatus ().InstalledVersion
518
- } else {
519
- p .clusterctlProvider .Version = p .options .Version
520
- }
521
-
522
542
err := clusterClient .ProviderComponents ().Delete (ctx , cluster.DeleteOptions {
523
- Provider : * p . clusterctlProvider ,
543
+ Provider : getProvider ( p . provider , p . options . Version ) ,
524
544
IncludeNamespace : false ,
525
545
IncludeCRDs : false ,
526
546
})
@@ -549,7 +569,7 @@ func clusterctlProviderName(provider operatorv1.GenericProvider) client.ObjectKe
549
569
// newClusterClient returns a clusterctl client for interacting with management cluster.
550
570
func (p * phaseReconciler ) newClusterClient () cluster.Client {
551
571
return cluster .New (cluster.Kubeconfig {}, p .configClient , cluster .InjectProxy (& controllerProxy {
552
- ctrlClient : p .ctrlClient ,
572
+ ctrlClient : clientProxy { p .ctrlClient } ,
553
573
ctrlConfig : p .ctrlConfig ,
554
574
}))
555
575
}
0 commit comments