Skip to content

Commit ff89188

Browse files
Sets paused condition on CAPA resources
Sets paused condition on AWSMachine Sets paused on AWSCluster Sets paused condition on AWSManagedMachinePool Sets paused condition for ROSAMachinePool Sets paused condition for ROSAControlPlane Sets paused condition on AWSManagedControlPlane Sets paused condition on EKSConfig Adds paused helper functions This change adds the paused helper utilities from upstream cluster api. It modifies them to not require v1beta2conditions. This is so we can use similar code until the conditions changes are out of beta.
1 parent 084f726 commit ff89188

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)