@@ -333,7 +333,7 @@ func (r *Reconciler) reconcileDelete(ctx context.Context, cluster *clusterv1.Clu
333
333
if err != nil {
334
334
switch err {
335
335
case errNoControlPlaneNodes , errLastControlPlaneNode , errNilNodeRef , errClusterIsBeingDeleted , errControlPlaneIsBeingDeleted :
336
- var nodeName = ""
336
+ nodeName : = ""
337
337
if m .Status .NodeRef != nil {
338
338
nodeName = m .Status .NodeRef .Name
339
339
}
@@ -427,7 +427,7 @@ func (r *Reconciler) reconcileDelete(ctx context.Context, cluster *clusterv1.Clu
427
427
return ctrl.Result {}, errors .Wrap (err , "failed to patch Machine" )
428
428
}
429
429
430
- infrastructureDeleted , err := r .reconcileDeleteInfrastructure (ctx , m )
430
+ infrastructureDeleted , err := r .reconcileDeleteInfrastructure (ctx , cluster , m )
431
431
if err != nil {
432
432
return ctrl.Result {}, err
433
433
}
@@ -436,7 +436,7 @@ func (r *Reconciler) reconcileDelete(ctx context.Context, cluster *clusterv1.Clu
436
436
return ctrl.Result {}, nil
437
437
}
438
438
439
- bootstrapDeleted , err := r .reconcileDeleteBootstrap (ctx , m )
439
+ bootstrapDeleted , err := r .reconcileDeleteBootstrap (ctx , cluster , m )
440
440
if err != nil {
441
441
return ctrl.Result {}, err
442
442
}
@@ -723,8 +723,8 @@ func (r *Reconciler) deleteNode(ctx context.Context, cluster *clusterv1.Cluster,
723
723
return nil
724
724
}
725
725
726
- func (r * Reconciler ) reconcileDeleteBootstrap (ctx context.Context , m * clusterv1.Machine ) (bool , error ) {
727
- obj , err := r .reconcileDeleteExternal (ctx , m , m .Spec .Bootstrap .ConfigRef )
726
+ func (r * Reconciler ) reconcileDeleteBootstrap (ctx context.Context , cluster * clusterv1. Cluster , m * clusterv1.Machine ) (bool , error ) {
727
+ obj , err := r .reconcileDeleteExternal (ctx , cluster , m , m .Spec .Bootstrap .ConfigRef )
728
728
if err != nil {
729
729
return false , err
730
730
}
@@ -743,8 +743,8 @@ func (r *Reconciler) reconcileDeleteBootstrap(ctx context.Context, m *clusterv1.
743
743
return false , nil
744
744
}
745
745
746
- func (r * Reconciler ) reconcileDeleteInfrastructure (ctx context.Context , m * clusterv1.Machine ) (bool , error ) {
747
- obj , err := r .reconcileDeleteExternal (ctx , m , & m .Spec .InfrastructureRef )
746
+ func (r * Reconciler ) reconcileDeleteInfrastructure (ctx context.Context , cluster * clusterv1. Cluster , m * clusterv1.Machine ) (bool , error ) {
747
+ obj , err := r .reconcileDeleteExternal (ctx , cluster , m , & m .Spec .InfrastructureRef )
748
748
if err != nil {
749
749
return false , err
750
750
}
@@ -764,7 +764,7 @@ func (r *Reconciler) reconcileDeleteInfrastructure(ctx context.Context, m *clust
764
764
}
765
765
766
766
// reconcileDeleteExternal tries to delete external references.
767
- func (r * Reconciler ) reconcileDeleteExternal (ctx context.Context , m * clusterv1.Machine , ref * corev1.ObjectReference ) (* unstructured.Unstructured , error ) {
767
+ func (r * Reconciler ) reconcileDeleteExternal (ctx context.Context , cluster * clusterv1. Cluster , m * clusterv1.Machine , ref * corev1.ObjectReference ) (* unstructured.Unstructured , error ) {
768
768
if ref == nil {
769
769
return nil , nil
770
770
}
@@ -777,6 +777,14 @@ func (r *Reconciler) reconcileDeleteExternal(ctx context.Context, m *clusterv1.M
777
777
}
778
778
779
779
if obj != nil {
780
+ // reconcileExternal ensures that we set the object's OwnerReferences correctly and watch the object.
781
+ // The machine delete logic depends on reconciling the machine when the external objects are deleted.
782
+ // This avoids a race condition where the machine is deleted before the external objects are ever reconciled
783
+ // by this controller.
784
+ if _ , err := r .ensureExternalOwnershipAndWatch (ctx , cluster , m , ref ); err != nil {
785
+ return nil , err
786
+ }
787
+
780
788
// Issue a delete request.
781
789
if err := r .Client .Delete (ctx , obj ); err != nil && ! apierrors .IsNotFound (err ) {
782
790
return obj , errors .Wrapf (err ,
0 commit comments