@@ -22,6 +22,9 @@ import (
2222 "fmt"
2323
2424 asocontainerservicev1 "github.com/Azure/azure-service-operator/v2/api/containerservice/v1api20231001"
25+ "github.com/Azure/azure-service-operator/v2/pkg/genruntime"
26+ corev1 "k8s.io/api/core/v1"
27+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2528 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2629 infracontroller "sigs.k8s.io/cluster-api-provider-azure/controllers"
2730 infrav1exp "sigs.k8s.io/cluster-api-provider-azure/exp/api/v1alpha1"
@@ -32,6 +35,7 @@ import (
3235 "sigs.k8s.io/cluster-api/util/annotations"
3336 "sigs.k8s.io/cluster-api/util/patch"
3437 "sigs.k8s.io/cluster-api/util/predicates"
38+ "sigs.k8s.io/cluster-api/util/secret"
3539 ctrl "sigs.k8s.io/controller-runtime"
3640 "sigs.k8s.io/controller-runtime/pkg/builder"
3741 "sigs.k8s.io/controller-runtime/pkg/client"
@@ -68,6 +72,7 @@ func (r *AzureASOManagedControlPlaneReconciler) SetupWithManager(ctx context.Con
6872 infracontroller .ClusterPauseChangeAndInfrastructureReady (log ),
6973 ),
7074 ).
75+ Owns (& corev1.Secret {}).
7176 Build (r )
7277 if err != nil {
7378 return err
@@ -210,9 +215,58 @@ func (r *AzureASOManagedControlPlaneReconciler) reconcileNormal(ctx context.Cont
210215 asoManagedControlPlane .Status .Version = "v" + * managedCluster .Status .CurrentKubernetesVersion
211216 }
212217
218+ err = r .reconcileKubeconfig (ctx , asoManagedControlPlane , cluster , managedCluster )
219+ if err != nil {
220+ return ctrl.Result {}, fmt .Errorf ("failed to reconcile kubeconfig: %w" , err )
221+ }
222+
213223 return ctrl.Result {}, nil
214224}
215225
226+ func (r * AzureASOManagedControlPlaneReconciler ) reconcileKubeconfig (ctx context.Context , asoManagedControlPlane * infrav1exp.AzureASOManagedControlPlane , cluster * clusterv1.Cluster , managedCluster * asocontainerservicev1.ManagedCluster ) error {
227+ ctx , _ , done := tele .StartSpanWithLogger (ctx ,
228+ "controllers.AzureASOManagedControlPlaneReconciler.reconcileKubeconfig" ,
229+ )
230+ defer done ()
231+
232+ var secretRef * genruntime.SecretDestination
233+ if managedCluster .Spec .OperatorSpec != nil &&
234+ managedCluster .Spec .OperatorSpec .Secrets != nil {
235+ secretRef = managedCluster .Spec .OperatorSpec .Secrets .UserCredentials
236+ if managedCluster .Spec .OperatorSpec .Secrets .AdminCredentials != nil {
237+ secretRef = managedCluster .Spec .OperatorSpec .Secrets .AdminCredentials
238+ }
239+ }
240+ if secretRef == nil {
241+ return reconcile .TerminalError (fmt .Errorf ("ManagedCluster must define at least one of spec.operatorSpec.secrets.{userCredentials,adminCredentials}" ))
242+ }
243+ asoKubeconfig := & corev1.Secret {}
244+ err := r .Get (ctx , client.ObjectKey {Namespace : cluster .Namespace , Name : secretRef .Name }, asoKubeconfig )
245+ if err != nil {
246+ return fmt .Errorf ("failed to fetch secret created by ASO: %w" , err )
247+ }
248+
249+ expectedSecret := & corev1.Secret {
250+ TypeMeta : metav1.TypeMeta {
251+ APIVersion : corev1 .SchemeGroupVersion .Identifier (),
252+ Kind : "Secret" ,
253+ },
254+ ObjectMeta : metav1.ObjectMeta {
255+ Name : secret .Name (cluster .Name , secret .Kubeconfig ),
256+ Namespace : cluster .Namespace ,
257+ OwnerReferences : []metav1.OwnerReference {
258+ * metav1 .NewControllerRef (asoManagedControlPlane , infrav1exp .GroupVersion .WithKind (infrav1exp .AzureASOManagedControlPlaneKind )),
259+ },
260+ Labels : map [string ]string {clusterv1 .ClusterNameLabel : cluster .Name },
261+ },
262+ Data : map [string ][]byte {
263+ secret .KubeconfigDataName : asoKubeconfig .Data [secretRef .Key ],
264+ },
265+ }
266+
267+ return r .Patch (ctx , expectedSecret , client .Apply , client .FieldOwner ("capz-manager" ), client .ForceOwnership )
268+ }
269+
216270//nolint:unparam // these parameters will be used soon enough
217271func (r * AzureASOManagedControlPlaneReconciler ) reconcilePaused (ctx context.Context , asoManagedControlPlane * infrav1exp.AzureASOManagedControlPlane , cluster * clusterv1.Cluster ) (ctrl.Result , error ) {
218272 //nolint:all // ctx will be used soon
0 commit comments