Skip to content

Commit fc149db

Browse files
authored
Merge pull request #201 from wanyufe/bugfix-finalizer
Add finalizer only when deployVM no error
2 parents f775ce3 + 034dc37 commit fc149db

File tree

3 files changed

+14
-9
lines changed

3 files changed

+14
-9
lines changed

controllers/cloudstackmachine_controller.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -223,11 +223,14 @@ func (r *CloudStackMachineReconciliationRunner) GetOrCreateVMInstance() (retRes
223223
r.Recorder.Eventf(r.ReconciliationSubject, "Warning", "Creating", CSMachineCreationFailed, err.Error())
224224
}
225225
if err == nil && !controllerutil.ContainsFinalizer(r.ReconciliationSubject, infrav1.MachineFinalizer) { // Fetched or Created?
226+
// Adding a finalizer will make reconcile-delete try to destroy the associated VM through instanceID.
227+
// If err is not nil, it means CAPC could not get an associated VM through instanceID or name, so we should not add a finalizer to this CloudStackMachine,
228+
// Otherwise, reconcile-delete will be stuck trying to wait for instanceID to be available.
229+
controllerutil.AddFinalizer(r.ReconciliationSubject, infrav1.MachineFinalizer)
226230
r.Recorder.Eventf(r.ReconciliationSubject, "Normal", "Created", CSMachineCreationSuccess)
227231
r.Log.Info(CSMachineCreationSuccess, "instanceStatus", r.ReconciliationSubject.Status)
228232
}
229-
// Always add the finalizer regardless. It can't be added twice anyway.
230-
controllerutil.AddFinalizer(r.ReconciliationSubject, infrav1.MachineFinalizer)
233+
231234
return ctrl.Result{}, err
232235
}
233236

controllers/cloudstackmachine_controller_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ var _ = Describe("CloudStackMachineReconciler", func() {
7272
key := client.ObjectKey{Namespace: dummies.ClusterNameSpace, Name: dummies.CSMachine1.Name}
7373
if err := k8sClient.Get(ctx, key, tempMachine); err == nil {
7474
if tempMachine.Status.Ready == true {
75-
return true
75+
return len(tempMachine.ObjectMeta.Finalizers) > 0
7676
}
7777
}
7878
return false

pkg/cloud/instance.go

+8-6
Original file line numberDiff line numberDiff line change
@@ -275,15 +275,17 @@ func (c *client) GetOrCreateVMInstance(
275275
listVirtualMachineParams.SetZoneid(fd.Spec.Zone.ID)
276276
listVirtualMachineParams.SetNetworkid(fd.Spec.Zone.Network.ID)
277277
listVirtualMachineParams.SetName(csMachine.Name)
278-
if listVirtualMachinesResponse, err2 := c.cs.VirtualMachine.ListVirtualMachines(listVirtualMachineParams); err2 == nil && listVirtualMachinesResponse.Count > 0 {
279-
csMachine.Spec.InstanceID = pointer.StringPtr(listVirtualMachinesResponse.VirtualMachines[0].Id)
280-
} else {
278+
listVirtualMachinesResponse, err2 := c.cs.VirtualMachine.ListVirtualMachines(listVirtualMachineParams)
279+
if err2 != nil || listVirtualMachinesResponse.Count <= 0 {
281280
c.customMetrics.EvaluateErrorAndIncrementAcsReconciliationErrorCounter(err2)
281+
return err
282282
}
283-
return err
283+
csMachine.Spec.InstanceID = pointer.StringPtr(listVirtualMachinesResponse.VirtualMachines[0].Id)
284+
csMachine.Status.InstanceState = listVirtualMachinesResponse.VirtualMachines[0].State
285+
} else {
286+
csMachine.Spec.InstanceID = pointer.StringPtr(deployVMResp.Id)
287+
csMachine.Status.Status = pointer.String(metav1.StatusSuccess)
284288
}
285-
csMachine.Spec.InstanceID = pointer.StringPtr(deployVMResp.Id)
286-
csMachine.Status.Status = pointer.String(metav1.StatusSuccess)
287289
// Resolve uses a VM metrics request response to fill cloudstack machine status.
288290
// The deployment response is insufficient.
289291
return c.ResolveVMInstanceDetails(csMachine)

0 commit comments

Comments
 (0)