Skip to content

Commit 6da8906

Browse files
committed
Issue-10544 ignore unreachable cluster while deleting machinePool
Signed-off-by: melserngawy <[email protected]>
1 parent e1a701f commit 6da8906

File tree

2 files changed

+44
-19
lines changed

2 files changed

+44
-19
lines changed

exp/internal/controllers/machinepool_controller.go

+37-18
Original file line numberDiff line numberDiff line change
@@ -253,33 +253,52 @@ func (r *MachinePoolReconciler) reconcile(ctx context.Context, cluster *clusterv
253253
return res, kerrors.NewAggregate(errs)
254254
}
255255

256-
func (r *MachinePoolReconciler) reconcileDelete(ctx context.Context, cluster *clusterv1.Cluster, mp *expv1.MachinePool) error {
257-
if ok, err := r.reconcileDeleteExternal(ctx, mp); !ok || err != nil {
258-
// Return early and don't remove the finalizer if we got an error or
259-
// the external reconciliation deletion isn't ready.
260-
return err
261-
}
256+
func (r *MachinePoolReconciler) reconcileDelete(ctx context.Context, cluster *clusterv1.Cluster, machinepool *expv1.MachinePool) error {
257+
deleteAllowed, clusterClient, err := r.isDeleteMachinePoolAllowed(ctx, cluster)
258+
259+
// Check for cluster allowing delete or machinePool delete timeout.
260+
if deleteAllowed || r.isMachinePoolDeleteTimeoutPassed(machinepool) {
261+
if ok, err := r.reconcileDeleteExternal(ctx, machinepool); !ok || err != nil {
262+
// Return early and don't remove the finalizer if we got an error or
263+
// the external reconciliation deletion isn't ready.
264+
return err
265+
}
262266

263-
if err := r.reconcileDeleteNodes(ctx, cluster, mp); err != nil {
264-
// Return early and don't remove the finalizer if we got an error.
265-
return err
267+
// Delete nodes when cluster accessor available & there are nodes to delete.
268+
if len(machinepool.Status.NodeRefs) > 0 && clusterClient != nil {
269+
if err = r.deleteRetiredNodes(ctx, clusterClient, machinepool.Status.NodeRefs, machinepool.Spec.ProviderIDList); err != nil {
270+
return err
271+
}
272+
}
273+
// Remove finalizer to delete the resource.
274+
controllerutil.RemoveFinalizer(machinepool, expv1.MachinePoolFinalizer)
275+
276+
return nil
266277
}
267278

268-
controllerutil.RemoveFinalizer(mp, expv1.MachinePoolFinalizer)
269-
return nil
279+
return err
270280
}
271281

272-
func (r *MachinePoolReconciler) reconcileDeleteNodes(ctx context.Context, cluster *clusterv1.Cluster, machinepool *expv1.MachinePool) error {
273-
if len(machinepool.Status.NodeRefs) == 0 {
274-
return nil
282+
// isMachinePoolDeleteTimeoutPassed check the machinePool node delete time out.
283+
func (r *MachinePoolReconciler) isMachinePoolDeleteTimeoutPassed(machinepool *expv1.MachinePool) bool {
284+
if !machinepool.DeletionTimestamp.IsZero() {
285+
return machinepool.DeletionTimestamp.Add(machinepool.Spec.Template.Spec.NodeDeletionTimeout.Duration).After(time.Now())
275286
}
287+
return false
288+
}
276289

277-
clusterClient, err := r.Tracker.GetClient(ctx, util.ObjectKey(cluster))
278-
if err != nil {
279-
return err
290+
// isDeleteMachinePoolAllowed check the cluster status and target cluster client accessor state.
291+
func (r *MachinePoolReconciler) isDeleteMachinePoolAllowed(ctx context.Context, cluster *clusterv1.Cluster) (bool, client.Client, error) {
292+
// Check if cluster is been deleted
293+
if !cluster.DeletionTimestamp.IsZero() {
294+
// return true when cluster is been deleted to delete external resources and skip delete nodes refs.
295+
return true, nil, nil
280296
}
281297

282-
return r.deleteRetiredNodes(ctx, clusterClient, machinepool.Status.NodeRefs, machinepool.Spec.ProviderIDList)
298+
// Check if the target cluster client is reachable.
299+
clusterClient, err := r.Tracker.GetClient(ctx, util.ObjectKey(cluster))
300+
301+
return err == nil, clusterClient, err
283302
}
284303

285304
// reconcileDeleteExternal tries to delete external references, returning true if it cannot find any.

exp/internal/controllers/machinepool_controller_test.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package controllers
1818

1919
import (
20+
"context"
2021
"testing"
2122

2223
. "github.com/onsi/gomega"
@@ -31,6 +32,7 @@ import (
3132
"sigs.k8s.io/controller-runtime/pkg/reconcile"
3233

3334
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
35+
"sigs.k8s.io/cluster-api/controllers/remote"
3436
expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
3537
"sigs.k8s.io/cluster-api/internal/test/builder"
3638
"sigs.k8s.io/cluster-api/util"
@@ -426,6 +428,7 @@ func TestReconcileMachinePoolRequest(t *testing.T) {
426428
r := &MachinePoolReconciler{
427429
Client: clientFake,
428430
APIReader: clientFake,
431+
Tracker: remote.NewTestClusterCacheTracker(ctrl.LoggerFrom(context.TODO()), clientFake, clientFake, clientFake.Scheme(), client.ObjectKey{Name: testCluster.Name, Namespace: testCluster.Namespace}),
429432
}
430433

431434
result, err := r.Reconcile(ctx, reconcile.Request{NamespacedName: util.ObjectKey(&tc.machinePool)})
@@ -591,8 +594,10 @@ func TestRemoveMachinePoolFinalizerAfterDeleteReconcile(t *testing.T) {
591594
},
592595
}
593596
key := client.ObjectKey{Namespace: m.Namespace, Name: m.Name}
597+
clientFake := fake.NewClientBuilder().WithObjects(testCluster, m).WithStatusSubresource(&expv1.MachinePool{}).Build()
594598
mr := &MachinePoolReconciler{
595-
Client: fake.NewClientBuilder().WithObjects(testCluster, m).WithStatusSubresource(&expv1.MachinePool{}).Build(),
599+
Client: clientFake,
600+
Tracker: remote.NewTestClusterCacheTracker(ctrl.LoggerFrom(context.TODO()), clientFake, clientFake, clientFake.Scheme(), client.ObjectKey{Name: testCluster.Name, Namespace: testCluster.Namespace}),
596601
}
597602
_, err := mr.Reconcile(ctx, reconcile.Request{NamespacedName: key})
598603
g.Expect(err).ToNot(HaveOccurred())
@@ -864,6 +869,7 @@ func TestMachinePoolConditions(t *testing.T) {
864869
r := &MachinePoolReconciler{
865870
Client: clientFake,
866871
APIReader: clientFake,
872+
Tracker: remote.NewTestClusterCacheTracker(ctrl.LoggerFrom(context.TODO()), clientFake, clientFake, clientFake.Scheme(), client.ObjectKey{Name: testCluster.Name, Namespace: testCluster.Namespace}),
867873
}
868874

869875
_, err := r.Reconcile(ctx, reconcile.Request{NamespacedName: util.ObjectKey(machinePool)})

0 commit comments

Comments
 (0)