Skip to content

Commit 022d53e

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

File tree

1 file changed

+37
-18
lines changed

1 file changed

+37
-18
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.

0 commit comments

Comments
 (0)