Skip to content

Commit 1de7a5d

Browse files
author
Joshua Reed
committed
Needs cleanup, but can replace failure domains now.
1 parent 37e4e05 commit 1de7a5d

File tree

3 files changed

+33
-1
lines changed

3 files changed

+33
-1
lines changed

api/v1beta2/cloudstackfailuredomain_types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323

2424
const (
2525
FailureDomainFinalizer = "cloudstackfailuredomain.infrastructure.cluster.x-k8s.io"
26+
FailureDomainLabelName = "cloudstackfailuredomain.infrastructure.cluster.x-k8s.io/name"
2627
NetworkTypeIsolated = "Isolated"
2728
NetworkTypeShared = "Shared"
2829
)

controllers/cloudstackfailuredomain_controller.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ import (
2020
"context"
2121

2222
"github.com/pkg/errors"
23+
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
2324
ctrl "sigs.k8s.io/controller-runtime"
25+
"sigs.k8s.io/controller-runtime/pkg/client"
2426
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
2527

2628
infrav1 "sigs.k8s.io/cluster-api-provider-cloudstack/api/v1beta2"
@@ -107,7 +109,9 @@ func (r *CloudStackFailureDomainReconciliationRunner) Reconcile() (retRes ctrl.R
107109
// ReconcileDelete on the ReconciliationRunner attempts to delete the reconciliation subject.
108110
func (r *CloudStackFailureDomainReconciliationRunner) ReconcileDelete() (ctrl.Result, error) {
109111
r.Log.Info("Deleting CloudStackFailureDomain")
112+
110113
return r.RunReconciliationStages(
114+
r.ClearMachines,
111115
r.DeleteOwnedObjects(
112116
infrav1.GroupVersion.WithKind("CloudStackAffinityGroup"),
113117
infrav1.GroupVersion.WithKind("CloudStackIsolatedNetwork")),
@@ -118,6 +122,32 @@ func (r *CloudStackFailureDomainReconciliationRunner) ReconcileDelete() (ctrl.Re
118122
)
119123
}
120124

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+
121151
// RemoveFinalizer just removes the finalizer from the failure domain.
122152
func (r *CloudStackFailureDomainReconciliationRunner) RemoveFinalizer() (ctrl.Result, error) {
123153
controllerutil.RemoveFinalizer(r.ReconciliationSubject, infrav1.FailureDomainFinalizer)

controllers/cloudstackmachine_controller.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ func (r *CloudStackMachineReconciliationRunner) ConsiderAffinity() (ctrl.Result,
136136

137137
// SetFailureDomainOnCSMachine sets the failure domain the machine should launch in.
138138
func (r *CloudStackMachineReconciliationRunner) SetFailureDomainOnCSMachine() (retRes ctrl.Result, reterr error) {
139-
if r.ReconciliationSubject.Spec.FailureDomainName == "" { // Needs random FD, but not yet set.
139+
if r.ReconciliationSubject.Spec.FailureDomainName == "" {
140140

141141
if r.CAPIMachine.Spec.FailureDomain != nil &&
142142
(util.IsControlPlaneMachine(r.CAPIMachine) || // Is control plane machine -- CAPI will specify.
@@ -150,6 +150,7 @@ func (r *CloudStackMachineReconciliationRunner) SetFailureDomainOnCSMachine() (r
150150
}
151151
r.ReconciliationSubject.Spec.FailureDomainName = name
152152
}
153+
r.ReconciliationSubject.Labels[infrav1.FailureDomainLabelName] = r.ReconciliationSubject.Spec.FailureDomainName
153154
}
154155
return ctrl.Result{}, nil
155156
}

0 commit comments

Comments
 (0)