Skip to content

Commit f5d1d45

Browse files
committed
Requeue terminating AWSMachines and don't remove the finalizer until their termination completes
1 parent b2963ff commit f5d1d45

File tree

2 files changed

+13
-10
lines changed

2 files changed

+13
-10
lines changed

controllers/awsmachine_controller.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"context"
2121
"encoding/json"
2222
"fmt"
23+
"time"
2324

2425
"github.com/aws/aws-sdk-go/aws"
2526
ignTypes "github.com/flatcar/ignition/config/v2_3/types"
@@ -340,8 +341,14 @@ func (r *AWSMachineReconciler) reconcileDelete(machineScope *scope.MachineScope,
340341
// This decision is based on the ec2-instance-lifecycle graph at
341342
// https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-lifecycle.html
342343
switch instance.State {
343-
case infrav1.InstanceStateShuttingDown, infrav1.InstanceStateTerminated:
344+
case infrav1.InstanceStateShuttingDown:
344345
machineScope.Info("EC2 instance is shutting down or already terminated", "instance-id", instance.ID)
346+
// requeue reconciliation until we observe termination (or the instance can no longer be looked up)
347+
return ctrl.Result{RequeueAfter: time.Minute}, nil
348+
case infrav1.InstanceStateTerminated:
349+
machineScope.Info("EC2 instance terminated successfully", "instance-id", instance.ID)
350+
controllerutil.RemoveFinalizer(machineScope.AWSMachine, infrav1.MachineFinalizer)
351+
return ctrl.Result{}, nil
345352
default:
346353
machineScope.Info("Terminating EC2 instance", "instance-id", instance.ID)
347354

@@ -391,12 +398,10 @@ func (r *AWSMachineReconciler) reconcileDelete(machineScope *scope.MachineScope,
391398

392399
machineScope.Info("EC2 instance successfully terminated", "instance-id", instance.ID)
393400
r.Recorder.Eventf(machineScope.AWSMachine, corev1.EventTypeNormal, "SuccessfulTerminate", "Terminated instance %q", instance.ID)
394-
}
395401

396-
// Instance is deleted so remove the finalizer.
397-
controllerutil.RemoveFinalizer(machineScope.AWSMachine, infrav1.MachineFinalizer)
398-
399-
return ctrl.Result{}, nil
402+
// requeue reconciliation until we observe termination (or the instance can no longer be looked up)
403+
return ctrl.Result{RequeueAfter: time.Minute}, nil
404+
}
400405
}
401406

402407
// findInstance queries the EC2 apis and retrieves the instance if it exists.

controllers/awsmachine_controller_unit_test.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1536,9 +1536,8 @@ func TestAWSMachineReconciler(t *testing.T) {
15361536
_, err := reconciler.reconcileDelete(ms, cs, cs, cs, cs)
15371537
g.Expect(err).To(BeNil())
15381538
g.Expect(buf.String()).To(ContainSubstring("EC2 instance is shutting down or already terminated"))
1539-
g.Expect(ms.AWSMachine.Finalizers).To(ConsistOf(metav1.FinalizerDeleteDependents))
15401539
})
1541-
t.Run("should ignore instances in terminated down state", func(t *testing.T) {
1540+
t.Run("should ignore instances in terminated state", func(t *testing.T) {
15421541
g := NewWithT(t)
15431542
awsMachine := getAWSMachine()
15441543
setup(t, g, awsMachine)
@@ -1555,7 +1554,7 @@ func TestAWSMachineReconciler(t *testing.T) {
15551554

15561555
_, err := reconciler.reconcileDelete(ms, cs, cs, cs, cs)
15571556
g.Expect(err).To(BeNil())
1558-
g.Expect(buf.String()).To(ContainSubstring("EC2 instance is shutting down or already terminated"))
1557+
g.Expect(buf.String()).To(ContainSubstring("EC2 instance terminated successfully"))
15591558
g.Expect(ms.AWSMachine.Finalizers).To(ConsistOf(metav1.FinalizerDeleteDependents))
15601559
})
15611560
t.Run("instance not shutting down yet", func(t *testing.T) {
@@ -1665,7 +1664,6 @@ func TestAWSMachineReconciler(t *testing.T) {
16651664

16661665
_, err := reconciler.reconcileDelete(ms, cs, cs, cs, cs)
16671666
g.Expect(err).To(BeNil())
1668-
g.Expect(ms.AWSMachine.Finalizers).To(ConsistOf(metav1.FinalizerDeleteDependents))
16691667
})
16701668

16711669
t.Run("should fail to detach control plane ELB from instance", func(t *testing.T) {

0 commit comments

Comments
 (0)