@@ -200,6 +200,7 @@ func (r *MachinePoolReconciler) Reconcile(ctx context.Context, req ctrl.Request)
200
200
log .V (5 ).Info ("Requeuing because another worker has the lock on the ClusterCacheTracker" )
201
201
return ctrl.Result {RequeueAfter : time .Minute }, nil
202
202
}
203
+
203
204
return ctrl.Result {}, err
204
205
}
205
206
@@ -253,41 +254,67 @@ func (r *MachinePoolReconciler) reconcile(ctx context.Context, cluster *clusterv
253
254
return res , kerrors .NewAggregate (errs )
254
255
}
255
256
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 {
257
+ // reconcileDelete delete machinePool related resources.
258
+ func (r * MachinePoolReconciler ) reconcileDelete (ctx context.Context , cluster * clusterv1.Cluster , machinePool * expv1.MachinePool ) error {
259
+ if ok , err := r .reconcileDeleteExternal (ctx , machinePool ); ! ok || err != nil {
258
260
// Return early and don't remove the finalizer if we got an error or
259
261
// the external reconciliation deletion isn't ready.
260
262
return err
261
263
}
262
264
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
265
+ // check nodes delete timeout passed.
266
+ if ! r .isMachinePoolNodeDeleteTimeoutPassed (machinePool ) {
267
+ if err := r .reconcileDeleteNodes (ctx , cluster , machinePool ); err != nil {
268
+ // Return early and don't remove the finalizer if we got an error.
269
+ return err
270
+ }
271
+ } else {
272
+ ctrl .LoggerFrom (ctx ).Info ("NodeDeleteTimeout passed, Nodes will be deleted" )
266
273
}
267
274
268
- controllerutil .RemoveFinalizer (mp , expv1 .MachinePoolFinalizer )
275
+ controllerutil .RemoveFinalizer (machinePool , expv1 .MachinePoolFinalizer )
269
276
return nil
270
277
}
271
278
272
- func (r * MachinePoolReconciler ) reconcileDeleteNodes (ctx context.Context , cluster * clusterv1.Cluster , machinepool * expv1.MachinePool ) error {
273
- if len (machinepool .Status .NodeRefs ) == 0 {
279
+ // reconcileDeleteNodes delete the cluster nodes.
280
+ func (r * MachinePoolReconciler ) reconcileDeleteNodes (ctx context.Context , cluster * clusterv1.Cluster , machinePool * expv1.MachinePool ) error {
281
+ if len (machinePool .Status .NodeRefs ) == 0 {
274
282
return nil
275
283
}
276
284
285
+ if r .Tracker == nil {
286
+ return errors .New ("Cannot establish cluster client to delete nodes" )
287
+ }
288
+
277
289
clusterClient , err := r .Tracker .GetClient (ctx , util .ObjectKey (cluster ))
278
290
if err != nil {
279
291
return err
280
292
}
281
293
282
- return r .deleteRetiredNodes (ctx , clusterClient , machinepool .Status .NodeRefs , machinepool .Spec .ProviderIDList )
294
+ return r .deleteRetiredNodes (ctx , clusterClient , machinePool .Status .NodeRefs , machinePool .Spec .ProviderIDList )
295
+ }
296
+
297
+ // isMachinePoolDeleteTimeoutPassed check the machinePool node delete time out.
298
+ func (r * MachinePoolReconciler ) isMachinePoolNodeDeleteTimeoutPassed (machinePool * expv1.MachinePool ) bool {
299
+ if ! machinePool .DeletionTimestamp .IsZero () && machinePool .Spec .Template .Spec .NodeDeletionTimeout != nil {
300
+ if machinePool .Spec .Template .Spec .NodeDeletionTimeout .Duration .Nanoseconds () != 0 {
301
+ deleteTimePlusDuration := machinePool .DeletionTimestamp .Add (machinePool .Spec .Template .Spec .NodeDeletionTimeout .Duration )
302
+ return deleteTimePlusDuration .Before (time .Now ())
303
+ }
304
+ }
305
+ return false
283
306
}
284
307
285
308
// reconcileDeleteExternal tries to delete external references, returning true if it cannot find any.
286
- func (r * MachinePoolReconciler ) reconcileDeleteExternal (ctx context.Context , m * expv1.MachinePool ) (bool , error ) {
309
+ func (r * MachinePoolReconciler ) reconcileDeleteExternal (ctx context.Context , machinePool * expv1.MachinePool ) (bool , error ) {
287
310
objects := []* unstructured.Unstructured {}
288
- references := []* corev1.ObjectReference {
289
- m .Spec .Template .Spec .Bootstrap .ConfigRef ,
290
- & m .Spec .Template .Spec .InfrastructureRef ,
311
+ references := []* corev1.ObjectReference {}
312
+ // check for external ref
313
+ if machinePool .Spec .Template .Spec .Bootstrap .ConfigRef != nil {
314
+ references = append (references , machinePool .Spec .Template .Spec .Bootstrap .ConfigRef )
315
+ }
316
+ if machinePool .Spec .Template .Spec .InfrastructureRef != (corev1.ObjectReference {}) {
317
+ references = append (references , & machinePool .Spec .Template .Spec .InfrastructureRef )
291
318
}
292
319
293
320
// Loop over the references and try to retrieve it with the client.
@@ -296,10 +323,10 @@ func (r *MachinePoolReconciler) reconcileDeleteExternal(ctx context.Context, m *
296
323
continue
297
324
}
298
325
299
- obj , err := external .Get (ctx , r .Client , ref , m .Namespace )
326
+ obj , err := external .Get (ctx , r .Client , ref , machinePool .Namespace )
300
327
if err != nil && ! apierrors .IsNotFound (errors .Cause (err )) {
301
328
return false , errors .Wrapf (err , "failed to get %s %q for MachinePool %q in namespace %q" ,
302
- ref .GroupVersionKind (), ref .Name , m .Name , m .Namespace )
329
+ ref .GroupVersionKind (), ref .Name , machinePool .Name , machinePool .Namespace )
303
330
}
304
331
if obj != nil {
305
332
objects = append (objects , obj )
@@ -311,7 +338,7 @@ func (r *MachinePoolReconciler) reconcileDeleteExternal(ctx context.Context, m *
311
338
if err := r .Client .Delete (ctx , obj ); err != nil && ! apierrors .IsNotFound (err ) {
312
339
return false , errors .Wrapf (err ,
313
340
"failed to delete %v %q for MachinePool %q in namespace %q" ,
314
- obj .GroupVersionKind (), obj .GetName (), m .Name , m .Namespace )
341
+ obj .GroupVersionKind (), obj .GetName (), machinePool .Name , machinePool .Namespace )
315
342
}
316
343
}
317
344
0 commit comments