@@ -18,12 +18,20 @@ package controllers
1818
1919import (
2020 "context"
21+ "fmt"
2122
23+ infracontroller "sigs.k8s.io/cluster-api-provider-azure/controllers"
2224 infrav1exp "sigs.k8s.io/cluster-api-provider-azure/exp/api/v1alpha1"
2325 "sigs.k8s.io/cluster-api-provider-azure/util/tele"
26+ clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
27+ "sigs.k8s.io/cluster-api/util"
28+ "sigs.k8s.io/cluster-api/util/annotations"
29+ "sigs.k8s.io/cluster-api/util/patch"
2430 "sigs.k8s.io/cluster-api/util/predicates"
2531 ctrl "sigs.k8s.io/controller-runtime"
32+ "sigs.k8s.io/controller-runtime/pkg/builder"
2633 "sigs.k8s.io/controller-runtime/pkg/client"
34+ "sigs.k8s.io/controller-runtime/pkg/handler"
2735)
2836
2937// AzureASOManagedClusterReconciler reconciles a AzureASOManagedCluster object.
@@ -34,7 +42,7 @@ type AzureASOManagedClusterReconciler struct {
3442
3543// SetupWithManager sets up the controller with the Manager.
3644func (r * AzureASOManagedClusterReconciler ) SetupWithManager (ctx context.Context , mgr ctrl.Manager ) error {
37- _ , log , done := tele .StartSpanWithLogger (ctx ,
45+ ctx , log , done := tele .StartSpanWithLogger (ctx ,
3846 "controllers.AzureASOManagedClusterReconciler.SetupWithManager" ,
3947 tele .KVP ("controller" , infrav1exp .AzureASOManagedClusterKind ),
4048 )
@@ -43,6 +51,18 @@ func (r *AzureASOManagedClusterReconciler) SetupWithManager(ctx context.Context,
4351 _ , err := ctrl .NewControllerManagedBy (mgr ).
4452 For (& infrav1exp.AzureASOManagedCluster {}).
4553 WithEventFilter (predicates .ResourceHasFilterLabel (log , r .WatchFilterValue )).
54+ WithEventFilter (predicates .ResourceIsNotExternallyManaged (log )).
55+ // Watch clusters for pause/unpause notifications
56+ Watches (
57+ & clusterv1.Cluster {},
58+ handler .EnqueueRequestsFromMapFunc (
59+ util .ClusterToInfrastructureMapFunc (ctx , infrav1exp .GroupVersion .WithKind (infrav1exp .AzureASOManagedClusterKind ), mgr .GetClient (), & infrav1exp.AzureASOManagedCluster {}),
60+ ),
61+ builder .WithPredicates (
62+ predicates .ResourceHasFilterLabel (log , r .WatchFilterValue ),
63+ infracontroller .ClusterUpdatePauseChange (log ),
64+ ),
65+ ).
4666 Build (r )
4767 if err != nil {
4868 return err
@@ -57,5 +77,81 @@ func (r *AzureASOManagedClusterReconciler) SetupWithManager(ctx context.Context,
5777
5878// Reconcile reconciles an AzureASOManagedCluster.
5979func (r * AzureASOManagedClusterReconciler ) Reconcile (ctx context.Context , req ctrl.Request ) (result ctrl.Result , resultErr error ) {
80+ ctx , _ , done := tele .StartSpanWithLogger (ctx ,
81+ "controllers.AzureASOManagedClusterReconciler.Reconcile" ,
82+ tele .KVP ("namespace" , req .Namespace ),
83+ tele .KVP ("name" , req .Name ),
84+ tele .KVP ("kind" , infrav1exp .AzureASOManagedClusterKind ),
85+ )
86+ defer done ()
87+
88+ asoManagedCluster := & infrav1exp.AzureASOManagedCluster {}
89+ err := r .Get (ctx , req .NamespacedName , asoManagedCluster )
90+ if err != nil {
91+ return ctrl.Result {}, client .IgnoreNotFound (err )
92+ }
93+
94+ patchHelper , err := patch .NewHelper (asoManagedCluster , r .Client )
95+ if err != nil {
96+ return ctrl.Result {}, fmt .Errorf ("failed to create patch helper: %w" , err )
97+ }
98+ defer func () {
99+ err := patchHelper .Patch (ctx , asoManagedCluster )
100+ if err != nil && resultErr == nil {
101+ resultErr = err
102+ result = ctrl.Result {}
103+ }
104+ }()
105+
106+ cluster , err := util .GetOwnerCluster (ctx , r .Client , asoManagedCluster .ObjectMeta )
107+ if err != nil {
108+ return ctrl.Result {}, err
109+ }
110+
111+ if cluster != nil && cluster .Spec .Paused ||
112+ annotations .HasPaused (asoManagedCluster ) {
113+ return r .reconcilePaused (ctx , asoManagedCluster , cluster )
114+ }
115+
116+ if ! asoManagedCluster .GetDeletionTimestamp ().IsZero () {
117+ return r .reconcileDelete (ctx , asoManagedCluster )
118+ }
119+
120+ return r .reconcileNormal (ctx , asoManagedCluster , cluster )
121+ }
122+
123+ //nolint:unparam // these parameters will be used soon enough
124+ func (r * AzureASOManagedClusterReconciler ) reconcileNormal (ctx context.Context , asoManagedCluster * infrav1exp.AzureASOManagedCluster , cluster * clusterv1.Cluster ) (ctrl.Result , error ) {
125+ //nolint:all // ctx will be used soon
126+ ctx , log , done := tele .StartSpanWithLogger (ctx ,
127+ "controllers.AzureASOManagedClusterReconciler.reconcileNormal" ,
128+ )
129+ defer done ()
130+ log .V (4 ).Info ("reconciling normally" )
131+
132+ return ctrl.Result {}, nil
133+ }
134+
135+ //nolint:unparam // these parameters will be used soon enough
136+ func (r * AzureASOManagedClusterReconciler ) reconcilePaused (ctx context.Context , asoManagedCluster * infrav1exp.AzureASOManagedCluster , cluster * clusterv1.Cluster ) (ctrl.Result , error ) {
137+ //nolint:all // ctx will be used soon
138+ ctx , log , done := tele .StartSpanWithLogger (ctx ,
139+ "controllers.AzureASOManagedClusterReconciler.reconcilePaused" ,
140+ )
141+ defer done ()
142+ log .V (4 ).Info ("reconciling pause" )
143+
144+ return ctrl.Result {}, nil
145+ }
146+
147+ //nolint:unparam // these parameters will be used soon enough
148+ func (r * AzureASOManagedClusterReconciler ) reconcileDelete (ctx context.Context , asoManagedCluster * infrav1exp.AzureASOManagedCluster ) (ctrl.Result , error ) {
149+ //nolint:all // ctx will be used soon
150+ ctx , log , done := tele .StartSpanWithLogger (ctx ,
151+ "controllers.AzureASOManagedClusterReconciler.reconcileDelete" ,
152+ )
153+ defer done ()
154+ log .V (4 ).Info ("reconciling delete" )
155+
60156 return ctrl.Result {}, nil
61157}
0 commit comments