@@ -214,6 +214,7 @@ func (r *MachinePoolReconciler) Reconcile(ctx context.Context, req ctrl.Request)
214
214
log .V (5 ).Info ("Requeuing because another worker has the lock on the ClusterCacheTracker" )
215
215
return ctrl.Result {RequeueAfter : time .Minute }, nil
216
216
}
217
+
217
218
return ctrl.Result {}, err
218
219
}
219
220
@@ -273,41 +274,67 @@ func (r *MachinePoolReconciler) reconcile(ctx context.Context, s *scope) (ctrl.R
273
274
return res , kerrors .NewAggregate (errs )
274
275
}
275
276
276
- func (r * MachinePoolReconciler ) reconcileDelete (ctx context.Context , cluster * clusterv1.Cluster , mp * expv1.MachinePool ) error {
277
- if ok , err := r .reconcileDeleteExternal (ctx , mp ); ! ok || err != nil {
277
+ // reconcileDelete delete machinePool related resources.
278
+ func (r * MachinePoolReconciler ) reconcileDelete (ctx context.Context , cluster * clusterv1.Cluster , machinePool * expv1.MachinePool ) error {
279
+ if ok , err := r .reconcileDeleteExternal (ctx , machinePool ); ! ok || err != nil {
278
280
// Return early and don't remove the finalizer if we got an error or
279
281
// the external reconciliation deletion isn't ready.
280
282
return err
281
283
}
282
284
283
- if err := r .reconcileDeleteNodes (ctx , cluster , mp ); err != nil {
284
- // Return early and don't remove the finalizer if we got an error.
285
- return err
285
+ // check nodes delete timeout passed.
286
+ if ! r .isMachinePoolNodeDeleteTimeoutPassed (machinePool ) {
287
+ if err := r .reconcileDeleteNodes (ctx , cluster , machinePool ); err != nil {
288
+ // Return early and don't remove the finalizer if we got an error.
289
+ return err
290
+ }
291
+ } else {
292
+ ctrl .LoggerFrom (ctx ).Info ("NodeDeleteTimeout passed, skipping Nodes deletion" )
286
293
}
287
294
288
- controllerutil .RemoveFinalizer (mp , expv1 .MachinePoolFinalizer )
295
+ controllerutil .RemoveFinalizer (machinePool , expv1 .MachinePoolFinalizer )
289
296
return nil
290
297
}
291
298
292
- func (r * MachinePoolReconciler ) reconcileDeleteNodes (ctx context.Context , cluster * clusterv1.Cluster , machinepool * expv1.MachinePool ) error {
293
- if len (machinepool .Status .NodeRefs ) == 0 {
299
+ // reconcileDeleteNodes delete the cluster nodes.
300
+ func (r * MachinePoolReconciler ) reconcileDeleteNodes (ctx context.Context , cluster * clusterv1.Cluster , machinePool * expv1.MachinePool ) error {
301
+ if len (machinePool .Status .NodeRefs ) == 0 {
294
302
return nil
295
303
}
296
304
305
+ if r .Tracker == nil {
306
+ return errors .New ("Cannot establish cluster client to delete nodes" )
307
+ }
308
+
297
309
clusterClient , err := r .Tracker .GetClient (ctx , util .ObjectKey (cluster ))
298
310
if err != nil {
299
311
return err
300
312
}
301
313
302
- return r .deleteRetiredNodes (ctx , clusterClient , machinepool .Status .NodeRefs , machinepool .Spec .ProviderIDList )
314
+ return r .deleteRetiredNodes (ctx , clusterClient , machinePool .Status .NodeRefs , machinePool .Spec .ProviderIDList )
315
+ }
316
+
317
+ // isMachinePoolDeleteTimeoutPassed check the machinePool node delete time out.
318
+ func (r * MachinePoolReconciler ) isMachinePoolNodeDeleteTimeoutPassed (machinePool * expv1.MachinePool ) bool {
319
+ if ! machinePool .DeletionTimestamp .IsZero () && machinePool .Spec .Template .Spec .NodeDeletionTimeout != nil {
320
+ if machinePool .Spec .Template .Spec .NodeDeletionTimeout .Duration .Nanoseconds () != 0 {
321
+ deleteTimePlusDuration := machinePool .DeletionTimestamp .Add (machinePool .Spec .Template .Spec .NodeDeletionTimeout .Duration )
322
+ return deleteTimePlusDuration .Before (time .Now ())
323
+ }
324
+ }
325
+ return false
303
326
}
304
327
305
328
// reconcileDeleteExternal tries to delete external references, returning true if it cannot find any.
306
- func (r * MachinePoolReconciler ) reconcileDeleteExternal (ctx context.Context , m * expv1.MachinePool ) (bool , error ) {
329
+ func (r * MachinePoolReconciler ) reconcileDeleteExternal (ctx context.Context , machinePool * expv1.MachinePool ) (bool , error ) {
307
330
objects := []* unstructured.Unstructured {}
308
- references := []* corev1.ObjectReference {
309
- m .Spec .Template .Spec .Bootstrap .ConfigRef ,
310
- & m .Spec .Template .Spec .InfrastructureRef ,
331
+ references := []* corev1.ObjectReference {}
332
+ // check for external ref
333
+ if machinePool .Spec .Template .Spec .Bootstrap .ConfigRef != nil {
334
+ references = append (references , machinePool .Spec .Template .Spec .Bootstrap .ConfigRef )
335
+ }
336
+ if machinePool .Spec .Template .Spec .InfrastructureRef != (corev1.ObjectReference {}) {
337
+ references = append (references , & machinePool .Spec .Template .Spec .InfrastructureRef )
311
338
}
312
339
313
340
// Loop over the references and try to retrieve it with the client.
@@ -316,10 +343,10 @@ func (r *MachinePoolReconciler) reconcileDeleteExternal(ctx context.Context, m *
316
343
continue
317
344
}
318
345
319
- obj , err := external .Get (ctx , r .Client , ref , m .Namespace )
346
+ obj , err := external .Get (ctx , r .Client , ref , machinePool .Namespace )
320
347
if err != nil && ! apierrors .IsNotFound (errors .Cause (err )) {
321
348
return false , errors .Wrapf (err , "failed to get %s %q for MachinePool %q in namespace %q" ,
322
- ref .GroupVersionKind (), ref .Name , m .Name , m .Namespace )
349
+ ref .GroupVersionKind (), ref .Name , machinePool .Name , machinePool .Namespace )
323
350
}
324
351
if obj != nil {
325
352
objects = append (objects , obj )
@@ -331,7 +358,7 @@ func (r *MachinePoolReconciler) reconcileDeleteExternal(ctx context.Context, m *
331
358
if err := r .Client .Delete (ctx , obj ); err != nil && ! apierrors .IsNotFound (err ) {
332
359
return false , errors .Wrapf (err ,
333
360
"failed to delete %v %q for MachinePool %q in namespace %q" ,
334
- obj .GroupVersionKind (), obj .GetName (), m .Name , m .Namespace )
361
+ obj .GroupVersionKind (), obj .GetName (), machinePool .Name , machinePool .Namespace )
335
362
}
336
363
}
337
364
0 commit comments