@@ -36,6 +36,7 @@ import (
36
36
"sigs.k8s.io/cluster-api/controllers/remote"
37
37
"sigs.k8s.io/cluster-api/util"
38
38
"sigs.k8s.io/cluster-api/util/annotations"
39
+ "sigs.k8s.io/cluster-api/util/certs"
39
40
"sigs.k8s.io/cluster-api/util/collections"
40
41
"sigs.k8s.io/cluster-api/util/conditions"
41
42
"sigs.k8s.io/cluster-api/util/kubeconfig"
@@ -75,7 +76,7 @@ func (r *TalosControlPlaneReconciler) SetupWithManager(mgr ctrl.Manager, options
75
76
}
76
77
77
78
// +kubebuilder:rbac:groups=core,resources=events,verbs=get;list;watch;create;patch
78
- // +kubebuilder:rbac:groups=core,resources=secrets,verbs=get;list;watch;create;patch
79
+ // +kubebuilder:rbac:groups=core,resources=secrets,verbs=get;list;watch;create;patch;update
79
80
// +kubebuilder:rbac:groups=core,resources=configmaps,namespace=kube-system,verbs=get;list;watch;create
80
81
// +kubebuilder:rbac:groups=rbac,resources=roles,namespace=kube-system,verbs=get;list;watch;create
81
82
// +kubebuilder:rbac:groups=rbac,resources=rolebindings,namespace=kube-system,verbs=get;list;watch;create
@@ -624,7 +625,7 @@ func (r *TalosControlPlaneReconciler) reconcileKubeconfig(ctx context.Context, c
624
625
}
625
626
626
627
clusterName := util .ObjectKey (cluster )
627
- _ , err := secret .GetFromNamespacedName (ctx , r .Client , clusterName , secret .Kubeconfig )
628
+ existingKubeconfig , err := secret .GetFromNamespacedName (ctx , r .Client , clusterName , secret .Kubeconfig )
628
629
switch {
629
630
case apierrors .IsNotFound (err ):
630
631
createErr := kubeconfig .CreateSecretWithOwner (
@@ -644,7 +645,24 @@ func (r *TalosControlPlaneReconciler) reconcileKubeconfig(ctx context.Context, c
644
645
return ctrl.Result {}, createErr
645
646
}
646
647
case err != nil :
647
- return ctrl.Result {RequeueAfter : 20 * time .Second }, errors .Wrapf (err , "failed to retrieve kubeconfig Secret for Cluster %q in namespace %q" , clusterName .Name , clusterName .Namespace )
648
+ return ctrl.Result {RequeueAfter : 20 * time .Second }, fmt .Errorf ("failed to retrieve kubeconfig Secret for Cluster %q in namespace %q: %w" , clusterName .Name , clusterName .Namespace , err )
649
+ default :
650
+ // kubeconfig is already generated
651
+ needsRotation , err := kubeconfig .NeedsClientCertRotation (existingKubeconfig , certs .ClientCertificateRenewalDuration )
652
+ if err != nil {
653
+ return ctrl.Result {}, fmt .Errorf ("failed to figure out if we need to regenerate cluster client cert: %w" , err )
654
+ }
655
+
656
+ if ! needsRotation {
657
+ return ctrl.Result {}, nil
658
+ }
659
+
660
+ r .Log .Info ("kubeconfig certificate rotation" , "secret" , secret .Kubeconfig , "cluster" , clusterName .Name , "namespace" , clusterName .Namespace )
661
+
662
+ err = kubeconfig .RegenerateSecret (ctx , r .Client , existingKubeconfig )
663
+ if err != nil {
664
+ return ctrl.Result {}, fmt .Errorf ("failed to regenerate kubeconfig: %w" , err )
665
+ }
648
666
}
649
667
650
668
return ctrl.Result {}, nil
0 commit comments