@@ -20,7 +20,9 @@ import (
20
20
"context"
21
21
22
22
"github.com/pkg/errors"
23
+ clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
23
24
ctrl "sigs.k8s.io/controller-runtime"
25
+ "sigs.k8s.io/controller-runtime/pkg/client"
24
26
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
25
27
26
28
infrav1 "sigs.k8s.io/cluster-api-provider-cloudstack/api/v1beta2"
@@ -107,7 +109,9 @@ func (r *CloudStackFailureDomainReconciliationRunner) Reconcile() (retRes ctrl.R
107
109
// ReconcileDelete on the ReconciliationRunner attempts to delete the reconciliation subject.
108
110
func (r * CloudStackFailureDomainReconciliationRunner ) ReconcileDelete () (ctrl.Result , error ) {
109
111
r .Log .Info ("Deleting CloudStackFailureDomain" )
112
+
110
113
return r .RunReconciliationStages (
114
+ r .ClearMachines ,
111
115
r .DeleteOwnedObjects (
112
116
infrav1 .GroupVersion .WithKind ("CloudStackAffinityGroup" ),
113
117
infrav1 .GroupVersion .WithKind ("CloudStackIsolatedNetwork" )),
@@ -118,6 +122,32 @@ func (r *CloudStackFailureDomainReconciliationRunner) ReconcileDelete() (ctrl.Re
118
122
)
119
123
}
120
124
125
+ // ClearMachines checks for any machines in failure domain, deletes the CAPI machine for any still in FailureDomain,
126
+ // and requeus until all CloudStack machines are cleared from the FailureDomain.
127
+ func (r * CloudStackFailureDomainReconciliationRunner ) ClearMachines () (ctrl.Result , error ) {
128
+ machines := & infrav1.CloudStackMachineList {}
129
+ if err := r .K8sClient .List (r .RequestCtx , machines , client.MatchingLabels {infrav1 .FailureDomainLabelName : r .ReconciliationSubject .Name }); err != nil {
130
+ return ctrl.Result {}, err
131
+ }
132
+ // Deleted CAPI machines for CloudStack machines found.
133
+ for _ , machine := range machines .Items {
134
+ for _ , ref := range machine .OwnerReferences {
135
+ if ref .Kind == "Machine" {
136
+ machine := & clusterv1.Machine {}
137
+ machine .Name = ref .Name
138
+ machine .Namespace = r .ReconciliationSubject .Namespace
139
+ if err := r .K8sClient .Delete (r .RequestCtx , machine ); err != nil {
140
+ return ctrl.Result {}, err
141
+ }
142
+ }
143
+ }
144
+ }
145
+ if len (machines .Items ) > 0 {
146
+ return r .RequeueWithMessage ("FailureDomain still has machine in it." )
147
+ }
148
+ return ctrl.Result {}, nil
149
+ }
150
+
121
151
// RemoveFinalizer just removes the finalizer from the failure domain.
122
152
func (r * CloudStackFailureDomainReconciliationRunner ) RemoveFinalizer () (ctrl.Result , error ) {
123
153
controllerutil .RemoveFinalizer (r .ReconciliationSubject , infrav1 .FailureDomainFinalizer )
0 commit comments