Skip to content

Commit b11aadd

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 2841d65 commit b11aadd

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
@@ -301,8 +301,8 @@ func (m *MachineScope) getFreeFormTags() map[string]string {
301301
}
302302

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

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

cloud/scope/machine_test.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2393,6 +2393,7 @@ func TestInstanceDeletion(t *testing.T) {
23932393
expectedEvent string
23942394
eventNotExpected string
23952395
matchError error
2396+
instance *core.Instance
23962397
errorSubStringMatch bool
23972398
testSpecificSetup func(machineScope *MachineScope, computeClient *mock_compute.MockComputeClient)
23982399
}{
@@ -2406,6 +2407,9 @@ func TestInstanceDeletion(t *testing.T) {
24062407
PreserveBootVolume: common.Bool(false),
24072408
})).Return(core.TerminateInstanceResponse{}, nil)
24082409
},
2410+
instance: &core.Instance{
2411+
Id: common.String("test"),
2412+
},
24092413
},
24102414
{
24112415
name: "delete instance error",
@@ -2418,6 +2422,9 @@ func TestInstanceDeletion(t *testing.T) {
24182422
PreserveBootVolume: common.Bool(false),
24192423
})).Return(core.TerminateInstanceResponse{}, errors.New("could not terminate instance"))
24202424
},
2425+
instance: &core.Instance{
2426+
Id: common.String("test"),
2427+
},
24212428
},
24222429
}
24232430

@@ -2427,7 +2434,7 @@ func TestInstanceDeletion(t *testing.T) {
24272434
defer teardown(t, g)
24282435
setup(t, g)
24292436
tc.testSpecificSetup(ms, computeClient)
2430-
err := ms.DeleteMachine(context.Background())
2437+
err := ms.DeleteMachine(context.Background(), tc.instance)
24312438
if tc.errorExpected {
24322439
g.Expect(err).To(Not(BeNil()))
24332440
if tc.errorSubStringMatch {

controllers/ocimachine_controller.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,10 @@ func (r *OCIMachineReconciler) reconcileNormal(ctx context.Context, logger logr.
278278
machineScope.Info("Instance is pending")
279279
conditions.MarkFalse(machineScope.OCIMachine, infrastructurev1beta2.InstanceReadyCondition, infrastructurev1beta2.InstanceNotReadyReason, clusterv1.ConditionSeverityInfo, "")
280280
return reconcile.Result{RequeueAfter: 10 * time.Second}, nil
281+
case core.InstanceLifecycleStateStopping, core.InstanceLifecycleStateStopped:
282+
machineScope.SetNotReady()
283+
conditions.MarkFalse(machineScope.OCIMachine, infrastructurev1beta2.InstanceReadyCondition, infrastructurev1beta2.InstanceNotReadyReason, clusterv1.ConditionSeverityInfo, "")
284+
return reconcile.Result{}, nil
281285
case core.InstanceLifecycleStateRunning:
282286
machineScope.Info("Instance is active")
283287
if machine.Status.Addresses == nil || len(machine.Status.Addresses) == 0 {
@@ -339,6 +343,7 @@ func (r *OCIMachineReconciler) reconcileNormal(ctx context.Context, logger logr.
339343
}
340344
fallthrough
341345
default:
346+
machineScope.SetNotReady()
342347
conditions.MarkFalse(machineScope.OCIMachine, infrastructurev1beta2.InstanceReadyCondition, infrastructurev1beta2.InstanceProvisionFailedReason, clusterv1.ConditionSeverityError, "")
343348
machineScope.SetFailureReason(capierrors.CreateMachineError)
344349
machineScope.SetFailureMessage(errors.Errorf("Instance status %q is unexpected", instance.LifecycleState))
@@ -398,7 +403,7 @@ func (r *OCIMachineReconciler) reconcileDelete(ctx context.Context, machineScope
398403
if err != nil {
399404
return reconcile.Result{}, err
400405
}
401-
if err := machineScope.DeleteMachine(ctx); err != nil {
406+
if err := machineScope.DeleteMachine(ctx, instance); err != nil {
402407
machineScope.Error(err, "Error deleting Instance")
403408
return ctrl.Result{}, errors.Wrapf(err, "error deleting instance %s", machineScope.Name())
404409
}

controllers/ocimachine_controller_test.go

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

0 commit comments

Comments
 (0)