From a4a265fb4441d3262a6b021815dec2eb0367cc85 Mon Sep 17 00:00:00 2001 From: Ryn Daniels Date: Fri, 21 Jun 2019 12:21:35 +0200 Subject: [PATCH 1/3] Timeout retries for ECR resources --- aws/resource_aws_ecr_repository.go | 22 +++++++++++++++------- aws/resource_aws_ecr_repository_policy.go | 19 +++++++++++++------ 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/aws/resource_aws_ecr_repository.go b/aws/resource_aws_ecr_repository.go index 52709fcf9631..b7112c6320a5 100644 --- a/aws/resource_aws_ecr_repository.go +++ b/aws/resource_aws_ecr_repository.go @@ -81,8 +81,8 @@ func resourceAwsEcrRepositoryRead(d *schema.ResourceData, meta interface{}) erro RepositoryNames: aws.StringSlice([]string{d.Id()}), } - err := resource.Retry(1*time.Minute, func() *resource.RetryError { - var err error + var err error + err = resource.Retry(1*time.Minute, func() *resource.RetryError { out, err = conn.DescribeRepositories(input) if d.IsNewResource() && isAWSErr(err, ecr.ErrCodeRepositoryNotFoundException, "") { return resource.RetryableError(err) @@ -93,6 +93,10 @@ func resourceAwsEcrRepositoryRead(d *schema.ResourceData, meta interface{}) erro return nil }) + if isResourceTimeoutError(err) { + out, err = conn.DescribeRepositories(input) + } + if isAWSErr(err, ecr.ErrCodeRepositoryNotFoundException, "") { log.Printf("[WARN] ECR Repository (%s) not found, removing from state", d.Id()) d.SetId("") @@ -143,10 +147,11 @@ func resourceAwsEcrRepositoryDelete(d *schema.ResourceData, meta interface{}) er } log.Printf("[DEBUG] Waiting for ECR Repository %q to be deleted", d.Id()) + input := &ecr.DescribeRepositoriesInput{ + RepositoryNames: aws.StringSlice([]string{d.Id()}), + } err = resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { - _, err := conn.DescribeRepositories(&ecr.DescribeRepositoriesInput{ - RepositoryNames: aws.StringSlice([]string{d.Id()}), - }) + _, err = conn.DescribeRepositories(input) if err != nil { if isAWSErr(err, ecr.ErrCodeRepositoryNotFoundException, "") { return nil @@ -154,9 +159,12 @@ func resourceAwsEcrRepositoryDelete(d *schema.ResourceData, meta interface{}) er return resource.NonRetryableError(err) } - return resource.RetryableError( - fmt.Errorf("%q: Timeout while waiting for the ECR Repository to be deleted", d.Id())) + return resource.RetryableError(fmt.Errorf("%q: Timeout while waiting for the ECR Repository to be deleted", d.Id())) }) + if isResourceTimeoutError(err) { + _, err = conn.DescribeRepositories(input) + } + if err != nil { return fmt.Errorf("error deleting ECR repository: %s", err) } diff --git a/aws/resource_aws_ecr_repository_policy.go b/aws/resource_aws_ecr_repository_policy.go index c661ed1140c4..c19f95e1455f 100644 --- a/aws/resource_aws_ecr_repository_policy.go +++ b/aws/resource_aws_ecr_repository_policy.go @@ -1,6 +1,7 @@ package aws import ( + "fmt" "log" "time" @@ -51,9 +52,9 @@ func resourceAwsEcrRepositoryPolicyCreate(d *schema.ResourceData, meta interface log.Printf("[DEBUG] Creating ECR resository policy: %s", input) // Retry due to IAM eventual consistency + var err error var out *ecr.SetRepositoryPolicyOutput - err := resource.Retry(2*time.Minute, func() *resource.RetryError { - var err error + err = resource.Retry(2*time.Minute, func() *resource.RetryError { out, err = conn.SetRepositoryPolicy(&input) if isAWSErr(err, "InvalidParameterException", "Invalid repository policy provided") { @@ -62,8 +63,11 @@ func resourceAwsEcrRepositoryPolicyCreate(d *schema.ResourceData, meta interface } return resource.NonRetryableError(err) }) + if isResourceTimeoutError(err) { + out, err = conn.SetRepositoryPolicy(&input) + } if err != nil { - return err + return fmt.Errorf("Error creating ECR Repository Policy: %s", err) } repositoryPolicy := *out @@ -124,9 +128,9 @@ func resourceAwsEcrRepositoryPolicyUpdate(d *schema.ResourceData, meta interface log.Printf("[DEBUG] Updating ECR resository policy: %s", input) // Retry due to IAM eventual consistency + var err error var out *ecr.SetRepositoryPolicyOutput - err := resource.Retry(2*time.Minute, func() *resource.RetryError { - var err error + err = resource.Retry(2*time.Minute, func() *resource.RetryError { out, err = conn.SetRepositoryPolicy(&input) if isAWSErr(err, "InvalidParameterException", "Invalid repository policy provided") { @@ -135,8 +139,11 @@ func resourceAwsEcrRepositoryPolicyUpdate(d *schema.ResourceData, meta interface } return resource.NonRetryableError(err) }) + if isResourceTimeoutError(err) { + out, err = conn.SetRepositoryPolicy(&input) + } if err != nil { - return err + return fmt.Errorf("Error updating ECR Repository Policy: %s", err) } repositoryPolicy := *out From fb30c24be8cdd4aef0309f21e771cd1428a60848 Mon Sep 17 00:00:00 2001 From: Ryn Daniels Date: Fri, 21 Jun 2019 17:49:45 +0200 Subject: [PATCH 2/3] Update aws/resource_aws_ecr_repository.go Co-Authored-By: Brian Flad --- aws/resource_aws_ecr_repository.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/aws/resource_aws_ecr_repository.go b/aws/resource_aws_ecr_repository.go index b7112c6320a5..9a3a810ec930 100644 --- a/aws/resource_aws_ecr_repository.go +++ b/aws/resource_aws_ecr_repository.go @@ -164,6 +164,10 @@ func resourceAwsEcrRepositoryDelete(d *schema.ResourceData, meta interface{}) er if isResourceTimeoutError(err) { _, err = conn.DescribeRepositories(input) } + + if isAWSErr(err, ecr.ErrCodeRepositoryNotFoundException, "") { + return nil + } if err != nil { return fmt.Errorf("error deleting ECR repository: %s", err) From 656e81eff6632a0c589f8db14b0cc1893cbef09d Mon Sep 17 00:00:00 2001 From: Ryn Daniels Date: Fri, 21 Jun 2019 18:01:13 +0200 Subject: [PATCH 3/3] A whitespace change for the linting gods --- aws/resource_aws_ecr_repository.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws/resource_aws_ecr_repository.go b/aws/resource_aws_ecr_repository.go index 9a3a810ec930..2b22b1a37ada 100644 --- a/aws/resource_aws_ecr_repository.go +++ b/aws/resource_aws_ecr_repository.go @@ -164,7 +164,7 @@ func resourceAwsEcrRepositoryDelete(d *schema.ResourceData, meta interface{}) er if isResourceTimeoutError(err) { _, err = conn.DescribeRepositories(input) } - + if isAWSErr(err, ecr.ErrCodeRepositoryNotFoundException, "") { return nil }