Skip to content

Commit 743b049

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 c0b4f5a commit 743b049

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(ociCluster infrastructurev1beta2.OCIClust
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
@@ -2373,6 +2373,7 @@ func TestInstanceDeletion(t *testing.T) {
23732373
expectedEvent string
23742374
eventNotExpected string
23752375
matchError error
2376+
instance *core.Instance
23762377
errorSubStringMatch bool
23772378
testSpecificSetup func(machineScope *MachineScope, computeClient *mock_compute.MockComputeClient)
23782379
}{
@@ -2386,6 +2387,9 @@ func TestInstanceDeletion(t *testing.T) {
23862387
PreserveBootVolume: common.Bool(false),
23872388
})).Return(core.TerminateInstanceResponse{}, nil)
23882389
},
2390+
instance: &core.Instance{
2391+
Id: common.String("test"),
2392+
},
23892393
},
23902394
{
23912395
name: "delete instance error",
@@ -2398,6 +2402,9 @@ func TestInstanceDeletion(t *testing.T) {
23982402
PreserveBootVolume: common.Bool(false),
23992403
})).Return(core.TerminateInstanceResponse{}, errors.New("could not terminate instance"))
24002404
},
2405+
instance: &core.Instance{
2406+
Id: common.String("test"),
2407+
},
24012408
},
24022409
}
24032410

@@ -2407,7 +2414,7 @@ func TestInstanceDeletion(t *testing.T) {
24072414
defer teardown(t, g)
24082415
setup(t, g)
24092416
tc.testSpecificSetup(ms, computeClient)
2410-
err := ms.DeleteMachine(context.Background())
2417+
err := ms.DeleteMachine(context.Background(), tc.instance)
24112418
if tc.errorExpected {
24122419
g.Expect(err).To(Not(BeNil()))
24132420
if tc.errorSubStringMatch {

controllers/ocimachine_controller.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,10 @@ func (r *OCIMachineReconciler) reconcileNormal(ctx context.Context, logger logr.
266266
machineScope.Info("Instance is pending")
267267
conditions.MarkFalse(machineScope.OCIMachine, infrastructurev1beta2.InstanceReadyCondition, infrastructurev1beta2.InstanceNotReadyReason, clusterv1.ConditionSeverityInfo, "")
268268
return reconcile.Result{RequeueAfter: 10 * time.Second}, nil
269+
case core.InstanceLifecycleStateStopping, core.InstanceLifecycleStateStopped:
270+
machineScope.SetNotReady()
271+
conditions.MarkFalse(machineScope.OCIMachine, infrastructurev1beta2.InstanceReadyCondition, infrastructurev1beta2.InstanceNotReadyReason, clusterv1.ConditionSeverityInfo, "")
272+
return reconcile.Result{}, nil
269273
case core.InstanceLifecycleStateRunning:
270274
machineScope.Info("Instance is active")
271275
if machine.Status.Addresses == nil || len(machine.Status.Addresses) == 0 {
@@ -327,6 +331,7 @@ func (r *OCIMachineReconciler) reconcileNormal(ctx context.Context, logger logr.
327331
}
328332
fallthrough
329333
default:
334+
machineScope.SetNotReady()
330335
conditions.MarkFalse(machineScope.OCIMachine, infrastructurev1beta2.InstanceReadyCondition, infrastructurev1beta2.InstanceProvisionFailedReason, clusterv1.ConditionSeverityError, "")
331336
machineScope.SetFailureReason(capierrors.CreateMachineError)
332337
machineScope.SetFailureMessage(errors.Errorf("Instance status %q is unexpected", instance.LifecycleState))
@@ -386,7 +391,7 @@ func (r *OCIMachineReconciler) reconcileDelete(ctx context.Context, machineScope
386391
if err != nil {
387392
return reconcile.Result{}, err
388393
}
389-
if err := machineScope.DeleteMachine(ctx); err != nil {
394+
if err := machineScope.DeleteMachine(ctx, instance); err != nil {
390395
machineScope.Error(err, "Error deleting Instance")
391396
return ctrl.Result{}, errors.Wrapf(err, "error deleting instance %s", machineScope.Name())
392397
}

controllers/ocimachine_controller_test.go

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

0 commit comments

Comments
 (0)