Skip to content

Commit dfe33c2

Browse files
authored
Merge pull request #4953 from serngawy/issue-4936
🐛 ROSA: Fix issue-4936 delete rosaMachinePool and rosaControlPlane
2 parents 604d329 + 204ffd1 commit dfe33c2

File tree

3 files changed

+70
-6
lines changed

3 files changed

+70
-6
lines changed

controlplane/rosa/controllers/rosacontrolplane_controller.go

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import (
5757
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/cloud/scope"
5858
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/logger"
5959
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/rosa"
60+
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/utils"
6061
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
6162
"sigs.k8s.io/cluster-api/util"
6263
capiannotations "sigs.k8s.io/cluster-api/util/annotations"
@@ -316,6 +317,16 @@ func (r *ROSAControlPlaneReconciler) reconcileNormal(ctx context.Context, rosaSc
316317
func (r *ROSAControlPlaneReconciler) reconcileDelete(ctx context.Context, rosaScope *scope.ROSAControlPlaneScope) (res ctrl.Result, reterr error) {
317318
rosaScope.Info("Reconciling ROSAControlPlane delete")
318319

320+
// Deleting MachinePools first.
321+
deleted, err := r.deleteMachinePools(ctx, rosaScope)
322+
if err != nil {
323+
return ctrl.Result{}, err
324+
}
325+
if !deleted {
326+
// Reconcile after 1 min giving time for machinePools to be deleted.
327+
return ctrl.Result{RequeueAfter: time.Minute}, nil
328+
}
329+
319330
ocmClient, err := rosa.NewOCMClient(ctx, rosaScope)
320331
if err != nil {
321332
// TODO: need to expose in status, as likely the credentials are invalid
@@ -332,8 +343,9 @@ func (r *ROSAControlPlaneReconciler) reconcileDelete(ctx context.Context, rosaSc
332343
return ctrl.Result{}, err
333344
}
334345
if cluster == nil {
335-
// cluster is fully deleted, remove finalizer.
346+
// cluster and machinepools are deleted, removing finalizer.
336347
controllerutil.RemoveFinalizer(rosaScope.ControlPlane, ROSAControlPlaneFinalizer)
348+
337349
return ctrl.Result{}, nil
338350
}
339351

@@ -366,6 +378,30 @@ func (r *ROSAControlPlaneReconciler) reconcileDelete(ctx context.Context, rosaSc
366378
return ctrl.Result{RequeueAfter: time.Second * 60}, nil
367379
}
368380

381+
// deleteMachinePools check if the controlplane has related machinePools and delete them.
382+
func (r *ROSAControlPlaneReconciler) deleteMachinePools(ctx context.Context, rosaScope *scope.ROSAControlPlaneScope) (bool, error) {
383+
machinePools, err := utils.GetMachinePools(ctx, rosaScope.Client, rosaScope.Cluster.Name, rosaScope.Cluster.Namespace)
384+
if err != nil {
385+
return false, err
386+
}
387+
388+
var errs []error
389+
for id, mp := range machinePools {
390+
if !mp.DeletionTimestamp.IsZero() {
391+
continue
392+
}
393+
if err = rosaScope.Client.Delete(ctx, &machinePools[id]); err != nil {
394+
errs = append(errs, err)
395+
}
396+
}
397+
398+
if len(errs) > 0 {
399+
return false, kerrors.NewAggregate(errs)
400+
}
401+
402+
return len(machinePools) == 0, nil
403+
}
404+
369405
func (r *ROSAControlPlaneReconciler) reconcileClusterVersion(rosaScope *scope.ROSAControlPlaneScope, ocmClient *ocm.Client, cluster *cmv1.Cluster) error {
370406
version := rosaScope.ControlPlane.Spec.Version
371407
if version == rosa.RawVersionID(cluster.Version()) {

exp/controllers/rosamachinepool_controller.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ func (r *ROSAMachinePoolReconciler) Reconcile(ctx context.Context, req ctrl.Requ
107107
cluster, err := util.GetClusterFromMetadata(ctx, r.Client, machinePool.ObjectMeta)
108108
if err != nil {
109109
log.Info("Failed to retrieve Cluster from MachinePool")
110-
return reconcile.Result{}, nil
110+
return ctrl.Result{}, nil
111111
}
112112

113113
if annotations.IsPaused(cluster, rosaMachinePool) {
@@ -124,7 +124,7 @@ func (r *ROSAMachinePoolReconciler) Reconcile(ctx context.Context, req ctrl.Requ
124124
controlPlane := &rosacontrolplanev1.ROSAControlPlane{}
125125
if err := r.Client.Get(ctx, controlPlaneKey, controlPlane); err != nil {
126126
log.Info("Failed to retrieve ControlPlane from MachinePool")
127-
return reconcile.Result{}, nil
127+
return ctrl.Result{}, err
128128
}
129129

130130
machinePoolScope, err := scope.NewRosaMachinePoolScope(scope.RosaMachinePoolScopeParams{
@@ -138,7 +138,7 @@ func (r *ROSAMachinePoolReconciler) Reconcile(ctx context.Context, req ctrl.Requ
138138
Endpoints: r.Endpoints,
139139
})
140140
if err != nil {
141-
return ctrl.Result{}, errors.Wrap(err, "failed to create scope")
141+
return ctrl.Result{}, errors.Wrap(err, "failed to create rosaMachinePool scope")
142142
}
143143

144144
rosaControlPlaneScope, err := scope.NewROSAControlPlaneScope(scope.ROSAControlPlaneScopeParams{
@@ -149,10 +149,10 @@ func (r *ROSAMachinePoolReconciler) Reconcile(ctx context.Context, req ctrl.Requ
149149
Endpoints: r.Endpoints,
150150
})
151151
if err != nil {
152-
return ctrl.Result{}, errors.Wrap(err, "failed to create control plane scope")
152+
return ctrl.Result{}, errors.Wrap(err, "failed to create rosaControlPlane scope")
153153
}
154154

155-
if !controlPlane.Status.Ready {
155+
if !controlPlane.Status.Ready && controlPlane.ObjectMeta.DeletionTimestamp.IsZero() {
156156
log.Info("Control plane is not ready yet")
157157
err := machinePoolScope.RosaMchinePoolReadyFalse(expinfrav1.WaitingForRosaControlPlaneReason, "")
158158
return ctrl.Result{}, err
@@ -311,6 +311,7 @@ func (r *ROSAMachinePoolReconciler) reconcileDelete(
311311
if err := ocmClient.DeleteNodePool(machinePoolScope.ControlPlane.Status.ID, nodePool.ID()); err != nil {
312312
return err
313313
}
314+
machinePoolScope.Info("Successfully deleted NodePool %s", nodePool.ID())
314315
}
315316

316317
controllerutil.RemoveFinalizer(machinePoolScope.RosaMachinePool, expinfrav1.RosaMachinePoolFinalizer)

pkg/utils/utils.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Package utils has the common functions that can be used for cluster-api-provider-aws repo.
2+
package utils
3+
4+
import (
5+
"context"
6+
"fmt"
7+
8+
crclient "sigs.k8s.io/controller-runtime/pkg/client"
9+
10+
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
11+
expclusterv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
12+
)
13+
14+
// GetMachinePools belong to a cluster.
15+
func GetMachinePools(ctx context.Context, client crclient.Client, clusterName string, clusterNS string) ([]expclusterv1.MachinePool, error) {
16+
machinePoolList := expclusterv1.MachinePoolList{}
17+
listOptions := []crclient.ListOption{
18+
crclient.InNamespace(clusterNS),
19+
crclient.MatchingLabels(map[string]string{clusterv1.ClusterNameLabel: clusterName}),
20+
}
21+
22+
if err := client.List(ctx, &machinePoolList, listOptions...); err != nil {
23+
return []expclusterv1.MachinePool{}, fmt.Errorf("failed to list machine pools for cluster %s: %v", clusterName, err)
24+
}
25+
26+
return machinePoolList.Items, nil
27+
}

0 commit comments

Comments
 (0)