@@ -253,33 +253,52 @@ func (r *MachinePoolReconciler) reconcile(ctx context.Context, cluster *clusterv
253
253
return res , kerrors .NewAggregate (errs )
254
254
}
255
255
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
+ }
262
266
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
266
277
}
267
278
268
- controllerutil .RemoveFinalizer (mp , expv1 .MachinePoolFinalizer )
269
- return nil
279
+ return err
270
280
}
271
281
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 ())
275
286
}
287
+ return false
288
+ }
276
289
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
280
296
}
281
297
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
283
302
}
284
303
285
304
// reconcileDeleteExternal tries to delete external references, returning true if it cannot find any.
0 commit comments