@@ -20,6 +20,7 @@ import (
20
20
"context"
21
21
"fmt"
22
22
"reflect"
23
+ "time"
23
24
24
25
"github.com/pkg/errors"
25
26
corev1 "k8s.io/api/core/v1"
@@ -30,6 +31,7 @@ import (
30
31
capierrors "sigs.k8s.io/cluster-api/errors"
31
32
"sigs.k8s.io/cluster-api/util"
32
33
"sigs.k8s.io/cluster-api/util/annotations"
34
+ "sigs.k8s.io/cluster-api/util/collections"
33
35
"sigs.k8s.io/cluster-api/util/patch"
34
36
"sigs.k8s.io/cluster-api/util/predicates"
35
37
ctrl "sigs.k8s.io/controller-runtime"
@@ -119,16 +121,30 @@ func (r *OpenStackClusterReconciler) Reconcile(ctx context.Context, req ctrl.Req
119
121
120
122
// Handle deleted clusters
121
123
if ! openStackCluster .DeletionTimestamp .IsZero () {
122
- return reconcileDelete (scope , cluster , openStackCluster )
124
+ return r . reconcileDelete (ctx , scope , cluster , openStackCluster )
123
125
}
124
126
125
127
// Handle non-deleted clusters
126
128
return reconcileNormal (scope , cluster , openStackCluster )
127
129
}
128
130
129
- func reconcileDelete (scope scope.Scope , cluster * clusterv1.Cluster , openStackCluster * infrav1.OpenStackCluster ) (ctrl.Result , error ) {
131
+ func ( r * OpenStackClusterReconciler ) reconcileDelete (ctx context. Context , scope scope.Scope , cluster * clusterv1.Cluster , openStackCluster * infrav1.OpenStackCluster ) (ctrl.Result , error ) {
130
132
scope .Logger ().Info ("Reconciling Cluster delete" )
131
133
134
+ // Wait for machines to be deleted before removing the finalizer as they
135
+ // depend on this resource to deprovision. Additionally it appears that
136
+ // allowing the Kubernetes API to vanish too quickly will upset the capi
137
+ // kubeadm control plane controller.
138
+ machines , err := collections .GetFilteredMachinesForCluster (ctx , r .Client , cluster )
139
+ if err != nil {
140
+ return ctrl.Result {}, err
141
+ }
142
+
143
+ if len (machines ) != 0 {
144
+ scope .Logger ().Info ("Waiting for machines to be deleted" , "remaining" , len (machines ))
145
+ return ctrl.Result {RequeueAfter : 5 * time .Second }, nil
146
+ }
147
+
132
148
if err := deleteBastion (scope , cluster , openStackCluster ); err != nil {
133
149
return reconcile.Result {}, err
134
150
}
0 commit comments