From 37d10ebf37dbd3f9c3de98728b01f8c870e2c0d6 Mon Sep 17 00:00:00 2001 From: Radek Simko Date: Sun, 12 Jul 2015 11:30:16 +0100 Subject: [PATCH] aws: Retry ecs_cluster deletion if instances or services are active --- .../providers/aws/resource_aws_ecs_cluster.go | 36 ++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/builtin/providers/aws/resource_aws_ecs_cluster.go b/builtin/providers/aws/resource_aws_ecs_cluster.go index 30871f3dc..8fb85f902 100644 --- a/builtin/providers/aws/resource_aws_ecs_cluster.go +++ b/builtin/providers/aws/resource_aws_ecs_cluster.go @@ -2,9 +2,12 @@ package aws import ( "log" + "time" "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/service/ecs" + "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" ) @@ -67,14 +70,31 @@ func resourceAwsEcsClusterDelete(d *schema.ResourceData, meta interface{}) error log.Printf("[DEBUG] Deleting ECS cluster %s", d.Id()) - // TODO: Handle ClientException: The Cluster cannot be deleted while Container Instances are active. - // TODO: Handle ClientException: The Cluster cannot be deleted while Services are active. + return resource.Retry(10*time.Minute, func() error { + out, err := conn.DeleteCluster(&ecs.DeleteClusterInput{ + Cluster: aws.String(d.Id()), + }) - out, err := conn.DeleteCluster(&ecs.DeleteClusterInput{ - Cluster: aws.String(d.Id()), + if err == nil { + log.Printf("[DEBUG] ECS cluster %s deleted: %#v", d.Id(), out) + return nil + } + + awsErr, ok := err.(awserr.Error) + if !ok { + return resource.RetryError{Err: err} + } + + if awsErr.Code() == "ClusterContainsContainerInstancesException" { + log.Printf("[TRACE] Retrying ECS cluster %q deletion after %q", d.Id(), awsErr.Code()) + return err + } + + if awsErr.Code() == "ClusterContainsServicesException" { + log.Printf("[TRACE] Retrying ECS cluster %q deletion after %q", d.Id(), awsErr.Code()) + return err + } + + return resource.RetryError{Err: err} }) - - log.Printf("[DEBUG] ECS cluster %s deleted: %#v", d.Id(), out) - - return err }