Skip to content

Commit d44680f

Browse files
authored
Merge pull request #23366 from eddiezane/ez/add-retry-to-eks-cluster-delete
Add retry to eks cluster delete
2 parents 208b9ec + 6377bb6 commit d44680f

File tree

4 files changed

+48
-5
lines changed

4 files changed

+48
-5
lines changed

.changelog/23366.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
resource/aws_eks_cluster: Retry when `ResourceInUseException` errors are returned from the AWS API during resource deletion
3+
```

.semgrep.yml

+17-1
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ rules:
410410

411411
- id: helper-schema-TimeoutError-check-doesnt-return-output
412412
languages: [go]
413-
message: If the resource.Retry() or resource.RetryContext() function returns a value, ensure the isResourceTimeoutError() check does as well
413+
message: If the resource.Retry(), resource.RetryContext(), or tfresource.RetryConfigContext() function returns a value, ensure the isResourceTimeoutError() check does as well
414414
paths:
415415
exclude:
416416
- "*_test.go"
@@ -439,6 +439,14 @@ rules:
439439
})
440440
...
441441
if isResourceTimeoutError($ERR) { ... }
442+
- pattern-not-inside: |
443+
$ERR = tfresource.RetryConfigContext(..., func() *resource.RetryError {
444+
...
445+
_, $ERR2 = $CONN.$FUNC(...)
446+
...
447+
})
448+
...
449+
if tfresource.TimedOut($ERR) { ... }
442450
- patterns:
443451
- pattern: |
444452
if tfresource.TimedOut($ERR) {
@@ -460,6 +468,14 @@ rules:
460468
})
461469
...
462470
if tfresource.TimedOut($ERR) { ... }
471+
- pattern-not-inside: |
472+
$ERR = tfresource.RetryConfigContext(..., func() *resource.RetryError {
473+
...
474+
_, $ERR2 = $CONN.$FUNC(...)
475+
...
476+
})
477+
...
478+
if tfresource.TimedOut($ERR) { ... }
463479
severity: WARNING
464480

465481
- id: is-not-found-error

internal/service/eks/cluster.go

+26-4
Original file line numberDiff line numberDiff line change
@@ -498,10 +498,34 @@ func resourceClusterDelete(d *schema.ResourceData, meta interface{}) error {
498498
conn := meta.(*conns.AWSClient).EKSConn
499499

500500
log.Printf("[DEBUG] Deleting EKS Cluster: %s", d.Id())
501-
_, err := conn.DeleteCluster(&eks.DeleteClusterInput{
501+
502+
input := &eks.DeleteClusterInput{
502503
Name: aws.String(d.Id()),
504+
}
505+
506+
// If a cluster is scaling up due to load a delete request will fail
507+
// This is a temporary workaround until EKS supports multiple parallel mutating operations
508+
err := tfresource.RetryConfigContext(context.Background(), 0*time.Second, 1*time.Minute, 0*time.Second, 30*time.Second, clusterDeleteRetryTimeout, func() *resource.RetryError {
509+
var err error
510+
511+
_, err = conn.DeleteCluster(input)
512+
513+
if tfawserr.ErrMessageContains(err, eks.ErrCodeResourceInUseException, "in progress") {
514+
log.Printf("[DEBUG] eks cluster update in progress: %v", err)
515+
return resource.RetryableError(err)
516+
}
517+
518+
if err != nil {
519+
return resource.NonRetryableError(err)
520+
}
521+
522+
return nil
503523
})
504524

525+
if tfresource.TimedOut(err) {
526+
_, err = conn.DeleteCluster(input)
527+
}
528+
505529
if tfawserr.ErrCodeEquals(err, eks.ErrCodeResourceNotFoundException) {
506530
return nil
507531
}
@@ -516,9 +540,7 @@ func resourceClusterDelete(d *schema.ResourceData, meta interface{}) error {
516540
return fmt.Errorf("error deleting EKS Cluster (%s): %w", d.Id(), err)
517541
}
518542

519-
_, err = waitClusterDeleted(conn, d.Id(), d.Timeout(schema.TimeoutDelete))
520-
521-
if err != nil {
543+
if _, err = waitClusterDeleted(conn, d.Id(), d.Timeout(schema.TimeoutDelete)); err != nil {
522544
return fmt.Errorf("error waiting for EKS Cluster (%s) to delete: %w", d.Id(), err)
523545
}
524546

internal/service/eks/wait.go

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ const (
1414
addonCreatedTimeout = 20 * time.Minute
1515
addonUpdatedTimeout = 20 * time.Minute
1616
addonDeletedTimeout = 40 * time.Minute
17+
18+
clusterDeleteRetryTimeout = 60 * time.Minute
1719
)
1820

1921
func waitAddonCreated(ctx context.Context, conn *eks.EKS, clusterName, addonName string) (*eks.Addon, error) {

0 commit comments

Comments
 (0)