Skip to content

Commit c1764a9

Browse files
authored
Merge pull request #5383 from theobarberbany/paused-condition
✨ Set Paused condition on reconciled resources status upon reconciliation being paused
2 parents d9b0e24 + ff89188 commit c1764a9

12 files changed

+304
-37
lines changed

bootstrap/eks/controllers/eksconfig_controller.go

+4-5
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@ import (
4040
"sigs.k8s.io/cluster-api-provider-aws/v2/bootstrap/eks/internal/userdata"
4141
ekscontrolplanev1 "sigs.k8s.io/cluster-api-provider-aws/v2/controlplane/eks/api/v1beta2"
4242
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/logger"
43+
"sigs.k8s.io/cluster-api-provider-aws/v2/util/paused"
4344
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
4445
bsutil "sigs.k8s.io/cluster-api/bootstrap/util"
4546
expclusterv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
4647
"sigs.k8s.io/cluster-api/feature"
4748
"sigs.k8s.io/cluster-api/util"
48-
"sigs.k8s.io/cluster-api/util/annotations"
4949
"sigs.k8s.io/cluster-api/util/conditions"
5050
"sigs.k8s.io/cluster-api/util/patch"
5151
"sigs.k8s.io/cluster-api/util/predicates"
@@ -113,9 +113,8 @@ func (r *EKSConfigReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
113113
}
114114
log = log.WithValues("cluster", klog.KObj(cluster))
115115

116-
if annotations.IsPaused(cluster, config) {
117-
log.Info("Reconciliation is paused for this object")
118-
return ctrl.Result{}, nil
116+
if isPaused, conditionChanged, err := paused.EnsurePausedCondition(ctx, r.Client, cluster, config); err != nil || isPaused || conditionChanged {
117+
return ctrl.Result{}, err
119118
}
120119

121120
patchHelper, err := patch.NewHelper(config, r.Client)
@@ -294,7 +293,7 @@ func (r *EKSConfigReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Man
294293
b := ctrl.NewControllerManagedBy(mgr).
295294
For(&eksbootstrapv1.EKSConfig{}).
296295
WithOptions(option).
297-
WithEventFilter(predicates.ResourceNotPausedAndHasFilterLabel(mgr.GetScheme(), logger.FromContext(ctx).GetLogger(), r.WatchFilterValue)).
296+
WithEventFilter(predicates.ResourceHasFilterLabel(mgr.GetScheme(), logger.FromContext(ctx).GetLogger(), r.WatchFilterValue)).
298297
Watches(
299298
&clusterv1.Machine{},
300299
handler.EnqueueRequestsFromMapFunc(r.MachineToBootstrapMapFunc),

controllers/awscluster_controller.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import (
5151
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/services/securitygroup"
5252
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/logger"
5353
infrautilconditions "sigs.k8s.io/cluster-api-provider-aws/v2/util/conditions"
54+
"sigs.k8s.io/cluster-api-provider-aws/v2/util/paused"
5455
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
5556
"sigs.k8s.io/cluster-api/util"
5657
capiannotations "sigs.k8s.io/cluster-api/util/annotations"
@@ -167,9 +168,8 @@ func (r *AWSClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request)
167168

168169
log = log.WithValues("cluster", klog.KObj(cluster))
169170

170-
if capiannotations.IsPaused(cluster, awsCluster) {
171-
log.Info("AWSCluster or linked Cluster is marked as paused. Won't reconcile")
172-
return reconcile.Result{}, nil
171+
if isPaused, conditionChanged, err := paused.EnsurePausedCondition(ctx, r.Client, cluster, cluster); err != nil || isPaused || conditionChanged {
172+
return ctrl.Result{}, err
173173
}
174174

175175
// Create the scope.
@@ -392,7 +392,7 @@ func (r *AWSClusterReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Ma
392392
controller, err := ctrl.NewControllerManagedBy(mgr).
393393
WithOptions(options).
394394
For(&infrav1.AWSCluster{}).
395-
WithEventFilter(predicates.ResourceNotPausedAndHasFilterLabel(mgr.GetScheme(), log.GetLogger(), r.WatchFilterValue)).
395+
WithEventFilter(predicates.ResourceHasFilterLabel(mgr.GetScheme(), log.GetLogger(), r.WatchFilterValue)).
396396
WithEventFilter(
397397
predicate.Funcs{
398398
// Avoid reconciling if the event triggering the reconciliation is related to incremental status updates

controllers/awsmachine_controller.go

+6-7
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ import (
5959
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/services/ssm"
6060
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/services/userdata"
6161
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/logger"
62+
"sigs.k8s.io/cluster-api-provider-aws/v2/util/paused"
6263
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
6364
"sigs.k8s.io/cluster-api/util"
64-
"sigs.k8s.io/cluster-api/util/annotations"
6565
"sigs.k8s.io/cluster-api/util/conditions"
6666
"sigs.k8s.io/cluster-api/util/predicates"
6767
)
@@ -183,11 +183,6 @@ func (r *AWSMachineReconciler) Reconcile(ctx context.Context, req ctrl.Request)
183183
return ctrl.Result{}, nil
184184
}
185185

186-
if annotations.IsPaused(cluster, awsMachine) {
187-
log.Info("AWSMachine or linked Cluster is marked as paused. Won't reconcile")
188-
return ctrl.Result{}, nil
189-
}
190-
191186
log = log.WithValues("cluster", klog.KObj(cluster))
192187

193188
infraCluster, err := r.getInfraCluster(ctx, log, cluster, awsMachine)
@@ -201,6 +196,10 @@ func (r *AWSMachineReconciler) Reconcile(ctx context.Context, req ctrl.Request)
201196

202197
infrav1.SetDefaults_AWSMachineSpec(&awsMachine.Spec)
203198

199+
if isPaused, conditionChanged, err := paused.EnsurePausedCondition(ctx, r.Client, cluster, awsMachine); err != nil || isPaused || conditionChanged {
200+
return ctrl.Result{}, err
201+
}
202+
204203
// Create the machine scope
205204
machineScope, err := scope.NewMachineScope(scope.MachineScopeParams{
206205
Client: r.Client,
@@ -254,7 +253,7 @@ func (r *AWSMachineReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Ma
254253
&infrav1.AWSCluster{},
255254
handler.EnqueueRequestsFromMapFunc(AWSClusterToAWSMachines),
256255
).
257-
WithEventFilter(predicates.ResourceNotPausedAndHasFilterLabel(mgr.GetScheme(), log.GetLogger(), r.WatchFilterValue)).
256+
WithEventFilter(predicates.ResourceHasFilterLabel(mgr.GetScheme(), log.GetLogger(), r.WatchFilterValue)).
258257
WithEventFilter(
259258
predicate.Funcs{
260259
// Avoid reconciling if the event triggering the reconciliation is related to incremental status updates

controllers/awsmachine_controller_unit_test.go

+13-2
Original file line numberDiff line numberDiff line change
@@ -2356,8 +2356,10 @@ func TestAWSMachineReconcilerReconcile(t *testing.T) {
23562356
ClusterName: "capi-test",
23572357
},
23582358
},
2359-
ownerCluster: &clusterv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "capi-test-1"}},
2360-
expectError: false,
2359+
ownerCluster: &clusterv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "capi-test-1"}, Spec: clusterv1.ClusterSpec{
2360+
InfrastructureRef: &corev1.ObjectReference{Name: "foo"},
2361+
}},
2362+
expectError: false,
23612363
},
23622364
{
23632365
name: "Should not Reconcile if AWSManagedControlPlane is not ready",
@@ -2643,6 +2645,15 @@ func TestAWSMachineReconcilerReconcileDefaultsToLoadBalancerTypeClassic(t *testi
26432645
SecretCount: 1000,
26442646
},
26452647
},
2648+
Status: infrav1.AWSMachineStatus{
2649+
Conditions: clusterv1.Conditions{
2650+
{
2651+
Type: "Paused",
2652+
Status: corev1.ConditionFalse,
2653+
Reason: "NotPaused",
2654+
},
2655+
},
2656+
},
26462657
}
26472658

26482659
controllerIdentity := &infrav1.AWSClusterControllerIdentity{

controlplane/eks/controllers/awsmanagedcontrolplane_controller.go

+4-5
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ import (
5151
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/services/network"
5252
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/services/securitygroup"
5353
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/logger"
54+
"sigs.k8s.io/cluster-api-provider-aws/v2/util/paused"
5455
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
5556
"sigs.k8s.io/cluster-api/util"
56-
capiannotations "sigs.k8s.io/cluster-api/util/annotations"
5757
"sigs.k8s.io/cluster-api/util/conditions"
5858
"sigs.k8s.io/cluster-api/util/predicates"
5959
)
@@ -169,7 +169,7 @@ func (r *AWSManagedControlPlaneReconciler) SetupWithManager(ctx context.Context,
169169
c, err := ctrl.NewControllerManagedBy(mgr).
170170
For(awsManagedControlPlane).
171171
WithOptions(options).
172-
WithEventFilter(predicates.ResourceNotPausedAndHasFilterLabel(mgr.GetScheme(), log.GetLogger(), r.WatchFilterValue)).
172+
WithEventFilter(predicates.ResourceHasFilterLabel(mgr.GetScheme(), log.GetLogger(), r.WatchFilterValue)).
173173
Build(r)
174174

175175
if err != nil {
@@ -237,9 +237,8 @@ func (r *AWSManagedControlPlaneReconciler) Reconcile(ctx context.Context, req ct
237237

238238
log = log.WithValues("cluster", klog.KObj(cluster))
239239

240-
if capiannotations.IsPaused(cluster, awsManagedControlPlane) {
241-
log.Info("Reconciliation is paused for this object")
242-
return ctrl.Result{}, nil
240+
if isPaused, conditionChanged, err := paused.EnsurePausedCondition(ctx, r.Client, cluster, awsManagedControlPlane); err != nil || isPaused || conditionChanged {
241+
return ctrl.Result{}, err
243242
}
244243

245244
managedScope, err := scope.NewManagedControlPlaneScope(scope.ManagedControlPlaneScopeParams{

controlplane/eks/controllers/awsmanagedcontrolplane_controller_test.go

+16
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
"github.com/aws/aws-sdk-go/service/sts"
3535
"github.com/golang/mock/gomock"
3636
. "github.com/onsi/gomega"
37+
corev1 "k8s.io/api/core/v1"
3738
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3839
"k8s.io/client-go/tools/record"
3940
ctrl "sigs.k8s.io/controller-runtime"
@@ -53,7 +54,9 @@ import (
5354
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/services/s3/mock_stsiface"
5455
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/services/securitygroup"
5556
"sigs.k8s.io/cluster-api-provider-aws/v2/test/mocks"
57+
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
5658
"sigs.k8s.io/cluster-api/util"
59+
"sigs.k8s.io/cluster-api/util/patch"
5760
)
5861

5962
func TestAWSManagedControlPlaneReconcilerIntegrationTests(t *testing.T) {
@@ -147,6 +150,19 @@ func TestAWSManagedControlPlaneReconcilerIntegrationTests(t *testing.T) {
147150
g.Expect(testEnv.Cleanup(ctx, &cluster, &awsManagedCluster, &awsManagedControlPlane, controllerIdentity, ns)).To(Succeed())
148151
})
149152

153+
// patch the paused condition
154+
awsManagedControlPlanePatcher, err := patch.NewHelper(&awsManagedControlPlane, testEnv)
155+
awsManagedControlPlane.Status.Conditions = clusterv1.Conditions{
156+
{
157+
Type: "Paused",
158+
Status: corev1.ConditionFalse,
159+
Reason: "NotPaused",
160+
},
161+
}
162+
163+
g.Expect(awsManagedControlPlanePatcher.Patch(ctx, &awsManagedControlPlane)).To(Succeed())
164+
g.Expect(err).ShouldNot(HaveOccurred())
165+
150166
managedScope := getAWSManagedControlPlaneScope(&cluster, &awsManagedControlPlane)
151167

152168
reconciler.awsNodeServiceFactory = func(scope scope.AWSNodeScope) services.AWSNodeInterface {

controlplane/rosa/controllers/rosacontrolplane_controller.go

+4-5
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ import (
6565
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/logger"
6666
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/rosa"
6767
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/utils"
68+
"sigs.k8s.io/cluster-api-provider-aws/v2/util/paused"
6869
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
6970
"sigs.k8s.io/cluster-api/util"
70-
capiannotations "sigs.k8s.io/cluster-api/util/annotations"
7171
"sigs.k8s.io/cluster-api/util/conditions"
7272
"sigs.k8s.io/cluster-api/util/kubeconfig"
7373
"sigs.k8s.io/cluster-api/util/predicates"
@@ -106,7 +106,7 @@ func (r *ROSAControlPlaneReconciler) SetupWithManager(ctx context.Context, mgr c
106106
c, err := ctrl.NewControllerManagedBy(mgr).
107107
For(rosaControlPlane).
108108
WithOptions(options).
109-
WithEventFilter(predicates.ResourceNotPausedAndHasFilterLabel(mgr.GetScheme(), log.GetLogger(), r.WatchFilterValue)).
109+
WithEventFilter(predicates.ResourceHasFilterLabel(mgr.GetScheme(), log.GetLogger(), r.WatchFilterValue)).
110110
Build(r)
111111

112112
if err != nil {
@@ -168,9 +168,8 @@ func (r *ROSAControlPlaneReconciler) Reconcile(ctx context.Context, req ctrl.Req
168168

169169
log = log.WithValues("cluster", klog.KObj(cluster))
170170

171-
if capiannotations.IsPaused(cluster, rosaControlPlane) {
172-
log.Info("Reconciliation is paused for this object")
173-
return ctrl.Result{}, nil
171+
if isPaused, conditionChanged, err := paused.EnsurePausedCondition(ctx, r.Client, cluster, rosaControlPlane); err != nil || isPaused || conditionChanged {
172+
return ctrl.Result{}, err
174173
}
175174

176175
rosaScope, err := scope.NewROSAControlPlaneScope(scope.ROSAControlPlaneScopeParams{

exp/controllers/awsmanagedmachinepool_controller.go

+4-5
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@ import (
4141
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/services/ec2"
4242
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/services/eks"
4343
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/logger"
44+
"sigs.k8s.io/cluster-api-provider-aws/v2/util/paused"
4445
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
4546
expclusterv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
4647
"sigs.k8s.io/cluster-api/util"
47-
"sigs.k8s.io/cluster-api/util/annotations"
4848
"sigs.k8s.io/cluster-api/util/conditions"
4949
"sigs.k8s.io/cluster-api/util/predicates"
5050
)
@@ -72,7 +72,7 @@ func (r *AWSManagedMachinePoolReconciler) SetupWithManager(ctx context.Context,
7272
return ctrl.NewControllerManagedBy(mgr).
7373
For(&expinfrav1.AWSManagedMachinePool{}).
7474
WithOptions(options).
75-
WithEventFilter(predicates.ResourceNotPausedAndHasFilterLabel(mgr.GetScheme(), log.GetLogger(), r.WatchFilterValue)).
75+
WithEventFilter(predicates.ResourceHasFilterLabel(mgr.GetScheme(), log.GetLogger(), r.WatchFilterValue)).
7676
Watches(
7777
&expclusterv1.MachinePool{},
7878
handler.EnqueueRequestsFromMapFunc(machinePoolToInfrastructureMapFunc(gvk)),
@@ -120,9 +120,8 @@ func (r *AWSManagedMachinePoolReconciler) Reconcile(ctx context.Context, req ctr
120120
return reconcile.Result{}, nil
121121
}
122122

123-
if annotations.IsPaused(cluster, awsPool) {
124-
log.Info("Reconciliation is paused for this object")
125-
return ctrl.Result{}, nil
123+
if isPaused, conditionChanged, err := paused.EnsurePausedCondition(ctx, r.Client, cluster, awsPool); err != nil || isPaused || conditionChanged {
124+
return ctrl.Result{}, err
126125
}
127126

128127
log = log.WithValues("cluster", klog.KObj(cluster))

exp/controllers/rosamachinepool_controller.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import (
3737
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/scope"
3838
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/logger"
3939
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/rosa"
40+
"sigs.k8s.io/cluster-api-provider-aws/v2/util/paused"
4041
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
4142
expclusterv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
4243
"sigs.k8s.io/cluster-api/util"
@@ -69,7 +70,7 @@ func (r *ROSAMachinePoolReconciler) SetupWithManager(ctx context.Context, mgr ct
6970
return ctrl.NewControllerManagedBy(mgr).
7071
For(&expinfrav1.ROSAMachinePool{}).
7172
WithOptions(options).
72-
WithEventFilter(predicates.ResourceNotPausedAndHasFilterLabel(mgr.GetScheme(), log.GetLogger(), r.WatchFilterValue)).
73+
WithEventFilter(predicates.ResourceHasFilterLabel(mgr.GetScheme(), log.GetLogger(), r.WatchFilterValue)).
7374
Watches(
7475
&expclusterv1.MachinePool{},
7576
handler.EnqueueRequestsFromMapFunc(machinePoolToInfrastructureMapFunc(gvk)),
@@ -118,9 +119,8 @@ func (r *ROSAMachinePoolReconciler) Reconcile(ctx context.Context, req ctrl.Requ
118119
return ctrl.Result{}, nil
119120
}
120121

121-
if annotations.IsPaused(cluster, rosaMachinePool) {
122-
log.Info("Reconciliation is paused for this object")
123-
return ctrl.Result{}, nil
122+
if isPaused, conditionChanged, err := paused.EnsurePausedCondition(ctx, r.Client, cluster, rosaMachinePool); err != nil || isPaused || conditionChanged {
123+
return ctrl.Result{}, err
124124
}
125125

126126
log = log.WithValues("cluster", klog.KObj(cluster))

exp/controllers/rosamachinepool_controller_test.go

+14
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,20 @@ func TestRosaMachinePoolReconcile(t *testing.T) {
372372
cp.Status.Ready = true
373373
g.Expect(mpPh.Patch(ctx, cp)).To(Succeed())
374374
g.Expect(err).ShouldNot(HaveOccurred())
375+
376+
// patch status conditions
377+
rmpPh, err := patch.NewHelper(test.old, testEnv)
378+
test.old.Status.Conditions = clusterv1.Conditions{
379+
{
380+
Type: "Paused",
381+
Status: corev1.ConditionFalse,
382+
Reason: "NotPaused",
383+
},
384+
}
385+
386+
g.Expect(rmpPh.Patch(ctx, test.old)).To(Succeed())
387+
g.Expect(err).ShouldNot(HaveOccurred())
388+
375389
// patching is not reliably synchronous
376390
time.Sleep(50 * time.Millisecond)
377391

0 commit comments

Comments
 (0)