Skip to content

Commit b5f0392

Browse files
Fix vm state bug and deletion bug (#340)
* Do not put machine in failed state if VM is in stopping or stopped state, and use ID from instance during deletion
1 parent 9ccdbc8 commit b5f0392

File tree

4 files changed

+53
-4
lines changed

4 files changed

+53
-4
lines changed

cloud/scope/machine.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,8 +300,8 @@ func (m *MachineScope) getFreeFormTags() map[string]string {
300300
}
301301

302302
// DeleteMachine terminates the instance using InstanceId from the OCIMachine spec and deletes the boot volume
303-
func (m *MachineScope) DeleteMachine(ctx context.Context) error {
304-
req := core.TerminateInstanceRequest{InstanceId: m.OCIMachine.Spec.InstanceId,
303+
func (m *MachineScope) DeleteMachine(ctx context.Context, instance *core.Instance) error {
304+
req := core.TerminateInstanceRequest{InstanceId: instance.Id,
305305
PreserveBootVolume: common.Bool(false)}
306306
_, err := m.ComputeClient.TerminateInstance(ctx, req)
307307
return err
@@ -404,6 +404,11 @@ func (m *MachineScope) SetReady() {
404404
m.OCIMachine.Status.Ready = true
405405
}
406406

407+
// SetNotReady sets the OCIMachine Ready Status to false.
408+
func (m *MachineScope) SetNotReady() {
409+
m.OCIMachine.Status.Ready = false
410+
}
411+
407412
// IsReady returns the ready status of the machine.
408413
func (m *MachineScope) IsReady() bool {
409414
return m.OCIMachine.Status.Ready

cloud/scope/machine_test.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2391,6 +2391,7 @@ func TestInstanceDeletion(t *testing.T) {
23912391
expectedEvent string
23922392
eventNotExpected string
23932393
matchError error
2394+
instance *core.Instance
23942395
errorSubStringMatch bool
23952396
testSpecificSetup func(machineScope *MachineScope, computeClient *mock_compute.MockComputeClient)
23962397
}{
@@ -2404,6 +2405,9 @@ func TestInstanceDeletion(t *testing.T) {
24042405
PreserveBootVolume: common.Bool(false),
24052406
})).Return(core.TerminateInstanceResponse{}, nil)
24062407
},
2408+
instance: &core.Instance{
2409+
Id: common.String("test"),
2410+
},
24072411
},
24082412
{
24092413
name: "delete instance error",
@@ -2416,6 +2420,9 @@ func TestInstanceDeletion(t *testing.T) {
24162420
PreserveBootVolume: common.Bool(false),
24172421
})).Return(core.TerminateInstanceResponse{}, errors.New("could not terminate instance"))
24182422
},
2423+
instance: &core.Instance{
2424+
Id: common.String("test"),
2425+
},
24192426
},
24202427
}
24212428

@@ -2425,7 +2432,7 @@ func TestInstanceDeletion(t *testing.T) {
24252432
defer teardown(t, g)
24262433
setup(t, g)
24272434
tc.testSpecificSetup(ms, computeClient)
2428-
err := ms.DeleteMachine(context.Background())
2435+
err := ms.DeleteMachine(context.Background(), tc.instance)
24292436
if tc.errorExpected {
24302437
g.Expect(err).To(Not(BeNil()))
24312438
if tc.errorSubStringMatch {

controllers/ocimachine_controller.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,10 @@ func (r *OCIMachineReconciler) reconcileNormal(ctx context.Context, logger logr.
281281
machineScope.Info("Instance is pending")
282282
conditions.MarkFalse(machineScope.OCIMachine, infrastructurev1beta2.InstanceReadyCondition, infrastructurev1beta2.InstanceNotReadyReason, clusterv1.ConditionSeverityInfo, "")
283283
return reconcile.Result{RequeueAfter: 10 * time.Second}, nil
284+
case core.InstanceLifecycleStateStopping, core.InstanceLifecycleStateStopped:
285+
machineScope.SetNotReady()
286+
conditions.MarkFalse(machineScope.OCIMachine, infrastructurev1beta2.InstanceReadyCondition, infrastructurev1beta2.InstanceNotReadyReason, clusterv1.ConditionSeverityInfo, "")
287+
return reconcile.Result{}, nil
284288
case core.InstanceLifecycleStateRunning:
285289
machineScope.Info("Instance is active")
286290
if machine.Status.Addresses == nil || len(machine.Status.Addresses) == 0 {
@@ -342,6 +346,7 @@ func (r *OCIMachineReconciler) reconcileNormal(ctx context.Context, logger logr.
342346
}
343347
fallthrough
344348
default:
349+
machineScope.SetNotReady()
345350
conditions.MarkFalse(machineScope.OCIMachine, infrastructurev1beta2.InstanceReadyCondition, infrastructurev1beta2.InstanceProvisionFailedReason, clusterv1.ConditionSeverityError, "")
346351
machineScope.SetFailureReason(capierrors.CreateMachineError)
347352
machineScope.SetFailureMessage(errors.Errorf("Instance status %q is unexpected", instance.LifecycleState))
@@ -401,7 +406,7 @@ func (r *OCIMachineReconciler) reconcileDelete(ctx context.Context, machineScope
401406
if err != nil {
402407
return reconcile.Result{}, err
403408
}
404-
if err := machineScope.DeleteMachine(ctx); err != nil {
409+
if err := machineScope.DeleteMachine(ctx, instance); err != nil {
405410
machineScope.Error(err, "Error deleting Instance")
406411
return ctrl.Result{}, errors.Wrapf(err, "error deleting instance %s", machineScope.Name())
407412
}

controllers/ocimachine_controller_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,38 @@ func TestNormalReconciliationFunction(t *testing.T) {
300300
g.Expect(result.RequeueAfter).To(Equal(300 * time.Second))
301301
},
302302
},
303+
{
304+
name: "instance in stopped state",
305+
errorExpected: false,
306+
conditionAssertion: []conditionAssertion{{infrastructurev1beta2.InstanceReadyCondition, corev1.ConditionFalse, clusterv1.ConditionSeverityInfo, infrastructurev1beta2.InstanceNotReadyReason}},
307+
testSpecificSetup: func(t *test, machineScope *scope.MachineScope, computeClient *mock_compute.MockComputeClient, vcnClient *mock_vcn.MockClient, nlbclient *mock_nlb.MockNetworkLoadBalancerClient) {
308+
computeClient.EXPECT().GetInstance(gomock.Any(), gomock.Eq(core.GetInstanceRequest{
309+
InstanceId: common.String("test"),
310+
})).
311+
Return(core.GetInstanceResponse{
312+
Instance: core.Instance{
313+
Id: common.String("test"),
314+
LifecycleState: core.InstanceLifecycleStateStopped,
315+
},
316+
}, nil)
317+
},
318+
},
319+
{
320+
name: "instance in stopping state",
321+
errorExpected: false,
322+
conditionAssertion: []conditionAssertion{{infrastructurev1beta2.InstanceReadyCondition, corev1.ConditionFalse, clusterv1.ConditionSeverityInfo, infrastructurev1beta2.InstanceNotReadyReason}},
323+
testSpecificSetup: func(t *test, machineScope *scope.MachineScope, computeClient *mock_compute.MockComputeClient, vcnClient *mock_vcn.MockClient, nlbclient *mock_nlb.MockNetworkLoadBalancerClient) {
324+
computeClient.EXPECT().GetInstance(gomock.Any(), gomock.Eq(core.GetInstanceRequest{
325+
InstanceId: common.String("test"),
326+
})).
327+
Return(core.GetInstanceResponse{
328+
Instance: core.Instance{
329+
Id: common.String("test"),
330+
LifecycleState: core.InstanceLifecycleStateStopping,
331+
},
332+
}, nil)
333+
},
334+
},
303335
{
304336
name: "instance in terminated state",
305337
errorExpected: true,

0 commit comments

Comments
 (0)