diff --git a/.changelog/10715.txt b/.changelog/10715.txt new file mode 100644 index 00000000000..1beb7bcbf5d --- /dev/null +++ b/.changelog/10715.txt @@ -0,0 +1,3 @@ +```release-note:bug +internal/tfresource/retry: Add retry handling when a request's connection is reset by peer +``` diff --git a/.semgrep.yml b/.semgrep.yml index 91dbdf91719..22420fe8429 100644 --- a/.semgrep.yml +++ b/.semgrep.yml @@ -359,7 +359,7 @@ rules: - id: helper-schema-resource-Retry-without-TimeoutError-check languages: [go] - message: Check resource.Retry() errors with tfresource.TimedOut() + message: Check tfresource.RetryOnConnectionResetByPeer() errors with tfresource.TimedOut() paths: exclude: - "*_test.go" @@ -371,33 +371,33 @@ rules: - patterns: - pattern-either: - pattern: | - $ERR := resource.Retry(...) + $ERR := tfresource.RetryOnConnectionResetByPeer(...) ... return ... - pattern: | - $ERR = resource.Retry(...) + $ERR = tfresource.RetryOnConnectionResetByPeer(...) ... return ... - pattern-not: | - $ERR := resource.Retry(...) + $ERR := tfresource.RetryOnConnectionResetByPeer(...) ... if isResourceTimeoutError($ERR) { ... } ... return ... - pattern-not: | - $ERR = resource.Retry(...) + $ERR = tfresource.RetryOnConnectionResetByPeer(...) ... if isResourceTimeoutError($ERR) { ... } ... return ... - pattern-not: | - $ERR := resource.Retry(...) + $ERR := tfresource.RetryOnConnectionResetByPeer(...) ... if tfresource.TimedOut($ERR) { ... } ... return ... - pattern-not: | - $ERR = resource.Retry(...) + $ERR = tfresource.RetryOnConnectionResetByPeer(...) ... if tfresource.TimedOut($ERR) { ... } ... diff --git a/aws/awserr.go b/aws/awserr.go index cc1c6ba1d0a..a3a832fd461 100644 --- a/aws/awserr.go +++ b/aws/awserr.go @@ -29,7 +29,7 @@ func isAWSErrRequestFailureStatusCode(err error, statusCode int) bool { func retryOnAwsCode(code string, f func() (interface{}, error)) (interface{}, error) { var resp interface{} - err := resource.Retry(2*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(2*time.Minute, func() *resource.RetryError { var err error resp, err = f() if err != nil { @@ -52,7 +52,7 @@ func retryOnAwsCode(code string, f func() (interface{}, error)) (interface{}, er // Note: This function will be moved out of the aws package in the future. func RetryOnAwsCodes(codes []string, f func() (interface{}, error)) (interface{}, error) { var resp interface{} - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { var err error resp, err = f() if err != nil { diff --git a/aws/data_source_aws_iam_policy.go b/aws/data_source_aws_iam_policy.go index b4177d16c91..21b0b07f2cb 100644 --- a/aws/data_source_aws_iam_policy.go +++ b/aws/data_source_aws_iam_policy.go @@ -68,7 +68,7 @@ func dataSourceAwsIAMPolicyRead(d *schema.ResourceData, meta interface{}) error var results []*iam.Policy // Handle IAM eventual consistency - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error results, err = finder.Policies(conn, arn, name, pathPrefix) @@ -138,7 +138,7 @@ func dataSourceAwsIAMPolicyRead(d *schema.ResourceData, meta interface{}) error // Handle IAM eventual consistency var policyVersionOutput *iam.GetPolicyVersionOutput - err = resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error policyVersionOutput, err = conn.GetPolicyVersion(policyVersionInput) diff --git a/aws/data_source_aws_iam_session_context.go b/aws/data_source_aws_iam_session_context.go index 9b976e16d1a..61672e46776 100644 --- a/aws/data_source_aws_iam_session_context.go +++ b/aws/data_source_aws_iam_session_context.go @@ -67,7 +67,7 @@ func dataSourceAwsIAMSessionContextRead(d *schema.ResourceData, meta interface{} var role *iam.Role - err = resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error role, err = finder.Role(conn, roleName) diff --git a/aws/internal/keyvaluetags/create_tags_gen.go b/aws/internal/keyvaluetags/create_tags_gen.go index 096f55925f2..4611b32c06d 100644 --- a/aws/internal/keyvaluetags/create_tags_gen.go +++ b/aws/internal/keyvaluetags/create_tags_gen.go @@ -25,7 +25,7 @@ func Ec2CreateTags(conn *ec2.EC2, identifier string, tagsMap interface{}) error Tags: tags.IgnoreAws().Ec2Tags(), } - err := resource.Retry(EventualConsistencyTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(EventualConsistencyTimeout, func() *resource.RetryError { _, err := conn.CreateTags(input) if tfawserr.ErrCodeContains(err, ".NotFound") { diff --git a/aws/internal/keyvaluetags/generators/createtags/main.go b/aws/internal/keyvaluetags/generators/createtags/main.go index 0e5f8b92f08..cca9e7d9a7b 100644 --- a/aws/internal/keyvaluetags/generators/createtags/main.go +++ b/aws/internal/keyvaluetags/generators/createtags/main.go @@ -133,7 +133,7 @@ func {{ . | Title }}CreateTags(conn {{ . | ClientType }}, identifier string{{ if {{- if . | RetryCreationOnResourceNotFound }} - err := resource.Retry(EventualConsistencyTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(EventualConsistencyTimeout, func() *resource.RetryError { _, err := conn.{{ . | TagFunction }}(input) {{- if . | ResourceNotFoundErrorCodeContains }} diff --git a/aws/internal/keyvaluetags/s3_tags.go b/aws/internal/keyvaluetags/s3_tags.go index a858b48e51c..0266cf518de 100644 --- a/aws/internal/keyvaluetags/s3_tags.go +++ b/aws/internal/keyvaluetags/s3_tags.go @@ -92,7 +92,7 @@ func S3ObjectListTags(conn *s3.S3, bucket, key string) (KeyValueTags, error) { var output *s3.GetObjectTaggingOutput - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { var err error output, err = conn.GetObjectTagging(input) if awsErr, ok := err.(awserr.Error); ok { diff --git a/aws/internal/service/kinesisanalytics/waiter/waiter.go b/aws/internal/service/kinesisanalytics/waiter/waiter.go index 79cc43ad6f7..ad63e94285a 100644 --- a/aws/internal/service/kinesisanalytics/waiter/waiter.go +++ b/aws/internal/service/kinesisanalytics/waiter/waiter.go @@ -94,7 +94,7 @@ func ApplicationUpdated(conn *kinesisanalytics.KinesisAnalytics, name string) (* func IAMPropagation(f func() (interface{}, error)) (interface{}, error) { var output interface{} - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = f() diff --git a/aws/internal/service/kinesisanalyticsv2/waiter/waiter.go b/aws/internal/service/kinesisanalyticsv2/waiter/waiter.go index a0cc0faa1a3..78f4d6e0a9a 100644 --- a/aws/internal/service/kinesisanalyticsv2/waiter/waiter.go +++ b/aws/internal/service/kinesisanalyticsv2/waiter/waiter.go @@ -97,7 +97,7 @@ func ApplicationUpdated(conn *kinesisanalyticsv2.KinesisAnalyticsV2, name string func IAMPropagation(f func() (interface{}, error)) (interface{}, error) { var output interface{} - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = f() diff --git a/aws/internal/service/ram/finder/finder.go b/aws/internal/service/ram/finder/finder.go index fdf820606a4..b6df37ffdc1 100644 --- a/aws/internal/service/ram/finder/finder.go +++ b/aws/internal/service/ram/finder/finder.go @@ -43,7 +43,7 @@ func ResourceShareInvitationByResourceShareArnAndStatus(conn *ram.RAM, resourceS var invitation *ram.ResourceShareInvitation // Retry for Ram resource share invitation eventual consistency - err := resource.Retry(FindInvitationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(FindInvitationTimeout, func() *resource.RetryError { i, err := resourceShareInvitationByResourceShareArnAndStatus(conn, resourceShareArn, status) invitation = i @@ -79,7 +79,7 @@ func ResourceShareInvitationByArn(conn *ram.RAM, arn string) (*ram.ResourceShare var invitation *ram.ResourceShareInvitation // Retry for Ram resource share invitation eventual consistency - err := resource.Retry(FindInvitationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(FindInvitationTimeout, func() *resource.RetryError { i, err := resourceShareInvitationByArn(conn, arn) invitation = i @@ -113,7 +113,7 @@ func resourceShare(conn *ram.RAM, input *ram.GetResourceSharesInput) (*ram.Resou var shares *ram.GetResourceSharesOutput // Retry for Ram resource share eventual consistency - err := resource.Retry(FindResourceShareTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(FindResourceShareTimeout, func() *resource.RetryError { ss, err := conn.GetResourceShares(input) shares = ss diff --git a/aws/internal/service/sqs/waiter/waiter.go b/aws/internal/service/sqs/waiter/waiter.go index 0df8bf619ae..72dc9d129a5 100644 --- a/aws/internal/service/sqs/waiter/waiter.go +++ b/aws/internal/service/sqs/waiter/waiter.go @@ -76,7 +76,7 @@ func QueueAttributesPropagated(conn *sqs.SQS, url string, expected map[string]st } var got map[string]string - err := resource.Retry(QueueAttributePropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(QueueAttributePropagationTimeout, func() *resource.RetryError { var err error got, err = finder.QueueAttributesByURL(conn, url) diff --git a/aws/internal/tfresource/retry.go b/aws/internal/tfresource/retry.go index 56b891a4258..77208e5fb33 100644 --- a/aws/internal/tfresource/retry.go +++ b/aws/internal/tfresource/retry.go @@ -6,6 +6,7 @@ import ( "sync" "time" + "github.com/aws/aws-sdk-go/aws/request" "github.com/hashicorp/aws-sdk-go-base/tfawserr" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) @@ -14,7 +15,7 @@ import ( func RetryWhenAwsErrCodeEquals(timeout time.Duration, f func() (interface{}, error), codes ...string) (interface{}, error) { var output interface{} - err := resource.Retry(timeout, func() *resource.RetryError { + err := RetryOnConnectionResetByPeer(timeout, func() *resource.RetryError { var err error output, err = f() @@ -114,3 +115,15 @@ func RetryConfigContext(ctx context.Context, delay time.Duration, delayRand time // more likely to be useful return resultErr } + +func RetryOnConnectionResetByPeer(timeout time.Duration, f resource.RetryFunc) error { + return resource.RetryContext(context.Background(), timeout, func() *resource.RetryError { + err := f() + + if err != nil && !err.Retryable && tfawserr.ErrMessageContains(err.Err, request.ErrCodeRequestError, "read: connection reset by peer") { + return resource.RetryableError(err.Err) + } + + return err + }) +} diff --git a/aws/internal/tfresource/retry_test.go b/aws/internal/tfresource/retry_test.go index 2edbf74723d..0c913d128b9 100644 --- a/aws/internal/tfresource/retry_test.go +++ b/aws/internal/tfresource/retry_test.go @@ -9,6 +9,7 @@ import ( "time" "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/request" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) @@ -97,3 +98,55 @@ func TestRetryConfigContext_error(t *testing.T) { t.Fatal("timeout") } } + +func TestRetryOnConnectionResetByPeer(t *testing.T) { + var retryCount int32 + + testCases := []struct { + Name string + F func() *resource.RetryError + ExpectError bool + }{ + { + Name: "retryable error", + F: func() *resource.RetryError { + if atomic.CompareAndSwapInt32(&retryCount, 0, 1) { + return resource.RetryableError(awserr.New(request.ErrCodeRequestError, "RequestError other", nil)) + } + return nil + }, + ExpectError: false, + }, + { + Name: "non-retryable RequestError read: connection reset by peer should still be retried", + F: func() *resource.RetryError { + if atomic.CompareAndSwapInt32(&retryCount, 0, 1) { + return resource.NonRetryableError(awserr.New(request.ErrCodeRequestError, "RequestError read: connection reset by peer", nil)) + } + return nil + }, + ExpectError: false, + }, + { + Name: "non-retryable other request error", + F: func() *resource.RetryError { + return resource.NonRetryableError(awserr.New(request.ErrCodeRequestError, "RequestError other", nil)) + }, + ExpectError: true, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.Name, func(t *testing.T) { + retryCount = 0 + + err := tfresource.RetryOnConnectionResetByPeer(5*time.Second, testCase.F) + + if testCase.ExpectError && err == nil { + t.Fatal("expected error") + } else if !testCase.ExpectError && err != nil { + t.Fatalf("unexpected error: %s", err) + } + }) + } +} diff --git a/aws/resource_aws_accessanalyzer_analyzer.go b/aws/resource_aws_accessanalyzer_analyzer.go index afc53938bdd..8fed8173292 100644 --- a/aws/resource_aws_accessanalyzer_analyzer.go +++ b/aws/resource_aws_accessanalyzer_analyzer.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) const ( @@ -79,7 +80,7 @@ func resourceAwsAccessAnalyzerAnalyzerCreate(d *schema.ResourceData, meta interf } // Handle Organizations eventual consistency - err := resource.Retry(accessAnalyzerOrganizationCreationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(accessAnalyzerOrganizationCreationTimeout, func() *resource.RetryError { _, err := conn.CreateAnalyzer(input) if isAWSErr(err, accessanalyzer.ErrCodeValidationException, "You must create an organization") { diff --git a/aws/resource_aws_acm_certificate.go b/aws/resource_aws_acm_certificate.go index 56044fe46ea..f860a37cd43 100644 --- a/aws/resource_aws_acm_certificate.go +++ b/aws/resource_aws_acm_certificate.go @@ -309,7 +309,7 @@ func resourceAwsAcmCertificateRead(d *schema.ResourceData, meta interface{}) err CertificateArn: aws.String(d.Id()), } - return resource.Retry(AcmCertificateDnsValidationAssignmentTimeout, func() *resource.RetryError { + return tfresource.RetryOnConnectionResetByPeer(AcmCertificateDnsValidationAssignmentTimeout, func() *resource.RetryError { resp, err := acmconn.DescribeCertificate(params) if !d.IsNewResource() && tfawserr.ErrCodeEquals(err, acm.ErrCodeResourceNotFoundException) { @@ -492,7 +492,7 @@ func resourceAwsAcmCertificateDelete(d *schema.ResourceData, meta interface{}) e CertificateArn: aws.String(d.Id()), } - err := resource.Retry(AcmCertificateCrossServicePropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(AcmCertificateCrossServicePropagationTimeout, func() *resource.RetryError { _, err := acmconn.DeleteCertificate(params) if tfawserr.ErrCodeEquals(err, acm.ErrCodeResourceInUseException) { diff --git a/aws/resource_aws_acm_certificate_validation.go b/aws/resource_aws_acm_certificate_validation.go index e35a802e3af..e2bf4ef9dfb 100644 --- a/aws/resource_aws_acm_certificate_validation.go +++ b/aws/resource_aws_acm_certificate_validation.go @@ -12,6 +12,7 @@ import ( multierror "github.com/hashicorp/go-multierror" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsAcmCertificateValidation() *schema.Resource { @@ -71,7 +72,7 @@ func resourceAwsAcmCertificateValidationCreate(d *schema.ResourceData, meta inte log.Printf("[INFO] No validation_record_fqdns set, skipping check") } - err = resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { resp, err := acmconn.DescribeCertificate(params) if err != nil { @@ -109,7 +110,7 @@ func resourceAwsAcmCertificateCheckValidationRecords(validationRecordFqdns []int } var err error var output *acm.DescribeCertificateOutput - err = resource.Retry(1*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { log.Printf("[DEBUG] Certificate domain validation options empty for %s, retrying", aws.StringValue(cert.CertificateArn)) output, err = conn.DescribeCertificate(input) if err != nil { diff --git a/aws/resource_aws_acmpca_certificate.go b/aws/resource_aws_acmpca_certificate.go index 457a01b3905..363c72faf70 100644 --- a/aws/resource_aws_acmpca_certificate.go +++ b/aws/resource_aws_acmpca_certificate.go @@ -18,6 +18,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/acmpca/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsAcmpcaCertificate() *schema.Resource { @@ -124,7 +125,7 @@ func resourceAwsAcmpcaCertificateCreate(d *schema.ResourceData, meta interface{} } var output *acmpca.IssueCertificateOutput - err = resource.Retry(waiter.CertificateAuthorityActiveTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(waiter.CertificateAuthorityActiveTimeout, func() *resource.RetryError { var err error output, err = conn.IssueCertificate(input) if tfawserr.ErrMessageContains(err, acmpca.ErrCodeInvalidStateException, "The certificate authority is not in a valid state for issuing certificates") { diff --git a/aws/resource_aws_acmpca_certificate_authority.go b/aws/resource_aws_acmpca_certificate_authority.go index c667f22507e..b102a79e935 100644 --- a/aws/resource_aws_acmpca_certificate_authority.go +++ b/aws/resource_aws_acmpca_certificate_authority.go @@ -14,6 +14,7 @@ import ( "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/acmpca/finder" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/acmpca/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsAcmpcaCertificateAuthority() *schema.Resource { @@ -298,7 +299,7 @@ func resourceAwsAcmpcaCertificateAuthorityCreate(d *schema.ResourceData, meta in log.Printf("[DEBUG] Creating ACM PCA Certificate Authority: %s", input) var output *acmpca.CreateCertificateAuthorityOutput - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { var err error output, err = conn.CreateCertificateAuthority(input) if err != nil { diff --git a/aws/resource_aws_ami.go b/aws/resource_aws_ami.go index f30b9ce11d6..afe11dfb547 100644 --- a/aws/resource_aws_ami.go +++ b/aws/resource_aws_ami.go @@ -16,6 +16,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/hashcode" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) const ( @@ -338,7 +339,7 @@ func resourceAwsAmiRead(d *schema.ResourceData, meta interface{}) error { } var res *ec2.DescribeImagesOutput - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { var err error res, err = client.DescribeImages(req) if err != nil { diff --git a/aws/resource_aws_ami_test.go b/aws/resource_aws_ami_test.go index 3d601b90552..4282b663fc0 100644 --- a/aws/resource_aws_ami_test.go +++ b/aws/resource_aws_ami_test.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func TestAccAWSAMI_basic(t *testing.T) { @@ -404,7 +405,7 @@ func testAccCheckAmiExists(n string, ami *ec2.Image) resource.TestCheckFunc { conn := testAccProvider.Meta().(*AWSClient).ec2conn var resp *ec2.DescribeImagesOutput - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { opts := &ec2.DescribeImagesInput{ ImageIds: []*string{aws.String(rs.Primary.ID)}, } diff --git a/aws/resource_aws_api_gateway_account.go b/aws/resource_aws_api_gateway_account.go index ffa32fb3a46..8a47ea13238 100644 --- a/aws/resource_aws_api_gateway_account.go +++ b/aws/resource_aws_api_gateway_account.go @@ -9,6 +9,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsApiGatewayAccount() *schema.Resource { @@ -96,7 +97,7 @@ func resourceAwsApiGatewayAccountUpdate(d *schema.ResourceData, meta interface{} otherErrMsg := "API Gateway could not successfully write to CloudWatch Logs using the ARN specified" var out *apigateway.Account var err error - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { out, err = conn.UpdateAccount(&input) if err != nil { diff --git a/aws/resource_aws_api_gateway_base_path_mapping.go b/aws/resource_aws_api_gateway_base_path_mapping.go index f4b0205ad3d..26fbda395be 100644 --- a/aws/resource_aws_api_gateway_base_path_mapping.go +++ b/aws/resource_aws_api_gateway_base_path_mapping.go @@ -10,6 +10,7 @@ import ( "github.com/aws/aws-sdk-go/service/apigateway" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) const emptyBasePathMappingValue = "(none)" @@ -55,7 +56,7 @@ func resourceAwsApiGatewayBasePathMappingCreate(d *schema.ResourceData, meta int Stage: aws.String(d.Get("stage_name").(string)), } - err := resource.Retry(30*time.Second, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(30*time.Second, func() *resource.RetryError { _, err := conn.CreateBasePathMapping(input) if err != nil { diff --git a/aws/resource_aws_api_gateway_rest_api_test.go b/aws/resource_aws_api_gateway_rest_api_test.go index fba3ed46a5c..f5c863a39c0 100644 --- a/aws/resource_aws_api_gateway_rest_api_test.go +++ b/aws/resource_aws_api_gateway_rest_api_test.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func init() { @@ -36,7 +37,7 @@ func testSweepAPIGatewayRestApis(region string) error { } log.Printf("[INFO] Deleting API Gateway REST API: %s", input) // TooManyRequestsException: Too Many Requests can take over a minute to resolve itself - err := resource.Retry(2*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(2*time.Minute, func() *resource.RetryError { _, err := conn.DeleteRestApi(input) if err != nil { if isAWSErr(err, apigateway.ErrCodeTooManyRequestsException, "") { diff --git a/aws/resource_aws_appautoscaling_policy.go b/aws/resource_aws_appautoscaling_policy.go index 4142fcd6e57..eb03f4716b3 100644 --- a/aws/resource_aws_appautoscaling_policy.go +++ b/aws/resource_aws_appautoscaling_policy.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsAppautoscalingPolicy() *schema.Resource { @@ -210,7 +211,7 @@ func resourceAwsAppautoscalingPolicyCreate(d *schema.ResourceData, meta interfac log.Printf("[DEBUG] ApplicationAutoScaling PutScalingPolicy: %#v", params) var resp *applicationautoscaling.PutScalingPolicyOutput - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error resp, err = conn.PutScalingPolicy(¶ms) if err != nil { @@ -247,7 +248,7 @@ func resourceAwsAppautoscalingPolicyCreate(d *schema.ResourceData, meta interfac func resourceAwsAppautoscalingPolicyRead(d *schema.ResourceData, meta interface{}) error { var p *applicationautoscaling.ScalingPolicy - err := resource.Retry(2*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(2*time.Minute, func() *resource.RetryError { var err error p, err = getAwsAppautoscalingPolicy(d, meta) if err != nil { @@ -302,7 +303,7 @@ func resourceAwsAppautoscalingPolicyUpdate(d *schema.ResourceData, meta interfac } log.Printf("[DEBUG] Application Autoscaling Update Scaling Policy: %#v", params) - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.PutScalingPolicy(¶ms) if err != nil { if isAWSErr(err, applicationautoscaling.ErrCodeFailedResourceAccessException, "") { @@ -342,7 +343,7 @@ func resourceAwsAppautoscalingPolicyDelete(d *schema.ResourceData, meta interfac ServiceNamespace: aws.String(d.Get("service_namespace").(string)), } log.Printf("[DEBUG] Deleting Application AutoScaling Policy opts: %#v", params) - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err = conn.DeleteScalingPolicy(¶ms) if isAWSErr(err, applicationautoscaling.ErrCodeFailedResourceAccessException, "") { diff --git a/aws/resource_aws_appautoscaling_scheduled_action.go b/aws/resource_aws_appautoscaling_scheduled_action.go index 33ff3f8ffde..6133c82f378 100644 --- a/aws/resource_aws_appautoscaling_scheduled_action.go +++ b/aws/resource_aws_appautoscaling_scheduled_action.go @@ -121,7 +121,7 @@ func resourceAwsAppautoscalingScheduledActionPut(d *schema.ResourceData, meta in } if needsPut { - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.PutScheduledAction(input) if err != nil { if tfawserr.ErrCodeEquals(err, applicationautoscaling.ErrCodeObjectNotFoundException) { diff --git a/aws/resource_aws_appautoscaling_target.go b/aws/resource_aws_appautoscaling_target.go index 5ae18ea830c..c504b729377 100644 --- a/aws/resource_aws_appautoscaling_target.go +++ b/aws/resource_aws_appautoscaling_target.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsAppautoscalingTarget() *schema.Resource { @@ -73,7 +74,7 @@ func resourceAwsAppautoscalingTargetPut(d *schema.ResourceData, meta interface{} log.Printf("[DEBUG] Application autoscaling target create configuration %s", targetOpts) var err error - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err = conn.RegisterScalableTarget(&targetOpts) if err != nil { @@ -110,7 +111,7 @@ func resourceAwsAppautoscalingTargetRead(d *schema.ResourceData, meta interface{ namespace := d.Get("service_namespace").(string) dimension := d.Get("scalable_dimension").(string) - err := resource.Retry(2*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(2*time.Minute, func() *resource.RetryError { var err error t, err = getAwsAppautoscalingTarget(d.Id(), namespace, dimension, conn) if err != nil { @@ -163,7 +164,7 @@ func resourceAwsAppautoscalingTargetDelete(d *schema.ResourceData, meta interfac return fmt.Errorf("error deleting Application AutoScaling Target (%s): %w", d.Id(), err) } - return resource.Retry(5*time.Minute, func() *resource.RetryError { + return tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { t, err := getAwsAppautoscalingTarget(d.Get("resource_id").(string), d.Get("service_namespace").(string), d.Get("scalable_dimension").(string), conn) if err != nil { diff --git a/aws/resource_aws_appmesh_gateway_route.go b/aws/resource_aws_appmesh_gateway_route.go index ca0b2412f62..9e11ad762b4 100644 --- a/aws/resource_aws_appmesh_gateway_route.go +++ b/aws/resource_aws_appmesh_gateway_route.go @@ -333,7 +333,7 @@ func resourceAwsAppmeshGatewayRouteRead(d *schema.ResourceData, meta interface{} var gatewayRoute *appmesh.GatewayRouteData - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error gatewayRoute, err = finder.GatewayRoute(conn, d.Get("mesh_name").(string), d.Get("virtual_gateway_name").(string), d.Get("name").(string), d.Get("mesh_owner").(string)) diff --git a/aws/resource_aws_appmesh_mesh.go b/aws/resource_aws_appmesh_mesh.go index 9c603d26ef2..3a2f7fe6c16 100644 --- a/aws/resource_aws_appmesh_mesh.go +++ b/aws/resource_aws_appmesh_mesh.go @@ -136,7 +136,7 @@ func resourceAwsAppmeshMeshRead(d *schema.ResourceData, meta interface{}) error var resp *appmesh.DescribeMeshOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error resp, err = conn.DescribeMesh(req) diff --git a/aws/resource_aws_appmesh_route.go b/aws/resource_aws_appmesh_route.go index 54a38d8b0c1..c1145caad1e 100644 --- a/aws/resource_aws_appmesh_route.go +++ b/aws/resource_aws_appmesh_route.go @@ -743,7 +743,7 @@ func resourceAwsAppmeshRouteRead(d *schema.ResourceData, meta interface{}) error var resp *appmesh.DescribeRouteOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error resp, err = conn.DescribeRoute(req) diff --git a/aws/resource_aws_appmesh_virtual_gateway.go b/aws/resource_aws_appmesh_virtual_gateway.go index 1c252cf38f1..2b5cc7d0a02 100644 --- a/aws/resource_aws_appmesh_virtual_gateway.go +++ b/aws/resource_aws_appmesh_virtual_gateway.go @@ -719,7 +719,7 @@ func resourceAwsAppmeshVirtualGatewayRead(d *schema.ResourceData, meta interface var virtualGateway *appmesh.VirtualGatewayData - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error virtualGateway, err = finder.VirtualGateway(conn, d.Get("mesh_name").(string), d.Get("name").(string), d.Get("mesh_owner").(string)) diff --git a/aws/resource_aws_appmesh_virtual_node.go b/aws/resource_aws_appmesh_virtual_node.go index 14015916546..086beb39dc9 100644 --- a/aws/resource_aws_appmesh_virtual_node.go +++ b/aws/resource_aws_appmesh_virtual_node.go @@ -1099,7 +1099,7 @@ func resourceAwsAppmeshVirtualNodeRead(d *schema.ResourceData, meta interface{}) var resp *appmesh.DescribeVirtualNodeOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error resp, err = conn.DescribeVirtualNode(req) diff --git a/aws/resource_aws_appmesh_virtual_router.go b/aws/resource_aws_appmesh_virtual_router.go index 808afb9c69c..898b311f395 100644 --- a/aws/resource_aws_appmesh_virtual_router.go +++ b/aws/resource_aws_appmesh_virtual_router.go @@ -166,7 +166,7 @@ func resourceAwsAppmeshVirtualRouterRead(d *schema.ResourceData, meta interface{ var resp *appmesh.DescribeVirtualRouterOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error resp, err = conn.DescribeVirtualRouter(req) diff --git a/aws/resource_aws_appmesh_virtual_service.go b/aws/resource_aws_appmesh_virtual_service.go index 2a68730e7ab..b7cc6accdb9 100644 --- a/aws/resource_aws_appmesh_virtual_service.go +++ b/aws/resource_aws_appmesh_virtual_service.go @@ -174,7 +174,7 @@ func resourceAwsAppmeshVirtualServiceRead(d *schema.ResourceData, meta interface var resp *appmesh.DescribeVirtualServiceOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error resp, err = conn.DescribeVirtualService(req) diff --git a/aws/resource_aws_autoscaling_group.go b/aws/resource_aws_autoscaling_group.go index 9587730ed82..018d082e2f0 100644 --- a/aws/resource_aws_autoscaling_group.go +++ b/aws/resource_aws_autoscaling_group.go @@ -28,6 +28,7 @@ import ( "github.com/terraform-providers/terraform-provider-aws/aws/internal/naming" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/autoscaling/waiter" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) const ( @@ -750,7 +751,7 @@ func resourceAwsAutoscalingGroupCreate(d *schema.ResourceData, meta interface{}) log.Printf("[DEBUG] Auto Scaling Group create configuration: %#v", createOpts) // Retry for IAM eventual consistency - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.CreateAutoScalingGroup(&createOpts) // ValidationError: You must use a valid fully-formed launch template. Value (tf-acc-test-6643732652421074386) for parameter iamInstanceProfile.name is invalid. Invalid IAM Instance Profile name @@ -1382,7 +1383,7 @@ func resourceAwsAutoscalingGroupDelete(d *schema.ResourceData, meta interface{}) // We retry the delete operation to handle InUse/InProgress errors coming // from scaling operations. We should be able to sneak in a delete in between // scaling operations within 5m. - err = resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { if _, err := conn.DeleteAutoScalingGroup(&deleteopts); err != nil { if awserr, ok := err.(awserr.Error); ok { switch awserr.Code() { @@ -1411,7 +1412,7 @@ func resourceAwsAutoscalingGroupDelete(d *schema.ResourceData, meta interface{}) } var group *autoscaling.Group - err = resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { group, err = getAwsAutoscalingGroup(d.Id(), conn) if group != nil { @@ -1452,7 +1453,7 @@ func resourceAutoScalingGroupWarmPoolDelete(g *autoscaling.Group, d *schema.Reso ForceDelete: aws.Bool(d.Get("force_delete").(bool) || d.Get("force_delete_warm_pool").(bool)), } - err := resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { if _, err := conn.DeleteWarmPool(&deleteopts); err != nil { if callerr, ok := err.(awserr.Error); ok { switch callerr.Code() { @@ -1561,7 +1562,7 @@ func resourceAwsAutoscalingGroupWarmPoolDrain(d *schema.ResourceData, meta inter // Next, wait for the Warm Pool to drain log.Printf("[DEBUG] Waiting for warm pool to have zero instances") var p *autoscaling.DescribeWarmPoolOutput - err := resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { p, err := getAwsAutoscalingGroupWarmPool(d.Id(), conn) if err != nil { return resource.NonRetryableError(err) @@ -1645,7 +1646,7 @@ func resourceAwsAutoscalingGroupDrain(d *schema.ResourceData, meta interface{}) // Next, wait for the Auto Scaling Group to drain log.Printf("[DEBUG] Waiting for group to have zero instances") var g *autoscaling.Group - err := resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { g, err := getAwsAutoscalingGroup(d.Id(), conn) if err != nil { return resource.NonRetryableError(err) @@ -2216,7 +2217,7 @@ func expandAutoScalingGroupInstanceRefreshPreferences(l []interface{}) *autoscal func autoScalingGroupRefreshInstances(conn *autoscaling.AutoScaling, asgName string, refreshConfig []interface{}) error { input := createAutoScalingGroupInstanceRefreshInput(asgName, refreshConfig) - err := resource.Retry(waiter.InstanceRefreshStartedTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.InstanceRefreshStartedTimeout, func() *resource.RetryError { _, err := conn.StartInstanceRefresh(input) if tfawserr.ErrCodeEquals(err, autoscaling.ErrCodeInstanceRefreshInProgressFault) { cancelErr := cancelAutoscalingInstanceRefresh(conn, asgName) diff --git a/aws/resource_aws_autoscaling_group_test.go b/aws/resource_aws_autoscaling_group_test.go index 62897a65e9f..8ae1bf8649c 100644 --- a/aws/resource_aws_autoscaling_group_test.go +++ b/aws/resource_aws_autoscaling_group_test.go @@ -19,6 +19,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" "github.com/terraform-providers/terraform-provider-aws/aws/internal/naming" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func init() { @@ -63,7 +64,7 @@ func testSweepAutoscalingGroups(region string) error { ForceDelete: aws.Bool(true), } - err = resource.Retry(5*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { if _, err := conn.DeleteAutoScalingGroup(&deleteopts); err != nil { if awserr, ok := err.(awserr.Error); ok { switch awserr.Code() { diff --git a/aws/resource_aws_autoscaling_group_waiting.go b/aws/resource_aws_autoscaling_group_waiting.go index 4a432d149a1..28be0253754 100644 --- a/aws/resource_aws_autoscaling_group_waiting.go +++ b/aws/resource_aws_autoscaling_group_waiting.go @@ -11,6 +11,7 @@ import ( "github.com/aws/aws-sdk-go/service/autoscaling" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) // waitForASGCapacityTimeout gathers the current numbers of healthy instances @@ -35,7 +36,7 @@ func waitForASGCapacity( log.Printf("[DEBUG] Waiting on %s for capacity...", d.Id()) - err = resource.Retry(wait, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(wait, func() *resource.RetryError { g, err := getAwsAutoscalingGroup(d.Id(), meta.(*AWSClient).autoscalingconn) if err != nil { return resource.NonRetryableError(err) diff --git a/aws/resource_aws_autoscaling_lifecycle_hook.go b/aws/resource_aws_autoscaling_lifecycle_hook.go index 9249ef9b5b4..7bfae237408 100644 --- a/aws/resource_aws_autoscaling_lifecycle_hook.go +++ b/aws/resource_aws_autoscaling_lifecycle_hook.go @@ -11,6 +11,7 @@ import ( "github.com/aws/aws-sdk-go/service/autoscaling" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsAutoscalingLifecycleHook() *schema.Resource { @@ -65,7 +66,7 @@ func resourceAwsAutoscalingLifecycleHook() *schema.Resource { func resourceAwsAutoscalingLifecycleHookPutOp(conn *autoscaling.AutoScaling, params *autoscaling.PutLifecycleHookInput) error { log.Printf("[DEBUG] AutoScaling PutLifecyleHook: %s", params) - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.PutLifecycleHook(params) if err != nil { diff --git a/aws/resource_aws_autoscaling_policy_test.go b/aws/resource_aws_autoscaling_policy_test.go index 61294e13d46..e6193531149 100644 --- a/aws/resource_aws_autoscaling_policy_test.go +++ b/aws/resource_aws_autoscaling_policy_test.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func TestAccAWSAutoscalingPolicy_basic(t *testing.T) { @@ -270,7 +271,7 @@ func testAccCheckScalingPolicyDisappears(conf *autoscaling.ScalingPolicy) resour return err } - return resource.Retry(10*time.Minute, func() *resource.RetryError { + return tfresource.RetryOnConnectionResetByPeer(10*time.Minute, func() *resource.RetryError { params := &autoscaling.DescribePoliciesInput{ AutoScalingGroupName: conf.AutoScalingGroupName, PolicyNames: []*string{conf.PolicyName}, diff --git a/aws/resource_aws_backup_plan.go b/aws/resource_aws_backup_plan.go index 50cb8f9bc59..52556025758 100644 --- a/aws/resource_aws_backup_plan.go +++ b/aws/resource_aws_backup_plan.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/hashcode" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsBackupPlan() *schema.Resource { @@ -272,7 +273,7 @@ func resourceAwsBackupPlanDelete(d *schema.ResourceData, meta interface{}) error } log.Printf("[DEBUG] Deleting Backup Plan: %s", d.Id()) - err := resource.Retry(2*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(2*time.Minute, func() *resource.RetryError { _, err := conn.DeleteBackupPlan(input) if isAWSErr(err, backup.ErrCodeInvalidRequestException, "Related backup plan selections must be deleted prior to backup") { diff --git a/aws/resource_aws_backup_selection.go b/aws/resource_aws_backup_selection.go index eac3f169163..ba6df5602f6 100644 --- a/aws/resource_aws_backup_selection.go +++ b/aws/resource_aws_backup_selection.go @@ -101,7 +101,7 @@ func resourceAwsBackupSelectionCreate(d *schema.ResourceData, meta interface{}) // Retry for IAM eventual consistency var output *backup.CreateBackupSelectionOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.CreateBackupSelection(input) @@ -149,7 +149,7 @@ func resourceAwsBackupSelectionRead(d *schema.ResourceData, meta interface{}) er var resp *backup.GetBackupSelectionOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error resp, err = conn.GetBackupSelection(input) diff --git a/aws/resource_aws_cloud9_environment_ec2.go b/aws/resource_aws_cloud9_environment_ec2.go index f2530ece447..15306e17d8c 100644 --- a/aws/resource_aws_cloud9_environment_ec2.go +++ b/aws/resource_aws_cloud9_environment_ec2.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsCloud9EnvironmentEc2() *schema.Resource { @@ -97,7 +98,7 @@ func resourceAwsCloud9EnvironmentEc2Create(d *schema.ResourceData, meta interfac } var out *cloud9.CreateEnvironmentEC2Output - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error out, err = conn.CreateEnvironmentEC2(params) if err != nil { @@ -250,7 +251,7 @@ func resourceAwsCloud9EnvironmentEc2Delete(d *schema.ResourceData, meta interfac EnvironmentIds: []*string{aws.String(d.Id())}, } var out *cloud9.DescribeEnvironmentsOutput - err = resource.Retry(20*time.Minute, func() *resource.RetryError { // Deleting instances can take a long time + err = tfresource.RetryOnConnectionResetByPeer(20*time.Minute, func() *resource.RetryError { // Deleting instances can take a long time out, err = conn.DescribeEnvironments(input) if err != nil { if isAWSErr(err, cloud9.ErrCodeNotFoundException, "") { diff --git a/aws/resource_aws_cloud9_environment_ec2_test.go b/aws/resource_aws_cloud9_environment_ec2_test.go index de8e3d6c532..1722dc7660c 100644 --- a/aws/resource_aws_cloud9_environment_ec2_test.go +++ b/aws/resource_aws_cloud9_environment_ec2_test.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func TestAccAWSCloud9EnvironmentEc2_basic(t *testing.T) { @@ -226,7 +227,7 @@ func testAccCheckAWSCloud9EnvironmentEc2Disappears(res *cloud9.Environment) reso EnvironmentIds: []*string{res.Id}, } var out *cloud9.DescribeEnvironmentsOutput - err = resource.Retry(20*time.Minute, func() *resource.RetryError { // Deleting instances can take a long time + err = tfresource.RetryOnConnectionResetByPeer(20*time.Minute, func() *resource.RetryError { // Deleting instances can take a long time out, err = conn.DescribeEnvironments(input) if err != nil { if isAWSErr(err, cloud9.ErrCodeNotFoundException, "") { diff --git a/aws/resource_aws_cloudformation_stack_set_instance.go b/aws/resource_aws_cloudformation_stack_set_instance.go index 9c11dfcea82..666ed091e57 100644 --- a/aws/resource_aws_cloudformation_stack_set_instance.go +++ b/aws/resource_aws_cloudformation_stack_set_instance.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/cloudformation/waiter" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsCloudFormationStackSetInstance() *schema.Resource { @@ -96,7 +97,7 @@ func resourceAwsCloudFormationStackSetInstanceCreate(d *schema.ResourceData, met } log.Printf("[DEBUG] Creating CloudFormation StackSet Instance: %s", input) - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { output, err := conn.CreateStackInstances(input) if err != nil { diff --git a/aws/resource_aws_cloudfront_distribution.go b/aws/resource_aws_cloudfront_distribution.go index e69fcfeeeaf..24d1449c738 100644 --- a/aws/resource_aws_cloudfront_distribution.go +++ b/aws/resource_aws_cloudfront_distribution.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsCloudFrontDistribution() *schema.Resource { @@ -810,7 +811,7 @@ func resourceAwsCloudFrontDistributionCreate(d *schema.ResourceData, meta interf var resp *cloudfront.CreateDistributionWithTagsOutput // Handle eventual consistency issues - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { var err error resp, err = conn.CreateDistributionWithTags(params) @@ -915,7 +916,7 @@ func resourceAwsCloudFrontDistributionUpdate(d *schema.ResourceData, meta interf } // Handle eventual consistency issues - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := conn.UpdateDistribution(params) // ACM and IAM certificate eventual consistency @@ -1083,7 +1084,7 @@ func resourceAwsCloudFrontDistributionDelete(d *schema.ResourceData, meta interf // Occasionally the DeleteDistribution call will return this error as well, in which retries will succeed: // * PreconditionFailed: The request failed because it didn't meet the preconditions in one or more request-header fields if isAWSErr(err, cloudfront.ErrCodeDistributionNotDisabled, "") || isAWSErr(err, cloudfront.ErrCodePreconditionFailed, "") { - err = resource.Retry(2*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(2*time.Minute, func() *resource.RetryError { _, err := conn.DeleteDistribution(deleteDistributionInput) if isAWSErr(err, cloudfront.ErrCodeDistributionNotDisabled, "") { diff --git a/aws/resource_aws_cloudfront_distribution_test.go b/aws/resource_aws_cloudfront_distribution_test.go index 4b3a0cdf8fe..e7b0589420f 100644 --- a/aws/resource_aws_cloudfront_distribution_test.go +++ b/aws/resource_aws_cloudfront_distribution_test.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func init() { @@ -1371,7 +1372,7 @@ func testAccCheckCloudFrontDistributionDisappears(distribution *cloudfront.Distr IfMatch: getDistributionOutput.ETag, } - err = resource.Retry(2*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(2*time.Minute, func() *resource.RetryError { _, err = conn.DeleteDistribution(deleteDistributionInput) if isAWSErr(err, cloudfront.ErrCodeDistributionNotDisabled, "") { diff --git a/aws/resource_aws_cloudtrail.go b/aws/resource_aws_cloudtrail.go index d54fd2043bb..e13fb1342ab 100644 --- a/aws/resource_aws_cloudtrail.go +++ b/aws/resource_aws_cloudtrail.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsCloudTrail() *schema.Resource { @@ -196,7 +197,7 @@ func resourceAwsCloudTrailCreate(d *schema.ResourceData, meta interface{}) error } var t *cloudtrail.CreateTrailOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error t, err = conn.CreateTrail(&input) if err != nil { @@ -389,7 +390,7 @@ func resourceAwsCloudTrailUpdate(d *schema.ResourceData, meta interface{}) error log.Printf("[DEBUG] Updating CloudTrail: %s", input) var t *cloudtrail.UpdateTrailOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error t, err = conn.UpdateTrail(&input) if err != nil { diff --git a/aws/resource_aws_cloudwatch_event_bus_policy.go b/aws/resource_aws_cloudwatch_event_bus_policy.go index b618d07d285..07973f3fcb1 100644 --- a/aws/resource_aws_cloudwatch_event_bus_policy.go +++ b/aws/resource_aws_cloudwatch_event_bus_policy.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" tfevents "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/cloudwatchevents" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsCloudWatchEventBusPolicy() *schema.Resource { @@ -80,7 +81,7 @@ func resourceAwsCloudWatchEventBusPolicyRead(d *schema.ResourceData, meta interf var policy *string // Especially with concurrent PutPermission calls there can be a slight delay - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { log.Printf("[DEBUG] Reading CloudWatch Events bus: %s", input) output, err = conn.DescribeEventBus(&input) if err != nil { diff --git a/aws/resource_aws_cloudwatch_event_permission.go b/aws/resource_aws_cloudwatch_event_permission.go index d97cdd5769e..848fa11b198 100644 --- a/aws/resource_aws_cloudwatch_event_permission.go +++ b/aws/resource_aws_cloudwatch_event_permission.go @@ -15,6 +15,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" tfevents "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/cloudwatchevents" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsCloudWatchEventPermission() *schema.Resource { @@ -121,7 +122,7 @@ func resourceAwsCloudWatchEventPermissionRead(d *schema.ResourceData, meta inter var policyStatement *CloudWatchEventPermissionPolicyStatement // Especially with concurrent PutPermission calls there can be a slight delay - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { log.Printf("[DEBUG] Reading CloudWatch Events bus: %s", input) output, err = conn.DescribeEventBus(&input) if err != nil { diff --git a/aws/resource_aws_cloudwatch_event_permission_test.go b/aws/resource_aws_cloudwatch_event_permission_test.go index 153309ab038..a417eabf13c 100644 --- a/aws/resource_aws_cloudwatch_event_permission_test.go +++ b/aws/resource_aws_cloudwatch_event_permission_test.go @@ -15,6 +15,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" tfevents "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/cloudwatchevents" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func init() { @@ -368,7 +369,7 @@ func testAccCheckCloudWatchEventPermissionDestroy(s *terraform.State) error { input := &events.DescribeEventBusInput{ Name: aws.String(eventBusName), } - err = resource.Retry(1*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { debo, err := conn.DescribeEventBus(input) if isAWSErr(err, events.ErrCodeResourceNotFoundException, "") { return nil diff --git a/aws/resource_aws_cloudwatch_event_rule.go b/aws/resource_aws_cloudwatch_event_rule.go index 771697ee9ee..a06b2cb93b5 100644 --- a/aws/resource_aws_cloudwatch_event_rule.go +++ b/aws/resource_aws_cloudwatch_event_rule.go @@ -17,6 +17,7 @@ import ( tfevents "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/cloudwatchevents" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/cloudwatchevents/finder" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) const ( @@ -120,7 +121,7 @@ func resourceAwsCloudWatchEventRuleCreate(d *schema.ResourceData, meta interface // IAM Roles take some time to propagate var out *events.PutRuleOutput - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { out, err = conn.PutRule(input) if isAWSErr(err, "ValidationException", "cannot be assumed by principal") { @@ -222,7 +223,7 @@ func resourceAwsCloudWatchEventRuleUpdate(d *schema.ResourceData, meta interface log.Printf("[DEBUG] Updating CloudWatch Events Rule: %s", input) // IAM Roles take some time to propagate - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.PutRule(input) if isAWSErr(err, "ValidationException", "cannot be assumed by principal") { @@ -265,7 +266,7 @@ func resourceAwsCloudWatchEventRuleDelete(d *schema.ResourceData, meta interface EventBusName: aws.String(busName), } - err = resource.Retry(cloudWatchEventRuleDeleteRetryTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(cloudWatchEventRuleDeleteRetryTimeout, func() *resource.RetryError { _, err := conn.DeleteRule(input) if isAWSErr(err, "ValidationException", "Rule can't be deleted since it has targets") { diff --git a/aws/resource_aws_cloudwatch_log_destination.go b/aws/resource_aws_cloudwatch_log_destination.go index e986fe0e6a6..a7c884b8994 100644 --- a/aws/resource_aws_cloudwatch_log_destination.go +++ b/aws/resource_aws_cloudwatch_log_destination.go @@ -10,6 +10,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsCloudWatchLogDestination() *schema.Resource { @@ -71,7 +72,7 @@ func resourceAwsCloudWatchLogDestinationPut(d *schema.ResourceData, meta interfa } var err error - err = resource.Retry(3*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(3*time.Minute, func() *resource.RetryError { _, err = conn.PutDestination(params) if isAWSErr(err, cloudwatchlogs.ErrCodeInvalidParameterException, "") { diff --git a/aws/resource_aws_cloudwatch_log_stream.go b/aws/resource_aws_cloudwatch_log_stream.go index 55b205e90b2..8e8d1ec86a0 100644 --- a/aws/resource_aws_cloudwatch_log_stream.go +++ b/aws/resource_aws_cloudwatch_log_stream.go @@ -11,6 +11,7 @@ import ( "github.com/aws/aws-sdk-go/service/cloudwatchlogs" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsCloudWatchLogStream() *schema.Resource { @@ -69,7 +70,7 @@ func resourceAwsCloudWatchLogStreamRead(d *schema.ResourceData, meta interface{} var ls *cloudwatchlogs.LogStream var exists bool - err := resource.Retry(2*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(2*time.Minute, func() *resource.RetryError { var err error ls, exists, err = lookupCloudWatchLogStream(conn, d.Id(), group, nil) if err != nil { diff --git a/aws/resource_aws_cloudwatch_log_subscription_filter.go b/aws/resource_aws_cloudwatch_log_subscription_filter.go index 9ca21dfd244..699a37b682e 100644 --- a/aws/resource_aws_cloudwatch_log_subscription_filter.go +++ b/aws/resource_aws_cloudwatch_log_subscription_filter.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/terraform-providers/terraform-provider-aws/aws/internal/hashcode" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsCloudwatchLogSubscriptionFilter() *schema.Resource { @@ -65,7 +66,7 @@ func resourceAwsCloudwatchLogSubscriptionFilterCreate(d *schema.ResourceData, me params := getAwsCloudWatchLogsSubscriptionFilterInput(d) log.Printf("[DEBUG] Creating SubscriptionFilter %#v", params) - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.PutSubscriptionFilter(¶ms) if isAWSErr(err, cloudwatchlogs.ErrCodeInvalidParameterException, "Could not deliver test message to specified") { @@ -100,7 +101,7 @@ func resourceAwsCloudwatchLogSubscriptionFilterUpdate(d *schema.ResourceData, me log.Printf("[DEBUG] Update SubscriptionFilter %#v", params) - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.PutSubscriptionFilter(¶ms) if isAWSErr(err, cloudwatchlogs.ErrCodeInvalidParameterException, "Could not deliver test message to specified") { diff --git a/aws/resource_aws_codebuild_project.go b/aws/resource_aws_codebuild_project.go index ac1a15326cf..7201d7ab81e 100644 --- a/aws/resource_aws_codebuild_project.go +++ b/aws/resource_aws_codebuild_project.go @@ -17,6 +17,7 @@ import ( "github.com/terraform-providers/terraform-provider-aws/aws/internal/hashcode" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsCodeBuildProject() *schema.Resource { @@ -756,7 +757,7 @@ func resourceAwsCodeBuildProjectCreate(d *schema.ResourceData, meta interface{}) var resp *codebuild.CreateProjectOutput // Handle IAM eventual consistency - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { var err error resp, err = conn.CreateProject(params) @@ -1438,7 +1439,7 @@ func resourceAwsCodeBuildProjectUpdate(d *schema.ResourceData, meta interface{}) params.Tags = tags.IgnoreAws().CodebuildTags() // Handle IAM eventual consistency - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error _, err = conn.UpdateProject(params) diff --git a/aws/resource_aws_codedeploy_deployment_group.go b/aws/resource_aws_codedeploy_deployment_group.go index 24f6625a441..a4e49fd09a0 100644 --- a/aws/resource_aws_codedeploy_deployment_group.go +++ b/aws/resource_aws_codedeploy_deployment_group.go @@ -16,6 +16,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/hashcode" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsCodeDeployDeploymentGroup() *schema.Resource { @@ -549,7 +550,7 @@ func resourceAwsCodeDeployDeploymentGroupCreate(d *schema.ResourceData, meta int var resp *codedeploy.CreateDeploymentGroupOutput var err error - err = resource.Retry(5*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { resp, err = conn.CreateDeploymentGroup(&input) if isAWSErr(err, codedeploy.ErrCodeInvalidRoleException, "") { @@ -778,7 +779,7 @@ func resourceAwsCodeDeployDeploymentGroupUpdate(d *schema.ResourceData, meta int log.Printf("[DEBUG] Updating CodeDeploy DeploymentGroup %s", d.Id()) var err error - err = resource.Retry(5*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err = conn.UpdateDeploymentGroup(&input) if isAWSErr(err, codedeploy.ErrCodeInvalidRoleException, "") { diff --git a/aws/resource_aws_codepipeline.go b/aws/resource_aws_codepipeline.go index 26f60e51dea..8e3f73140d8 100644 --- a/aws/resource_aws_codepipeline.go +++ b/aws/resource_aws_codepipeline.go @@ -17,6 +17,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) const ( @@ -192,7 +193,7 @@ func resourceAwsCodePipelineCreate(d *schema.ResourceData, meta interface{}) err } var resp *codepipeline.CreatePipelineOutput - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error resp, err = conn.CreatePipeline(params) diff --git a/aws/resource_aws_codestarnotifications_notification_rule.go b/aws/resource_aws_codestarnotifications_notification_rule.go index bb7bdd9a6e4..639a1e57d6e 100644 --- a/aws/resource_aws_codestarnotifications_notification_rule.go +++ b/aws/resource_aws_codestarnotifications_notification_rule.go @@ -230,7 +230,7 @@ func cleanupCodeStarNotificationsNotificationRuleTargets(conn *codestarnotificat TargetAddress: aws.String(target["address"].(string)), } - err := resource.Retry(codestarNotificationsTargetSubscriptionTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(codestarNotificationsTargetSubscriptionTimeout, func() *resource.RetryError { _, err := conn.DeleteTarget(input) if isAWSErr(err, codestarnotifications.ErrCodeValidationException, awsCodeStartNotificationsNotificationRuleErrorSubscribed) { diff --git a/aws/resource_aws_cognito_user_pool.go b/aws/resource_aws_cognito_user_pool.go index a347a222c27..b614bd0b4d8 100644 --- a/aws/resource_aws_cognito_user_pool.go +++ b/aws/resource_aws_cognito_user_pool.go @@ -16,6 +16,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsCognitoUserPool() *schema.Resource { @@ -727,7 +728,7 @@ func resourceAwsCognitoUserPoolCreate(d *schema.ResourceData, meta interface{}) // IAM roles & policies can take some time to propagate and be attached // to the User Pool var resp *cognitoidentityprovider.CreateUserPoolOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error resp, err = conn.CreateUserPool(params) if isAWSErr(err, cognitoidentityprovider.ErrCodeInvalidSmsRoleTrustRelationshipException, "Role does not have a trust relationship allowing Cognito to assume the role") { @@ -770,7 +771,7 @@ func resourceAwsCognitoUserPoolCreate(d *schema.ResourceData, meta interface{}) } // IAM Roles and Policies can take some time to propagate - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.SetUserPoolMfaConfig(input) if isAWSErr(err, cognitoidentityprovider.ErrCodeInvalidSmsRoleTrustRelationshipException, "Role does not have a trust relationship allowing Cognito to assume the role") { @@ -973,7 +974,7 @@ func resourceAwsCognitoUserPoolUpdate(d *schema.ResourceData, meta interface{}) } // IAM Roles and Policies can take some time to propagate - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.SetUserPoolMfaConfig(input) if isAWSErr(err, cognitoidentityprovider.ErrCodeInvalidSmsRoleTrustRelationshipException, "Role does not have a trust relationship allowing Cognito to assume the role") { @@ -1146,7 +1147,7 @@ func resourceAwsCognitoUserPoolUpdate(d *schema.ResourceData, meta interface{}) // IAM roles & policies can take some time to propagate and be attached // to the User Pool. - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error _, err = conn.UpdateUserPool(params) if isAWSErr(err, cognitoidentityprovider.ErrCodeInvalidSmsRoleTrustRelationshipException, "Role does not have a trust relationship allowing Cognito to assume the role") { diff --git a/aws/resource_aws_config_config_rule.go b/aws/resource_aws_config_config_rule.go index 874151edefa..5116e628cbb 100644 --- a/aws/resource_aws_config_config_rule.go +++ b/aws/resource_aws_config_config_rule.go @@ -15,6 +15,7 @@ import ( "github.com/terraform-providers/terraform-provider-aws/aws/internal/hashcode" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsConfigConfigRule() *schema.Resource { @@ -172,7 +173,7 @@ func resourceAwsConfigConfigRulePut(d *schema.ResourceData, meta interface{}) er Tags: tags.IgnoreAws().ConfigserviceTags(), } log.Printf("[DEBUG] Creating AWSConfig config rule: %s", input) - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.PutConfigRule(&input) if err != nil { if awsErr, ok := err.(awserr.Error); ok { @@ -283,7 +284,7 @@ func resourceAwsConfigConfigRuleDelete(d *schema.ResourceData, meta interface{}) input := &configservice.DeleteConfigRuleInput{ ConfigRuleName: aws.String(name), } - err := resource.Retry(2*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(2*time.Minute, func() *resource.RetryError { _, err := conn.DeleteConfigRule(input) if err != nil { if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "ResourceInUseException" { diff --git a/aws/resource_aws_config_conformance_pack.go b/aws/resource_aws_config_conformance_pack.go index 07177c873a9..67732f2e79a 100644 --- a/aws/resource_aws_config_conformance_pack.go +++ b/aws/resource_aws_config_conformance_pack.go @@ -178,7 +178,7 @@ func resourceAwsConfigConformancePackDelete(d *schema.ResourceData, meta interfa ConformancePackName: aws.String(d.Id()), } - err := resource.Retry(ConfigConformancePackDeleteTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(ConfigConformancePackDeleteTimeout, func() *resource.RetryError { _, err := conn.DeleteConformancePack(input) if err != nil { diff --git a/aws/resource_aws_config_delivery_channel.go b/aws/resource_aws_config_delivery_channel.go index de55d601472..422497e9f6d 100644 --- a/aws/resource_aws_config_delivery_channel.go +++ b/aws/resource_aws_config_delivery_channel.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsConfigDeliveryChannel() *schema.Resource { @@ -93,7 +94,7 @@ func resourceAwsConfigDeliveryChannelPut(d *schema.ResourceData, meta interface{ input := configservice.PutDeliveryChannelInput{DeliveryChannel: &channel} - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.PutDeliveryChannel(&input) if err == nil { return nil @@ -166,7 +167,7 @@ func resourceAwsConfigDeliveryChannelDelete(d *schema.ResourceData, meta interfa DeliveryChannelName: aws.String(d.Id()), } - err := resource.Retry(30*time.Second, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(30*time.Second, func() *resource.RetryError { _, err := conn.DeleteDeliveryChannel(&input) if err != nil { if isAWSErr(err, configservice.ErrCodeLastDeliveryChannelDeleteFailedException, "there is a running configuration recorder") { diff --git a/aws/resource_aws_config_delivery_channel_test.go b/aws/resource_aws_config_delivery_channel_test.go index 741e1add713..107793d0a78 100644 --- a/aws/resource_aws_config_delivery_channel_test.go +++ b/aws/resource_aws_config_delivery_channel_test.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func init() { @@ -32,7 +33,7 @@ func testSweepConfigDeliveryChannels(region string) error { req := &configservice.DescribeDeliveryChannelsInput{} var resp *configservice.DescribeDeliveryChannelsOutput - err = resource.Retry(1*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { var err error resp, err = conn.DescribeDeliveryChannels(req) if err != nil { diff --git a/aws/resource_aws_config_remediation_configuration.go b/aws/resource_aws_config_remediation_configuration.go index a7bde0e65fc..81518de5095 100644 --- a/aws/resource_aws_config_remediation_configuration.go +++ b/aws/resource_aws_config_remediation_configuration.go @@ -226,7 +226,7 @@ func resourceAwsConfigRemediationConfigurationDelete(d *schema.ResourceData, met } log.Printf("[DEBUG] Deleting AWS Config remediation configurations for rule %q", name) - err := resource.Retry(configRemediationConfigurationDeletionTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(configRemediationConfigurationDeletionTimeout, func() *resource.RetryError { _, err := conn.DeleteRemediationConfiguration(input) if tfawserr.ErrCodeEquals(err, configservice.ErrCodeResourceInUseException) { diff --git a/aws/resource_aws_customer_gateway.go b/aws/resource_aws_customer_gateway.go index 956c8ecb526..28667522f5e 100644 --- a/aws/resource_aws_customer_gateway.go +++ b/aws/resource_aws_customer_gateway.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsCustomerGateway() *schema.Resource { @@ -306,7 +307,7 @@ func resourceAwsCustomerGatewayDelete(d *schema.ResourceData, meta interface{}) input := &ec2.DescribeCustomerGatewaysInput{ Filters: []*ec2.Filter{gatewayFilter}, } - err = resource.Retry(5*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { resp, err := conn.DescribeCustomerGateways(input) if err != nil { diff --git a/aws/resource_aws_datapipeline_pipeline.go b/aws/resource_aws_datapipeline_pipeline.go index ce198036fe6..689faacb1b1 100644 --- a/aws/resource_aws_datapipeline_pipeline.go +++ b/aws/resource_aws_datapipeline_pipeline.go @@ -10,6 +10,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsDataPipelinePipeline() *schema.Resource { @@ -164,7 +165,7 @@ func waitForDataPipelineDeletion(conn *datapipeline.DataPipeline, pipelineID str params := &datapipeline.DescribePipelinesInput{ PipelineIds: []*string{aws.String(pipelineID)}, } - return resource.Retry(10*time.Minute, func() *resource.RetryError { + return tfresource.RetryOnConnectionResetByPeer(10*time.Minute, func() *resource.RetryError { _, err := conn.DescribePipelines(params) if isAWSErr(err, datapipeline.ErrCodePipelineNotFoundException, "") || isAWSErr(err, datapipeline.ErrCodePipelineDeletedException, "") { return nil diff --git a/aws/resource_aws_datasync_agent.go b/aws/resource_aws_datasync_agent.go index 244b23ea8d4..178711c0518 100644 --- a/aws/resource_aws_datasync_agent.go +++ b/aws/resource_aws_datasync_agent.go @@ -117,7 +117,7 @@ func resourceAwsDataSyncAgentCreate(d *schema.ResourceData, meta interface{}) er } var response *http.Response - err = resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { log.Printf("[DEBUG] Making HTTP request: %s", request.URL.String()) response, err = client.Do(request) diff --git a/aws/resource_aws_datasync_location_s3.go b/aws/resource_aws_datasync_location_s3.go index 27bb510e251..1956fe3e747 100644 --- a/aws/resource_aws_datasync_location_s3.go +++ b/aws/resource_aws_datasync_location_s3.go @@ -13,6 +13,7 @@ import ( "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" tfdatasync "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/datasync" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsDataSyncLocationS3() *schema.Resource { @@ -115,7 +116,7 @@ func resourceAwsDataSyncLocationS3Create(d *schema.ResourceData, meta interface{ log.Printf("[DEBUG] Creating DataSync Location S3: %s", input) var output *datasync.CreateLocationS3Output - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.CreateLocationS3(input) diff --git a/aws/resource_aws_dax_cluster.go b/aws/resource_aws_dax_cluster.go index 1a564d83862..56b52f56558 100644 --- a/aws/resource_aws_dax_cluster.go +++ b/aws/resource_aws_dax_cluster.go @@ -15,6 +15,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsDaxCluster() *schema.Resource { @@ -229,7 +230,7 @@ func resourceAwsDaxClusterCreate(d *schema.ResourceData, meta interface{}) error // IAM roles take some time to propagate var resp *dax.CreateClusterOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error resp, err = conn.CreateCluster(req) if err != nil { @@ -500,7 +501,7 @@ func resourceAwsDaxClusterDelete(d *schema.ResourceData, meta interface{}) error req := &dax.DeleteClusterInput{ ClusterName: aws.String(d.Id()), } - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.DeleteCluster(req) if err != nil { if isAWSErr(err, dax.ErrCodeInvalidClusterStateFault, "") { diff --git a/aws/resource_aws_db_cluster_snapshot.go b/aws/resource_aws_db_cluster_snapshot.go index 4da0d953054..3670c50b6b3 100644 --- a/aws/resource_aws_db_cluster_snapshot.go +++ b/aws/resource_aws_db_cluster_snapshot.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) const rdsDbClusterSnapshotCreateTimeout = 2 * time.Minute @@ -121,7 +122,7 @@ func resourceAwsDbClusterSnapshotCreate(d *schema.ResourceData, meta interface{} Tags: tags.IgnoreAws().RdsTags(), } - err := resource.Retry(rdsDbClusterSnapshotCreateTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(rdsDbClusterSnapshotCreateTimeout, func() *resource.RetryError { _, err := conn.CreateDBClusterSnapshot(params) if err != nil { if isAWSErr(err, rds.ErrCodeInvalidDBClusterStateFault, "") { diff --git a/aws/resource_aws_db_instance.go b/aws/resource_aws_db_instance.go index 79458ce4c7a..818082f7fbf 100644 --- a/aws/resource_aws_db_instance.go +++ b/aws/resource_aws_db_instance.go @@ -16,6 +16,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsDbInstance() *schema.Resource { @@ -780,7 +781,7 @@ func resourceAwsDbInstanceCreate(d *schema.ResourceData, meta interface{}) error log.Printf("[DEBUG] DB Instance S3 Restore configuration: %#v", opts) var err error // Retry for IAM eventual consistency - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err = conn.RestoreDBInstanceFromS3(&opts) if err != nil { if isAWSErr(err, "InvalidParameterValue", "ENHANCED_MONITORING") { @@ -1249,7 +1250,7 @@ func resourceAwsDbInstanceCreate(d *schema.ResourceData, meta interface{}) error log.Printf("[DEBUG] DB Instance create configuration: %#v", opts) var err error var createdDBInstanceOutput *rds.CreateDBInstanceOutput - err = resource.Retry(5*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { createdDBInstanceOutput, err = conn.CreateDBInstance(&opts) if err != nil { if isAWSErr(err, "InvalidParameterValue", "ENHANCED_MONITORING") { @@ -1714,7 +1715,7 @@ func resourceAwsDbInstanceUpdate(d *schema.ResourceData, meta interface{}) error if requestUpdate { log.Printf("[DEBUG] DB Instance Modification request: %s", req) - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.ModifyDBInstance(req) // Retry for IAM eventual consistency diff --git a/aws/resource_aws_db_option_group.go b/aws/resource_aws_db_option_group.go index b25c26a28e6..8c21a0245d6 100644 --- a/aws/resource_aws_db_option_group.go +++ b/aws/resource_aws_db_option_group.go @@ -14,6 +14,7 @@ import ( "github.com/terraform-providers/terraform-provider-aws/aws/internal/hashcode" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsDbOptionGroup() *schema.Resource { @@ -281,7 +282,7 @@ func resourceAwsDbOptionGroupUpdate(d *schema.ResourceData, meta interface{}) er log.Printf("[DEBUG] Modify DB Option Group: %s", modifyOpts) - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error _, err = rdsconn.ModifyOptionGroup(modifyOpts) @@ -322,7 +323,7 @@ func resourceAwsDbOptionGroupDelete(d *schema.ResourceData, meta interface{}) er } log.Printf("[DEBUG] Delete DB Option Group: %#v", deleteOpts) - err := resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { _, err := rdsconn.DeleteOptionGroup(deleteOpts) if err != nil { if isAWSErr(err, rds.ErrCodeInvalidOptionGroupStateFault, "") { diff --git a/aws/resource_aws_db_option_group_test.go b/aws/resource_aws_db_option_group_test.go index 9be1e1d2d2c..2678ae14b61 100644 --- a/aws/resource_aws_db_option_group_test.go +++ b/aws/resource_aws_db_option_group_test.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func init() { @@ -52,7 +53,7 @@ func testSweepDbOptionGroups(region string) error { OptionGroupName: og.OptionGroupName, } - ret := resource.Retry(1*time.Minute, func() *resource.RetryError { + ret := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := conn.DeleteOptionGroup(deleteOpts) if err != nil { if isAWSErr(err, rds.ErrCodeInvalidOptionGroupStateFault, "") { diff --git a/aws/resource_aws_db_parameter_group.go b/aws/resource_aws_db_parameter_group.go index b3142204a29..629155de6c9 100644 --- a/aws/resource_aws_db_parameter_group.go +++ b/aws/resource_aws_db_parameter_group.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/terraform-providers/terraform-provider-aws/aws/internal/hashcode" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsDbParameterGroup() *schema.Resource { @@ -356,7 +357,7 @@ func resourceAwsDbParameterGroupDelete(d *schema.ResourceData, meta interface{}) deleteOpts := rds.DeleteDBParameterGroupInput{ DBParameterGroupName: aws.String(d.Id()), } - err := resource.Retry(3*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(3*time.Minute, func() *resource.RetryError { _, err := conn.DeleteDBParameterGroup(&deleteOpts) if err != nil { if isAWSErr(err, "DBParameterGroupNotFoundFault", "") || isAWSErr(err, "InvalidDBParameterGroupState", "") { diff --git a/aws/resource_aws_dms_endpoint.go b/aws/resource_aws_dms_endpoint.go index b747aa67249..28c89d75285 100644 --- a/aws/resource_aws_dms_endpoint.go +++ b/aws/resource_aws_dms_endpoint.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsDmsEndpoint() *schema.Resource { @@ -441,7 +442,7 @@ func resourceAwsDmsEndpointCreate(d *schema.ResourceData, meta interface{}) erro log.Println("[DEBUG] DMS create endpoint:", request) - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.CreateEndpoint(request) if isAWSErr(err, "AccessDeniedFault", "") { return resource.RetryableError(err) diff --git a/aws/resource_aws_docdb_cluster.go b/aws/resource_aws_docdb_cluster.go index 420585a7c46..ea3b4ed12c7 100644 --- a/aws/resource_aws_docdb_cluster.go +++ b/aws/resource_aws_docdb_cluster.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsDocDBCluster() *schema.Resource { @@ -341,7 +342,7 @@ func resourceAwsDocDBClusterCreate(d *schema.ResourceData, meta interface{}) err } log.Printf("[DEBUG] DocDB Cluster restore from snapshot configuration: %s", opts) - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.RestoreDBClusterFromSnapshot(&opts) if err != nil { if isAWSErr(err, "InvalidParameterValue", "IAM role ARN value is invalid or does not include the required permissions") { @@ -425,7 +426,7 @@ func resourceAwsDocDBClusterCreate(d *schema.ResourceData, meta interface{}) err log.Printf("[DEBUG] DocDB Cluster create options: %s", createOpts) var resp *docdb.CreateDBClusterOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error resp, err = conn.CreateDBCluster(createOpts) if err != nil { @@ -653,7 +654,7 @@ func resourceAwsDocDBClusterUpdate(d *schema.ResourceData, meta interface{}) err } if requestUpdate { - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.ModifyDBCluster(req) if err != nil { if isAWSErr(err, "InvalidParameterValue", "IAM role ARN value is invalid or does not include the required permissions") { @@ -719,7 +720,7 @@ func resourceAwsDocDBClusterDelete(d *schema.ResourceData, meta interface{}) err log.Printf("[DEBUG] DocDB Cluster delete options: %s", deleteOpts) - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := conn.DeleteDBCluster(&deleteOpts) if err != nil { if isAWSErr(err, docdb.ErrCodeInvalidDBClusterStateFault, "is not currently in the available state") { diff --git a/aws/resource_aws_docdb_cluster_instance.go b/aws/resource_aws_docdb_cluster_instance.go index 71e4c980006..9a32e5fee4e 100644 --- a/aws/resource_aws_docdb_cluster_instance.go +++ b/aws/resource_aws_docdb_cluster_instance.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsDocDBClusterInstance() *schema.Resource { @@ -213,7 +214,7 @@ func resourceAwsDocDBClusterInstanceCreate(d *schema.ResourceData, meta interfac log.Printf("[DEBUG] Creating DocDB Instance opts: %s", createOpts) var resp *docdb.CreateDBInstanceOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error resp, err = conn.CreateDBInstance(createOpts) if err != nil { @@ -379,7 +380,7 @@ func resourceAwsDocDBClusterInstanceUpdate(d *schema.ResourceData, meta interfac log.Printf("[DEBUG] Send DB Instance Modification request: %#v", requestUpdate) if requestUpdate { log.Printf("[DEBUG] DB Instance Modification request: %#v", req) - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.ModifyDBInstance(req) if err != nil { if isAWSErr(err, "InvalidParameterValue", "IAM role ARN value is invalid or does not include the required permissions") { diff --git a/aws/resource_aws_docdb_cluster_instance_test.go b/aws/resource_aws_docdb_cluster_instance_test.go index 2372bb96fd9..930ae2b0dac 100644 --- a/aws/resource_aws_docdb_cluster_instance_test.go +++ b/aws/resource_aws_docdb_cluster_instance_test.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func TestAccAWSDocDBClusterInstance_basic(t *testing.T) { @@ -246,7 +247,7 @@ func testAccAWSDocDBClusterInstanceDisappears(v *docdb.DBInstance) resource.Test if _, err := conn.DeleteDBInstance(opts); err != nil { return err } - return resource.Retry(40*time.Minute, func() *resource.RetryError { + return tfresource.RetryOnConnectionResetByPeer(40*time.Minute, func() *resource.RetryError { opts := &docdb.DescribeDBInstancesInput{ DBInstanceIdentifier: v.DBInstanceIdentifier, } diff --git a/aws/resource_aws_docdb_cluster_parameter_group.go b/aws/resource_aws_docdb_cluster_parameter_group.go index 505c2824c6b..02afc488336 100644 --- a/aws/resource_aws_docdb_cluster_parameter_group.go +++ b/aws/resource_aws_docdb_cluster_parameter_group.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) const docdbClusterParameterGroupMaxParamsBulkEdit = 20 @@ -271,7 +272,7 @@ func waitForDocDBClusterParameterGroupDeletion(conn *docdb.DocDB, name string) e DBClusterParameterGroupName: aws.String(name), } - err := resource.Retry(10*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(10*time.Minute, func() *resource.RetryError { _, err := conn.DescribeDBClusterParameterGroups(params) if isAWSErr(err, docdb.ErrCodeDBParameterGroupNotFoundFault, "") { diff --git a/aws/resource_aws_docdb_subnet_group.go b/aws/resource_aws_docdb_subnet_group.go index 095613151aa..315276dac32 100644 --- a/aws/resource_aws_docdb_subnet_group.go +++ b/aws/resource_aws_docdb_subnet_group.go @@ -10,6 +10,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsDocDBSubnetGroup() *schema.Resource { @@ -218,7 +219,7 @@ func waitForDocDBSubnetGroupDeletion(conn *docdb.DocDB, name string) error { DBSubnetGroupName: aws.String(name), } - err := resource.Retry(10*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(10*time.Minute, func() *resource.RetryError { _, err := conn.DescribeDBSubnetGroups(params) if isAWSErr(err, docdb.ErrCodeDBSubnetGroupNotFoundFault, "") { diff --git a/aws/resource_aws_dx_connection_association.go b/aws/resource_aws_dx_connection_association.go index a4cb6ddb3a8..9c7b6a47749 100644 --- a/aws/resource_aws_dx_connection_association.go +++ b/aws/resource_aws_dx_connection_association.go @@ -8,6 +8,7 @@ import ( "github.com/aws/aws-sdk-go/service/directconnect" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsDxConnectionAssociation() *schema.Resource { @@ -81,7 +82,7 @@ func resourceAwsDxConnectionAssociationDelete(d *schema.ResourceData, meta inter LagId: aws.String(d.Get("lag_id").(string)), } - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := conn.DisassociateConnectionFromLag(input) if err != nil { if isAWSErr(err, directconnect.ErrCodeClientException, "is in a transitioning state.") { diff --git a/aws/resource_aws_dynamodb_table.go b/aws/resource_aws_dynamodb_table.go index 6c89d75b909..261dac95a68 100644 --- a/aws/resource_aws_dynamodb_table.go +++ b/aws/resource_aws_dynamodb_table.go @@ -19,6 +19,7 @@ import ( "github.com/terraform-providers/terraform-provider-aws/aws/internal/hashcode" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/dynamodb/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsDynamoDbTable() *schema.Resource { @@ -391,7 +392,7 @@ func resourceAwsDynamoDbTableCreate(d *schema.ResourceData, meta interface{}) er var output *dynamodb.CreateTableOutput var requiresTagging bool - err := resource.Retry(waiter.CreateTableTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.CreateTableTimeout, func() *resource.RetryError { var err error output, err = conn.CreateTable(req) if err != nil { @@ -849,7 +850,7 @@ func createDynamoDbReplicas(tableName string, tfList []interface{}, conn *dynamo }, } - err := resource.Retry(waiter.ReplicaUpdateTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.ReplicaUpdateTimeout, func() *resource.RetryError { _, err := conn.UpdateTable(input) if err != nil { if isAWSErr(err, "ThrottlingException", "") { @@ -920,7 +921,7 @@ func updateDynamoDbPITR(d *schema.ResourceData, conn *dynamodb.DynamoDB) error { log.Printf("[DEBUG] Updating DynamoDB point in time recovery status to %v", toEnable) - err := resource.Retry(waiter.UpdateTableContinuousBackupsTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.UpdateTableContinuousBackupsTimeout, func() *resource.RetryError { _, err := conn.UpdateContinuousBackups(input) if err != nil { // Backups are still being enabled for this newly created table @@ -1081,7 +1082,7 @@ func deleteDynamoDbTable(tableName string, conn *dynamodb.DynamoDB) error { TableName: aws.String(tableName), } - err := resource.Retry(waiter.DeleteTableTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.DeleteTableTimeout, func() *resource.RetryError { _, err := conn.DeleteTable(input) if err != nil { // Subscriber limit exceeded: Only 10 tables can be created, updated, or deleted simultaneously @@ -1143,7 +1144,7 @@ func deleteDynamoDbReplicas(tableName string, tfList []interface{}, conn *dynamo }, } - err := resource.Retry(waiter.UpdateTableTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.UpdateTableTimeout, func() *resource.RetryError { _, err := conn.UpdateTable(input) if err != nil { if isAWSErr(err, "ThrottlingException", "") { diff --git a/aws/resource_aws_ebs_snapshot.go b/aws/resource_aws_ebs_snapshot.go index 331a776f340..795b9415d78 100644 --- a/aws/resource_aws_ebs_snapshot.go +++ b/aws/resource_aws_ebs_snapshot.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsEbsSnapshot() *schema.Resource { @@ -89,7 +90,7 @@ func resourceAwsEbsSnapshotCreate(d *schema.ResourceData, meta interface{}) erro } var res *ec2.Snapshot - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { var err error res, err = conn.CreateSnapshot(request) @@ -196,7 +197,7 @@ func resourceAwsEbsSnapshotDelete(d *schema.ResourceData, meta interface{}) erro input := &ec2.DeleteSnapshotInput{ SnapshotId: aws.String(d.Id()), } - err := resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { _, err := conn.DeleteSnapshot(input) if err == nil { return nil @@ -220,7 +221,7 @@ func resourceAwsEbsSnapshotWaitForAvailable(d *schema.ResourceData, conn *ec2.EC input := &ec2.DescribeSnapshotsInput{ SnapshotIds: []*string{aws.String(d.Id())}, } - err := resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { err := conn.WaitUntilSnapshotCompleted(input) if err == nil { return nil diff --git a/aws/resource_aws_ebs_snapshot_copy.go b/aws/resource_aws_ebs_snapshot_copy.go index 3852046697c..c0935300da3 100644 --- a/aws/resource_aws_ebs_snapshot_copy.go +++ b/aws/resource_aws_ebs_snapshot_copy.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsEbsSnapshotCopy() *schema.Resource { @@ -171,7 +172,7 @@ func resourceAwsEbsSnapshotCopyDelete(d *schema.ResourceData, meta interface{}) input := &ec2.DeleteSnapshotInput{ SnapshotId: aws.String(d.Id()), } - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.DeleteSnapshot(input) if err == nil { return nil diff --git a/aws/resource_aws_ebs_volume.go b/aws/resource_aws_ebs_volume.go index a087c3564eb..11be349b5bf 100644 --- a/aws/resource_aws_ebs_volume.go +++ b/aws/resource_aws_ebs_volume.go @@ -15,6 +15,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsEbsVolume() *schema.Resource { @@ -317,7 +318,7 @@ func resourceAwsEbsVolumeDelete(d *schema.ResourceData, meta interface{}) error VolumeId: aws.String(d.Id()), } - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.DeleteVolume(input) if isAWSErr(err, "InvalidVolume.NotFound", "") { @@ -348,7 +349,7 @@ func resourceAwsEbsVolumeDelete(d *schema.ResourceData, meta interface{}) error } var output *ec2.DescribeVolumesOutput - err = resource.Retry(5*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { var err error output, err = conn.DescribeVolumes(describeInput) diff --git a/aws/resource_aws_ec2_local_gateway_route.go b/aws/resource_aws_ec2_local_gateway_route.go index 8d637c34e0b..3a2409fea96 100644 --- a/aws/resource_aws_ec2_local_gateway_route.go +++ b/aws/resource_aws_ec2_local_gateway_route.go @@ -10,6 +10,7 @@ import ( "github.com/aws/aws-sdk-go/service/ec2" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) const ( @@ -78,7 +79,7 @@ func resourceAwsEc2LocalGatewayRouteRead(d *schema.ResourceData, meta interface{ } var localGatewayRoute *ec2.LocalGatewayRoute - err = resource.Retry(ec2LocalGatewayRouteEventualConsistencyTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(ec2LocalGatewayRouteEventualConsistencyTimeout, func() *resource.RetryError { var err error localGatewayRoute, err = getEc2LocalGatewayRoute(conn, localGatewayRouteTableID, destination) diff --git a/aws/resource_aws_ec2_transit_gateway.go b/aws/resource_aws_ec2_transit_gateway.go index 2fbe5f88cc1..c5c543e4cf0 100644 --- a/aws/resource_aws_ec2_transit_gateway.go +++ b/aws/resource_aws_ec2_transit_gateway.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsEc2TransitGateway() *schema.Resource { @@ -278,7 +279,7 @@ func resourceAwsEc2TransitGatewayDelete(d *schema.ResourceData, meta interface{} } log.Printf("[DEBUG] Deleting EC2 Transit Gateway (%s): %s", d.Id(), input) - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.DeleteTransitGateway(input) if isAWSErr(err, "IncorrectState", "has non-deleted Transit Gateway Attachments") { diff --git a/aws/resource_aws_ec2_transit_gateway_route.go b/aws/resource_aws_ec2_transit_gateway_route.go index 6f0ba621997..48dc32d2d58 100644 --- a/aws/resource_aws_ec2_transit_gateway_route.go +++ b/aws/resource_aws_ec2_transit_gateway_route.go @@ -10,6 +10,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsEc2TransitGatewayRoute() *schema.Resource { @@ -85,7 +86,7 @@ func resourceAwsEc2TransitGatewayRouteRead(d *schema.ResourceData, meta interfac // Handle EC2 eventual consistency var transitGatewayRoute *ec2.TransitGatewayRoute - err = resource.Retry(1*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { var err error transitGatewayRoute, err = ec2DescribeTransitGatewayRoute(conn, transitGatewayRouteTableID, destination) diff --git a/aws/resource_aws_ec2_transit_gateway_test.go b/aws/resource_aws_ec2_transit_gateway_test.go index 67f1878082a..53282ea3b7e 100644 --- a/aws/resource_aws_ec2_transit_gateway_test.go +++ b/aws/resource_aws_ec2_transit_gateway_test.go @@ -12,6 +12,7 @@ import ( "github.com/aws/aws-sdk-go/service/ec2" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func init() { @@ -59,7 +60,7 @@ func testSweepEc2TransitGateways(region string) error { } log.Printf("[INFO] Deleting EC2 Transit Gateway: %s", id) - err := resource.Retry(2*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(2*time.Minute, func() *resource.RetryError { _, err := conn.DeleteTransitGateway(input) if isAWSErr(err, "IncorrectState", "has non-deleted Transit Gateway Attachments") { diff --git a/aws/resource_aws_ecr_lifecycle_policy.go b/aws/resource_aws_ecr_lifecycle_policy.go index fc2705112e6..e09c04c50da 100644 --- a/aws/resource_aws_ecr_lifecycle_policy.go +++ b/aws/resource_aws_ecr_lifecycle_policy.go @@ -71,7 +71,7 @@ func resourceAwsEcrLifecyclePolicyRead(d *schema.ResourceData, meta interface{}) var resp *ecr.GetLifecyclePolicyOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error resp, err = conn.GetLifecyclePolicy(input) diff --git a/aws/resource_aws_ecr_repository.go b/aws/resource_aws_ecr_repository.go index 942c9b9108d..4840214d5aa 100644 --- a/aws/resource_aws_ecr_repository.go +++ b/aws/resource_aws_ecr_repository.go @@ -154,7 +154,7 @@ func resourceAwsEcrRepositoryRead(d *schema.ResourceData, meta interface{}) erro RepositoryNames: aws.StringSlice([]string{d.Id()}), } - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error out, err = conn.DescribeRepositories(input) @@ -314,7 +314,7 @@ func resourceAwsEcrRepositoryDelete(d *schema.ResourceData, meta interface{}) er input := &ecr.DescribeRepositoriesInput{ RepositoryNames: aws.StringSlice([]string{d.Id()}), } - err = resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { _, err = conn.DescribeRepositories(input) if err != nil { if isAWSErr(err, ecr.ErrCodeRepositoryNotFoundException, "") { diff --git a/aws/resource_aws_ecr_repository_policy.go b/aws/resource_aws_ecr_repository_policy.go index 170cb40ed18..b6bc2df2a52 100644 --- a/aws/resource_aws_ecr_repository_policy.go +++ b/aws/resource_aws_ecr_repository_policy.go @@ -58,7 +58,7 @@ func resourceAwsEcrRepositoryPolicyPut(d *schema.ResourceData, meta interface{}) // Retry due to IAM eventual consistency var err error var out *ecr.SetRepositoryPolicyOutput - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { out, err = conn.SetRepositoryPolicy(&input) if isAWSErr(err, ecr.ErrCodeInvalidParameterException, "Invalid repository policy provided") { @@ -92,7 +92,7 @@ func resourceAwsEcrRepositoryPolicyRead(d *schema.ResourceData, meta interface{} var out *ecr.GetRepositoryPolicyOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error out, err = conn.GetRepositoryPolicy(input) diff --git a/aws/resource_aws_ecrpublic_repository.go b/aws/resource_aws_ecrpublic_repository.go index d7e725f5d9b..edd6607e212 100644 --- a/aws/resource_aws_ecrpublic_repository.go +++ b/aws/resource_aws_ecrpublic_repository.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsEcrPublicRepository() *schema.Resource { @@ -146,7 +147,7 @@ func resourceAwsEcrPublicRepositoryRead(d *schema.ResourceData, meta interface{} } var err error - err = resource.Retry(1*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { out, err = conn.DescribeRepositories(input) if d.IsNewResource() && isAWSErr(err, ecrpublic.ErrCodeRepositoryNotFoundException, "") { return resource.RetryableError(err) @@ -241,7 +242,7 @@ func resourceAwsEcrPublicRepositoryDelete(d *schema.ResourceData, meta interface input := &ecrpublic.DescribeRepositoriesInput{ RepositoryNames: aws.StringSlice([]string{d.Id()}), } - err = resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { _, err = conn.DescribeRepositories(input) if err != nil { if isAWSErr(err, ecrpublic.ErrCodeRepositoryNotFoundException, "") { diff --git a/aws/resource_aws_ecs_capacity_provider.go b/aws/resource_aws_ecs_capacity_provider.go index 244bcab916a..98c75966767 100644 --- a/aws/resource_aws_ecs_capacity_provider.go +++ b/aws/resource_aws_ecs_capacity_provider.go @@ -183,7 +183,7 @@ func resourceAwsEcsCapacityProviderUpdate(d *schema.ResourceData, meta interface } log.Printf("[DEBUG] Updating ECS Capacity Provider: %s", input) - err := resource.Retry(waiter.CapacityProviderUpdateTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.CapacityProviderUpdateTimeout, func() *resource.RetryError { _, err := conn.UpdateCapacityProvider(input) if tfawserr.ErrCodeEquals(err, ecs.ErrCodeUpdateInProgressException) { diff --git a/aws/resource_aws_ecs_cluster.go b/aws/resource_aws_ecs_cluster.go index d25cfab002d..f55805ff84f 100644 --- a/aws/resource_aws_ecs_cluster.go +++ b/aws/resource_aws_ecs_cluster.go @@ -16,6 +16,7 @@ import ( "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/ecs/finder" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/ecs/waiter" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) const ( @@ -198,7 +199,7 @@ func resourceAwsEcsClusterCreate(d *schema.ResourceData, meta interface{}) error // CreateCluster will create the ECS IAM Service Linked Role on first ECS provision // This process does not complete before the initial API call finishes. var out *ecs.CreateClusterOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error out, err = conn.CreateCluster(input) @@ -238,7 +239,7 @@ func resourceAwsEcsClusterRead(d *schema.ResourceData, meta interface{}) error { ignoreTagsConfig := meta.(*AWSClient).IgnoreTagsConfig var out *ecs.DescribeClustersOutput - err := resource.Retry(2*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(2*time.Minute, func() *resource.RetryError { var err error out, err = finder.ClusterByARN(conn, d.Id()) @@ -365,7 +366,7 @@ func resourceAwsEcsClusterUpdate(d *schema.ResourceData, meta interface{}) error DefaultCapacityProviderStrategy: expandEcsCapacityProviderStrategy(d.Get("default_capacity_provider_strategy").(*schema.Set)), } - err := resource.Retry(ecsClusterTimeoutUpdate, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(ecsClusterTimeoutUpdate, func() *resource.RetryError { _, err := conn.PutClusterCapacityProviders(&input) if err != nil { if isAWSErr(err, ecs.ErrCodeClientException, "Cluster was not ACTIVE") { @@ -403,7 +404,7 @@ func resourceAwsEcsClusterDelete(d *schema.ResourceData, meta interface{}) error input := &ecs.DeleteClusterInput{ Cluster: aws.String(d.Id()), } - err := resource.Retry(ecsClusterTimeoutDelete, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(ecsClusterTimeoutDelete, func() *resource.RetryError { _, err := conn.DeleteCluster(input) if err == nil { diff --git a/aws/resource_aws_ecs_service.go b/aws/resource_aws_ecs_service.go index c6f3914d0c4..c4a8ee70d45 100644 --- a/aws/resource_aws_ecs_service.go +++ b/aws/resource_aws_ecs_service.go @@ -527,7 +527,7 @@ func resourceAwsEcsServiceCreate(d *schema.ResourceData, meta interface{}) error log.Printf("[DEBUG] Creating ECS service: %s", input) // Retry due to AWS IAM & ECS eventual consistency - err := resource.Retry(iamwaiter.PropagationTimeout+waiter.ServiceCreateTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout+waiter.ServiceCreateTimeout, func() *resource.RetryError { output, err := conn.CreateService(&input) if err != nil { @@ -1123,7 +1123,7 @@ func resourceAwsEcsServiceUpdate(d *schema.ResourceData, meta interface{}) error if updateService { log.Printf("[DEBUG] Updating ECS Service (%s): %s", d.Id(), input) // Retry due to IAM eventual consistency - err := resource.Retry(iamwaiter.PropagationTimeout+waiter.ServiceUpdateTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout+waiter.ServiceUpdateTimeout, func() *resource.RetryError { _, err := conn.UpdateService(&input) if err != nil { @@ -1217,7 +1217,7 @@ func resourceAwsEcsServiceDelete(d *schema.ResourceData, meta interface{}) error Cluster: aws.String(d.Get("cluster").(string)), } // Wait until the ECS service is drained - err = resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { log.Printf("[DEBUG] Trying to delete ECS service %s", input) _, err := conn.DeleteService(&input) diff --git a/aws/resource_aws_ecs_service_test.go b/aws/resource_aws_ecs_service_test.go index 6c0307ecf3c..b2bc9980b18 100644 --- a/aws/resource_aws_ecs_service_test.go +++ b/aws/resource_aws_ecs_service_test.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func init() { @@ -1290,7 +1291,7 @@ func testAccCheckAWSEcsServiceExists(name string, service *ecs.Service) resource Services: []*string{aws.String(rs.Primary.ID)}, } var output *ecs.DescribeServicesOutput - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { var err error output, err = conn.DescribeServices(input) diff --git a/aws/resource_aws_egress_only_internet_gateway.go b/aws/resource_aws_egress_only_internet_gateway.go index ea9efdd502a..f8933f6a4b6 100644 --- a/aws/resource_aws_egress_only_internet_gateway.go +++ b/aws/resource_aws_egress_only_internet_gateway.go @@ -10,6 +10,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsEgressOnlyInternetGateway() *schema.Resource { @@ -64,7 +65,7 @@ func resourceAwsEgressOnlyInternetGatewayRead(d *schema.ResourceData, meta inter } var resp *ec2.DescribeEgressOnlyInternetGatewaysOutput - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { var err error resp, err = conn.DescribeEgressOnlyInternetGateways(req) if err != nil { diff --git a/aws/resource_aws_eip.go b/aws/resource_aws_eip.go index f6cee736280..d976755d2a4 100644 --- a/aws/resource_aws_eip.go +++ b/aws/resource_aws_eip.go @@ -217,7 +217,7 @@ func resourceAwsEipRead(d *schema.ResourceData, meta interface{}) error { var describeAddresses *ec2.DescribeAddressesOutput if d.IsNewResource() { - err := resource.Retry(d.Timeout(schema.TimeoutRead), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutRead), func() *resource.RetryError { describeAddresses, err = ec2conn.DescribeAddresses(req) if err != nil { awsErr, ok := err.(awserr.Error) @@ -381,7 +381,7 @@ func resourceAwsEipUpdate(d *schema.ResourceData, meta interface{}) error { log.Printf("[DEBUG] EIP associate configuration: %s (domain: %s)", assocOpts, domain) - err := resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { _, err := ec2conn.AssociateAddress(assocOpts) if err != nil { if isAWSErr(err, "InvalidAllocationID.NotFound", "") { @@ -457,7 +457,7 @@ func resourceAwsEipDelete(d *schema.ResourceData, meta interface{}) error { } } - err := resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { var err error _, err = ec2conn.ReleaseAddress(input) @@ -539,7 +539,7 @@ func waitForEc2AddressAssociationClassic(conn *ec2.EC2, publicIP string, instanc }, } - err := resource.Retry(ec2AddressAssociationClassicTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(ec2AddressAssociationClassicTimeout, func() *resource.RetryError { output, err := conn.DescribeAddresses(input) if tfawserr.ErrCodeEquals(err, "InvalidAddress.NotFound") { diff --git a/aws/resource_aws_eip_association.go b/aws/resource_aws_eip_association.go index 9496721b709..64a01691c43 100644 --- a/aws/resource_aws_eip_association.go +++ b/aws/resource_aws_eip_association.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/ec2/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsEipAssociation() *schema.Resource { @@ -94,7 +95,7 @@ func resourceAwsEipAssociationCreate(d *schema.ResourceData, meta interface{}) e log.Printf("[DEBUG] EIP association configuration: %#v", request) var resp *ec2.AssociateAddressOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error resp, err = conn.AssociateAddress(request) @@ -158,7 +159,7 @@ func resourceAwsEipAssociationRead(d *schema.ResourceData, meta interface{}) err } var response *ec2.DescribeAddressesOutput - err = resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error response, err = conn.DescribeAddresses(request) diff --git a/aws/resource_aws_eip_test.go b/aws/resource_aws_eip_test.go index cb746ceffd4..5e31e87e847 100644 --- a/aws/resource_aws_eip_test.go +++ b/aws/resource_aws_eip_test.go @@ -840,7 +840,7 @@ func testAccCheckAWSEIPExists(n string, ec2classic bool, res *ec2.Address) resou var output *ec2.DescribeAddressesOutput - err := resource.Retry(15*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(15*time.Minute, func() *resource.RetryError { var err error output, err = conn.DescribeAddresses(input) diff --git a/aws/resource_aws_eks_cluster.go b/aws/resource_aws_eks_cluster.go index 3c8e1000a47..80346eecbb8 100644 --- a/aws/resource_aws_eks_cluster.go +++ b/aws/resource_aws_eks_cluster.go @@ -259,7 +259,7 @@ func resourceAwsEksClusterCreate(d *schema.ResourceData, meta interface{}) error log.Printf("[DEBUG] Creating EKS Cluster: %s", input) var output *eks.CreateClusterOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.CreateCluster(input) diff --git a/aws/resource_aws_eks_fargate_profile.go b/aws/resource_aws_eks_fargate_profile.go index 509f97bd65f..687f68a41eb 100644 --- a/aws/resource_aws_eks_fargate_profile.go +++ b/aws/resource_aws_eks_fargate_profile.go @@ -125,7 +125,7 @@ func resourceAwsEksFargateProfileCreate(d *schema.ResourceData, meta interface{} awsMutexKV.Lock(mutexKey) defer awsMutexKV.Unlock(mutexKey) - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.CreateFargateProfile(input) // Retry for IAM eventual consistency on error: diff --git a/aws/resource_aws_elastic_beanstalk_application.go b/aws/resource_aws_elastic_beanstalk_application.go index 23310116177..8baa3c71ff5 100644 --- a/aws/resource_aws_elastic_beanstalk_application.go +++ b/aws/resource_aws_elastic_beanstalk_application.go @@ -10,6 +10,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsElasticBeanstalkApplication() *schema.Resource { @@ -220,7 +221,7 @@ func resourceAwsElasticBeanstalkApplicationRead(d *schema.ResourceData, meta int ignoreTagsConfig := meta.(*AWSClient).IgnoreTagsConfig var app *elasticbeanstalk.ApplicationDescription - err := resource.Retry(30*time.Second, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(30*time.Second, func() *resource.RetryError { var err error app, err = getBeanstalkApplication(d.Id(), conn) if err != nil { @@ -288,7 +289,7 @@ func resourceAwsElasticBeanstalkApplicationDelete(d *schema.ResourceData, meta i } var app *elasticbeanstalk.ApplicationDescription - err = resource.Retry(10*time.Second, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(10*time.Second, func() *resource.RetryError { app, err = getBeanstalkApplication(d.Id(), meta.(*AWSClient).elasticbeanstalkconn) if err != nil { return resource.NonRetryableError(err) diff --git a/aws/resource_aws_elasticache_cluster.go b/aws/resource_aws_elasticache_cluster.go index 2988a3e12f5..1e4b3e80d14 100644 --- a/aws/resource_aws_elasticache_cluster.go +++ b/aws/resource_aws_elasticache_cluster.go @@ -690,7 +690,7 @@ func deleteElasticacheCacheCluster(conn *elasticache.ElastiCache, cacheClusterID } log.Printf("[DEBUG] Deleting ElastiCache Cache Cluster: %s", input) - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.DeleteCacheCluster(input) if err != nil { if tfawserr.ErrMessageContains(err, elasticache.ErrCodeInvalidCacheClusterStateFault, "serving as primary") { diff --git a/aws/resource_aws_elasticache_global_replication_group.go b/aws/resource_aws_elasticache_global_replication_group.go index d46e5d46c61..d5bd063f55a 100644 --- a/aws/resource_aws_elasticache_global_replication_group.go +++ b/aws/resource_aws_elasticache_global_replication_group.go @@ -271,7 +271,7 @@ func deleteElasticacheGlobalReplicationGroup(conn *elasticache.ElastiCache, id s RetainPrimaryReplicationGroup: aws.Bool(true), } - err := resource.Retry(readyTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(readyTimeout, func() *resource.RetryError { _, err := conn.DeleteGlobalReplicationGroup(input) if tfawserr.ErrCodeEquals(err, elasticache.ErrCodeGlobalReplicationGroupNotFoundFault) { return resource.NonRetryableError(&resource.NotFoundError{ diff --git a/aws/resource_aws_elasticache_parameter_group.go b/aws/resource_aws_elasticache_parameter_group.go index e3591da50ff..db1a1a75ce9 100644 --- a/aws/resource_aws_elasticache_parameter_group.go +++ b/aws/resource_aws_elasticache_parameter_group.go @@ -15,6 +15,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/terraform-providers/terraform-provider-aws/aws/internal/hashcode" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsElasticacheParameterGroup() *schema.Resource { @@ -291,7 +292,7 @@ func resourceAwsElasticacheParameterGroupDelete(d *schema.ResourceData, meta int deleteOpts := elasticache.DeleteCacheParameterGroupInput{ CacheParameterGroupName: aws.String(d.Id()), } - err := resource.Retry(3*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(3*time.Minute, func() *resource.RetryError { _, err := conn.DeleteCacheParameterGroup(&deleteOpts) if err != nil { awsErr, ok := err.(awserr.Error) @@ -375,7 +376,7 @@ func resourceAwsElastiCacheResetParameterGroup(conn *elasticache.ElastiCache, na CacheParameterGroupName: aws.String(name), ParameterNameValues: parameters, } - return resource.Retry(30*time.Second, func() *resource.RetryError { + return tfresource.RetryOnConnectionResetByPeer(30*time.Second, func() *resource.RetryError { _, err := conn.ResetCacheParameterGroup(&input) if err != nil { if tfawserr.ErrMessageContains(err, elasticache.ErrCodeInvalidCacheParameterGroupStateFault, " has pending changes") { diff --git a/aws/resource_aws_elasticache_replication_group.go b/aws/resource_aws_elasticache_replication_group.go index 831ec9bfd30..af37905adf6 100644 --- a/aws/resource_aws_elasticache_replication_group.go +++ b/aws/resource_aws_elasticache_replication_group.go @@ -737,7 +737,7 @@ func disassociateElasticacheReplicationGroup(conn *elasticache.ElastiCache, glob ReplicationGroupId: aws.String(id), ReplicationGroupRegion: aws.String(region), } - err := resource.Retry(readyTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(readyTimeout, func() *resource.RetryError { _, err := conn.DisassociateGlobalReplicationGroup(input) if tfawserr.ErrCodeEquals(err, elasticache.ErrCodeGlobalReplicationGroupNotFoundFault) { return nil @@ -783,7 +783,7 @@ func deleteElasticacheReplicationGroup(replicationGroupID string, conn *elastica } // 10 minutes should give any creating/deleting cache clusters or snapshots time to complete - err := resource.Retry(10*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(10*time.Minute, func() *resource.RetryError { _, err := conn.DeleteReplicationGroup(input) if isAWSErr(err, elasticache.ErrCodeReplicationGroupNotFoundFault, "") { return nil diff --git a/aws/resource_aws_elasticache_security_group.go b/aws/resource_aws_elasticache_security_group.go index d3e297374c7..5195bf5815b 100644 --- a/aws/resource_aws_elasticache_security_group.go +++ b/aws/resource_aws_elasticache_security_group.go @@ -10,6 +10,7 @@ import ( "github.com/aws/aws-sdk-go/service/elasticache" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsElasticacheSecurityGroup() *schema.Resource { @@ -128,7 +129,7 @@ func resourceAwsElasticacheSecurityGroupDelete(d *schema.ResourceData, meta inte log.Printf("[DEBUG] Cache security group delete: %s", d.Id()) - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.DeleteCacheSecurityGroup(&elasticache.DeleteCacheSecurityGroupInput{ CacheSecurityGroupName: aws.String(d.Id()), }) diff --git a/aws/resource_aws_elasticache_subnet_group.go b/aws/resource_aws_elasticache_subnet_group.go index 5fdd01149b9..4ba34f04920 100644 --- a/aws/resource_aws_elasticache_subnet_group.go +++ b/aws/resource_aws_elasticache_subnet_group.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsElasticacheSubnetGroup() *schema.Resource { @@ -208,7 +209,7 @@ func resourceAwsElasticacheSubnetGroupDelete(d *schema.ResourceData, meta interf log.Printf("[DEBUG] Cache subnet group delete: %s", d.Id()) - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.DeleteCacheSubnetGroup(&elasticache.DeleteCacheSubnetGroupInput{ CacheSubnetGroupName: aws.String(d.Id()), }) diff --git a/aws/resource_aws_elasticsearch_domain.go b/aws/resource_aws_elasticsearch_domain.go index b7981323d76..cd2f930489d 100644 --- a/aws/resource_aws_elasticsearch_domain.go +++ b/aws/resource_aws_elasticsearch_domain.go @@ -18,6 +18,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsElasticSearchDomain() *schema.Resource { @@ -573,7 +574,7 @@ func resourceAwsElasticSearchDomainCreate(d *schema.ResourceData, meta interface // IAM Roles can take some time to propagate if set in AccessPolicies and created in the same terraform var out *elasticsearch.CreateElasticsearchDomainOutput - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error out, err = conn.CreateElasticsearchDomain(&input) if err != nil { @@ -642,7 +643,7 @@ func waitForElasticSearchDomainCreation(conn *elasticsearch.ElasticsearchService DomainName: aws.String(domainName), } var out *elasticsearch.DescribeElasticsearchDomainOutput - err := resource.Retry(60*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(60*time.Minute, func() *resource.RetryError { var err error out, err = conn.DescribeElasticsearchDomain(input) if err != nil { @@ -909,7 +910,7 @@ func resourceAwsElasticSearchDomainUpdate(d *schema.ResourceData, meta interface DomainName: aws.String(d.Get("domain_name").(string)), } var out *elasticsearch.DescribeElasticsearchDomainOutput - err = resource.Retry(60*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(60*time.Minute, func() *resource.RetryError { out, err = conn.DescribeElasticsearchDomain(descInput) if err != nil { return resource.NonRetryableError(err) @@ -1005,7 +1006,7 @@ func resourceAwsElasticSearchDomainDeleteWaiter(domainName string, conn *elastic DomainName: aws.String(domainName), } var out *elasticsearch.DescribeElasticsearchDomainOutput - err := resource.Retry(90*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(90*time.Minute, func() *resource.RetryError { var err error out, err = conn.DescribeElasticsearchDomain(input) diff --git a/aws/resource_aws_elasticsearch_domain_policy.go b/aws/resource_aws_elasticsearch_domain_policy.go index 69f88f00745..5ef4de7375d 100644 --- a/aws/resource_aws_elasticsearch_domain_policy.go +++ b/aws/resource_aws_elasticsearch_domain_policy.go @@ -10,6 +10,7 @@ import ( elasticsearch "github.com/aws/aws-sdk-go/service/elasticsearchservice" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsElasticSearchDomainPolicy() *schema.Resource { @@ -72,7 +73,7 @@ func resourceAwsElasticSearchDomainPolicyUpsert(d *schema.ResourceData, meta int DomainName: aws.String(d.Get("domain_name").(string)), } var out *elasticsearch.DescribeElasticsearchDomainOutput - err = resource.Retry(50*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(50*time.Minute, func() *resource.RetryError { var err error out, err = conn.DescribeElasticsearchDomain(input) if err != nil { @@ -115,7 +116,7 @@ func resourceAwsElasticSearchDomainPolicyDelete(d *schema.ResourceData, meta int DomainName: aws.String(d.Get("domain_name").(string)), } var out *elasticsearch.DescribeElasticsearchDomainOutput - err = resource.Retry(60*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(60*time.Minute, func() *resource.RetryError { var err error out, err = conn.DescribeElasticsearchDomain(input) if err != nil { diff --git a/aws/resource_aws_elasticsearch_domain_saml_options.go b/aws/resource_aws_elasticsearch_domain_saml_options.go index 26179b74999..80f7f10b03a 100644 --- a/aws/resource_aws_elasticsearch_domain_saml_options.go +++ b/aws/resource_aws_elasticsearch_domain_saml_options.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsElasticSearchDomainSAMLOptions() *schema.Resource { @@ -158,7 +159,7 @@ func resourceAwsElasticSearchDomainSAMLOptionsPut(d *schema.ResourceData, meta i DomainName: aws.String(d.Get("domain_name").(string)), } var out *elasticsearch.DescribeElasticsearchDomainOutput - err = resource.Retry(50*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(50*time.Minute, func() *resource.RetryError { var err error out, err = conn.DescribeElasticsearchDomain(input) if err != nil { @@ -206,7 +207,7 @@ func resourceAwsElasticSearchDomainSAMLOptionsDelete(d *schema.ResourceData, met DomainName: aws.String(d.Get("domain_name").(string)), } var out *elasticsearch.DescribeElasticsearchDomainOutput - err = resource.Retry(60*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(60*time.Minute, func() *resource.RetryError { var err error out, err = conn.DescribeElasticsearchDomain(input) if err != nil { diff --git a/aws/resource_aws_elb.go b/aws/resource_aws_elb.go index 06cd1507d0d..4022fcd073e 100644 --- a/aws/resource_aws_elb.go +++ b/aws/resource_aws_elb.go @@ -20,6 +20,7 @@ import ( "github.com/terraform-providers/terraform-provider-aws/aws/internal/hashcode" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/ec2/finder" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsElb() *schema.Resource { @@ -305,7 +306,7 @@ func resourceAwsElbCreate(d *schema.ResourceData, meta interface{}) error { } log.Printf("[DEBUG] ELB create configuration: %#v", elbOpts) - err = resource.Retry(5*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := elbconn.CreateLoadBalancer(elbOpts) if err != nil { @@ -513,7 +514,7 @@ func resourceAwsElbUpdate(d *schema.ResourceData, meta interface{}) error { // Occasionally AWS will error with a 'duplicate listener', without any // other listeners on the ELB. Retry here to eliminate that. - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { log.Printf("[DEBUG] ELB Create Listeners opts: %s", createListenersOpts) _, err := elbconn.CreateLoadBalancerListeners(createListenersOpts) if err != nil { @@ -749,7 +750,7 @@ func resourceAwsElbUpdate(d *schema.ResourceData, meta interface{}) error { } log.Printf("[DEBUG] ELB attach subnets opts: %s", attachOpts) - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := elbconn.AttachLoadBalancerToSubnets(attachOpts) if err != nil { if isAWSErr(err, elb.ErrCodeInvalidConfigurationRequestException, "cannot be attached to multiple subnets in the same AZ") { diff --git a/aws/resource_aws_elb_attachment.go b/aws/resource_aws_elb_attachment.go index b182d4c1668..eb95ebfd268 100644 --- a/aws/resource_aws_elb_attachment.go +++ b/aws/resource_aws_elb_attachment.go @@ -9,6 +9,7 @@ import ( "github.com/aws/aws-sdk-go/service/elb" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsElbAttachment() *schema.Resource { @@ -46,7 +47,7 @@ func resourceAwsElbAttachmentCreate(d *schema.ResourceData, meta interface{}) er log.Printf("[INFO] registering instance %s with ELB %s", instance, elbName) - err := resource.Retry(10*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(10*time.Minute, func() *resource.RetryError { _, err := elbconn.RegisterInstancesWithLoadBalancer(®isterInstancesOpts) if isAWSErr(err, "InvalidTarget", "") { diff --git a/aws/resource_aws_emr_cluster.go b/aws/resource_aws_emr_cluster.go index 48cc18a49b8..5f26c84554e 100644 --- a/aws/resource_aws_emr_cluster.go +++ b/aws/resource_aws_emr_cluster.go @@ -21,6 +21,7 @@ import ( "github.com/terraform-providers/terraform-provider-aws/aws/internal/hashcode" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsEMRCluster() *schema.Resource { @@ -921,7 +922,7 @@ func resourceAwsEMRClusterCreate(d *schema.ResourceData, meta interface{}) error log.Printf("[DEBUG] EMR Cluster create options: %s", params) var resp *emr.RunJobFlowOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error resp, err = conn.RunJobFlow(params) if err != nil { @@ -1225,7 +1226,7 @@ func resourceAwsEMRClusterUpdate(d *schema.ResourceData, meta interface{}) error // RemoveAutoScalingPolicy seems to have eventual consistency. // Retry reading Instance Group configuration until the policy is removed. - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { autoscalingPolicy, err := getEmrCoreInstanceGroupAutoscalingPolicy(conn, d.Id()) if err != nil { @@ -1375,7 +1376,7 @@ func resourceAwsEMRClusterDelete(d *schema.ResourceData, meta interface{}) error } var resp *emr.ListInstancesOutput var count int - err = resource.Retry(20*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(20*time.Minute, func() *resource.RetryError { var err error resp, err = conn.ListInstances(input) diff --git a/aws/resource_aws_emr_cluster_test.go b/aws/resource_aws_emr_cluster_test.go index a10cca67782..bba73171f50 100644 --- a/aws/resource_aws_emr_cluster_test.go +++ b/aws/resource_aws_emr_cluster_test.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/ec2/finder" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func init() { @@ -1573,7 +1574,7 @@ func testAccCheckAWSEmrClusterDisappears(cluster *emr.Cluster) resource.TestChec var output *emr.ListInstancesOutput var instanceCount int - err = resource.Retry(20*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(20*time.Minute, func() *resource.RetryError { var err error output, err = conn.ListInstances(input) diff --git a/aws/resource_aws_gamelift_build.go b/aws/resource_aws_gamelift_build.go index a78e2ec0fa0..7b0115b0b5a 100644 --- a/aws/resource_aws_gamelift_build.go +++ b/aws/resource_aws_gamelift_build.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsGameliftBuild() *schema.Resource { @@ -93,7 +94,7 @@ func resourceAwsGameliftBuildCreate(d *schema.ResourceData, meta interface{}) er } log.Printf("[INFO] Creating Gamelift Build: %s", input) var out *gamelift.CreateBuildOutput - err := resource.Retry(30*time.Second, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(30*time.Second, func() *resource.RetryError { var err error out, err = conn.CreateBuild(&input) if err != nil { diff --git a/aws/resource_aws_gamelift_fleet.go b/aws/resource_aws_gamelift_fleet.go index 38ae1164bc1..f2e8bd0b827 100644 --- a/aws/resource_aws_gamelift_fleet.go +++ b/aws/resource_aws_gamelift_fleet.go @@ -241,7 +241,7 @@ func resourceAwsGameliftFleetCreate(d *schema.ResourceData, meta interface{}) er log.Printf("[INFO] Creating Gamelift Fleet: %s", input) var out *gamelift.CreateFleetOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error out, err = conn.CreateFleet(&input) @@ -437,7 +437,7 @@ func resourceAwsGameliftFleetDelete(d *schema.ResourceData, meta interface{}) er input := &gamelift.DeleteFleetInput{ FleetId: aws.String(d.Id()), } - err := resource.Retry(60*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(60*time.Minute, func() *resource.RetryError { _, err := conn.DeleteFleet(input) if err != nil { msg := fmt.Sprintf("Cannot delete fleet %s that is in status of ", d.Id()) diff --git a/aws/resource_aws_gamelift_fleet_test.go b/aws/resource_aws_gamelift_fleet_test.go index a610038a157..d717114f020 100644 --- a/aws/resource_aws_gamelift_fleet_test.go +++ b/aws/resource_aws_gamelift_fleet_test.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func init() { @@ -48,7 +49,7 @@ func testSweepGameliftFleets(region string) error { for _, attr := range out.FleetAttributes { log.Printf("[INFO] Deleting Gamelift Fleet %q", *attr.FleetId) - err := resource.Retry(60*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(60*time.Minute, func() *resource.RetryError { _, err := conn.DeleteFleet(&gamelift.DeleteFleetInput{ FleetId: attr.FleetId, }) @@ -596,7 +597,7 @@ func testAccCheckAWSGameliftFleetDisappears(res *gamelift.FleetAttributes) resou conn := testAccProvider.Meta().(*AWSClient).gameliftconn input := &gamelift.DeleteFleetInput{FleetId: res.FleetId} - err := resource.Retry(60*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(60*time.Minute, func() *resource.RetryError { _, err := conn.DeleteFleet(input) if err != nil { msg := fmt.Sprintf("Cannot delete fleet %s that is in status of ", *res.FleetId) diff --git a/aws/resource_aws_gamelift_game_session_queue_test.go b/aws/resource_aws_gamelift_game_session_queue_test.go index 1bb24ecc264..18fad3fbc12 100644 --- a/aws/resource_aws_gamelift_game_session_queue_test.go +++ b/aws/resource_aws_gamelift_game_session_queue_test.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) const testAccGameliftGameSessionQueuePrefix = "tfAccQueue-" @@ -308,7 +309,7 @@ func testAccCheckAWSGameliftGameSessionQueueDestroy(s *terraform.State) error { } // Deletions can take a few seconds - err := resource.Retry(30*time.Second, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(30*time.Second, func() *resource.RetryError { out, err := conn.DescribeGameSessionQueues(input) if isAWSErr(err, gamelift.ErrCodeNotFoundException, "") { diff --git a/aws/resource_aws_glue_crawler.go b/aws/resource_aws_glue_crawler.go index b780131b7ee..0e3af525fdf 100644 --- a/aws/resource_aws_glue_crawler.go +++ b/aws/resource_aws_glue_crawler.go @@ -284,7 +284,7 @@ func resourceAwsGlueCrawlerCreate(d *schema.ResourceData, meta interface{}) erro } // Retry for IAM eventual consistency - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err = glueConn.CreateCrawler(crawlerInput) if err != nil { // InvalidInputException: Insufficient Lake Formation permission(s) on xxx @@ -605,7 +605,7 @@ func resourceAwsGlueCrawlerUpdate(d *schema.ResourceData, meta interface{}) erro } // Retry for IAM eventual consistency - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := glueConn.UpdateCrawler(updateCrawlerInput) if err != nil { // InvalidInputException: Insufficient Lake Formation permission(s) on xxx diff --git a/aws/resource_aws_glue_dev_endpoint.go b/aws/resource_aws_glue_dev_endpoint.go index 7a2ea6c98f6..3149d3d7bd0 100644 --- a/aws/resource_aws_glue_dev_endpoint.go +++ b/aws/resource_aws_glue_dev_endpoint.go @@ -16,6 +16,7 @@ import ( "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/glue/waiter" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsGlueDevEndpoint() *schema.Resource { @@ -223,7 +224,7 @@ func resourceAwsGlueDevEndpointCreate(d *schema.ResourceData, meta interface{}) } log.Printf("[DEBUG] Creating Glue Dev Endpoint: %#v", *input) - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.CreateDevEndpoint(input) if err != nil { // Retry for IAM eventual consistency @@ -480,7 +481,7 @@ func resourceAwsDevEndpointUpdate(d *schema.ResourceData, meta interface{}) erro if hasChanged { log.Printf("[DEBUG] Updating Glue Dev Endpoint: %s", input) - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.UpdateDevEndpoint(input) if err != nil { if isAWSErr(err, glue.ErrCodeInvalidInputException, "another concurrent update operation") { diff --git a/aws/resource_aws_glue_trigger.go b/aws/resource_aws_glue_trigger.go index 7333e7df281..757c8683d24 100644 --- a/aws/resource_aws_glue_trigger.go +++ b/aws/resource_aws_glue_trigger.go @@ -16,6 +16,7 @@ import ( "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/glue/finder" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/glue/waiter" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsGlueTrigger() *schema.Resource { @@ -212,7 +213,7 @@ func resourceAwsGlueTriggerCreate(d *schema.ResourceData, meta interface{}) erro } log.Printf("[DEBUG] Creating Glue Trigger: %s", input) - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error _, err = conn.CreateTrigger(input) if err != nil { diff --git a/aws/resource_aws_guardduty_detector.go b/aws/resource_aws_guardduty_detector.go index 23866b0eb34..f853e07a85e 100644 --- a/aws/resource_aws_guardduty_detector.go +++ b/aws/resource_aws_guardduty_detector.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/guardduty/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsGuardDutyDetector() *schema.Resource { @@ -208,7 +209,7 @@ func resourceAwsGuardDutyDetectorDelete(d *schema.ResourceData, meta interface{} DetectorId: aws.String(d.Id()), } - err := resource.Retry(waiter.MembershipPropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.MembershipPropagationTimeout, func() *resource.RetryError { _, err := conn.DeleteDetector(input) if isAWSErr(err, guardduty.ErrCodeBadRequestException, "cannot delete detector while it has invited or associated members") { diff --git a/aws/resource_aws_guardduty_invite_accepter.go b/aws/resource_aws_guardduty_invite_accepter.go index 97693281ded..2722abebd0f 100644 --- a/aws/resource_aws_guardduty_invite_accepter.go +++ b/aws/resource_aws_guardduty_invite_accepter.go @@ -9,6 +9,7 @@ import ( "github.com/aws/aws-sdk-go/service/guardduty" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsGuardDutyInviteAccepter() *schema.Resource { @@ -49,7 +50,7 @@ func resourceAwsGuardDutyInviteAccepterCreate(d *schema.ResourceData, meta inter listInvitationsInput := &guardduty.ListInvitationsInput{} - err := resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { log.Printf("[DEBUG] Listing GuardDuty Invitations: %s", listInvitationsInput) err := conn.ListInvitationsPages(listInvitationsInput, func(page *guardduty.ListInvitationsOutput, lastPage bool) bool { for _, invitation := range page.Invitations { diff --git a/aws/resource_aws_guardduty_member.go b/aws/resource_aws_guardduty_member.go index 136d543a935..20f241b3abd 100644 --- a/aws/resource_aws_guardduty_member.go +++ b/aws/resource_aws_guardduty_member.go @@ -10,6 +10,7 @@ import ( "github.com/aws/aws-sdk-go/service/guardduty" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsGuardDutyMember() *schema.Resource { @@ -236,7 +237,7 @@ func inviteGuardDutyMemberWaiter(accountID, detectorID string, timeout time.Dura // wait until e-mail verification finishes var out *guardduty.GetMembersOutput - err := resource.Retry(timeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(timeout, func() *resource.RetryError { log.Printf("[DEBUG] Reading GuardDuty Member: %s", input) var err error out, err = conn.GetMembers(&input) diff --git a/aws/resource_aws_iam_group.go b/aws/resource_aws_iam_group.go index 9844b0f9aa7..e3294172765 100644 --- a/aws/resource_aws_iam_group.go +++ b/aws/resource_aws_iam_group.go @@ -79,7 +79,7 @@ func resourceAwsIamGroupRead(d *schema.ResourceData, meta interface{}) error { var getResp *iam.GetGroupOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error getResp, err = iamconn.GetGroup(request) diff --git a/aws/resource_aws_iam_group_membership.go b/aws/resource_aws_iam_group_membership.go index 98e969ef25a..15323526ed3 100644 --- a/aws/resource_aws_iam_group_membership.go +++ b/aws/resource_aws_iam_group_membership.go @@ -68,7 +68,7 @@ func resourceAwsIamGroupMembershipRead(d *schema.ResourceData, meta interface{}) var ul []string - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { err := conn.GetGroupPages(input, func(page *iam.GetGroupOutput, lastPage bool) bool { if page == nil { return !lastPage diff --git a/aws/resource_aws_iam_group_policy.go b/aws/resource_aws_iam_group_policy.go index 1ea2aa31653..3fe55e4f76e 100644 --- a/aws/resource_aws_iam_group_policy.go +++ b/aws/resource_aws_iam_group_policy.go @@ -98,7 +98,7 @@ func resourceAwsIamGroupPolicyRead(d *schema.ResourceData, meta interface{}) err var getResp *iam.GetGroupPolicyOutput - err = resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error getResp, err = iamconn.GetGroupPolicy(request) diff --git a/aws/resource_aws_iam_group_policy_attachment.go b/aws/resource_aws_iam_group_policy_attachment.go index 4a90df23812..d6dc8fb2bf8 100644 --- a/aws/resource_aws_iam_group_policy_attachment.go +++ b/aws/resource_aws_iam_group_policy_attachment.go @@ -65,7 +65,7 @@ func resourceAwsIamGroupPolicyAttachmentRead(d *schema.ResourceData, meta interf var attachedPolicy *iam.AttachedPolicy - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error attachedPolicy, err = finder.GroupAttachedPolicy(conn, group, arn) diff --git a/aws/resource_aws_iam_instance_profile.go b/aws/resource_aws_iam_instance_profile.go index 5e9cc0446cb..7eb3de25b88 100644 --- a/aws/resource_aws_iam_instance_profile.go +++ b/aws/resource_aws_iam_instance_profile.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsIamInstanceProfile() *schema.Resource { @@ -126,7 +127,7 @@ func instanceProfileAddRole(conn *iam.IAM, profileName, roleName string) error { RoleName: aws.String(roleName), } - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error _, err = conn.AddRoleToInstanceProfile(request) // IAM unfortunately does not provide a better error code or message for eventual consistency diff --git a/aws/resource_aws_iam_policy.go b/aws/resource_aws_iam_policy.go index a4948ba29e3..fb042252c2f 100644 --- a/aws/resource_aws_iam_policy.go +++ b/aws/resource_aws_iam_policy.go @@ -125,7 +125,7 @@ func resourceAwsIamPolicyRead(d *schema.ResourceData, meta interface{}) error { // Handle IAM eventual consistency var getPolicyResponse *iam.GetPolicyOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error getPolicyResponse, err = conn.GetPolicy(input) @@ -188,7 +188,7 @@ func resourceAwsIamPolicyRead(d *schema.ResourceData, meta interface{}) error { // Handle IAM eventual consistency var getPolicyVersionResponse *iam.GetPolicyVersionOutput - err = resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error getPolicyVersionResponse, err = conn.GetPolicyVersion(getPolicyVersionRequest) diff --git a/aws/resource_aws_iam_role.go b/aws/resource_aws_iam_role.go index d19cd23568d..c7e607ee5f1 100644 --- a/aws/resource_aws_iam_role.go +++ b/aws/resource_aws_iam_role.go @@ -193,7 +193,7 @@ func resourceAwsIamRoleCreate(d *schema.ResourceData, meta interface{}) error { } var createResp *iam.CreateRoleOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error createResp, err = iamconn.CreateRole(request) // IAM users (referenced in Principal field of assume policy) @@ -244,7 +244,7 @@ func resourceAwsIamRoleRead(d *schema.ResourceData, meta interface{}) error { var getResp *iam.GetRoleOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error getResp, err = iamconn.GetRole(request) @@ -526,7 +526,7 @@ func deleteIamRole(conn *iam.IAM, roleName string, forceDetach, hasInline, hasMa deleteRoleInput := &iam.DeleteRoleInput{ RoleName: aws.String(roleName), } - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.DeleteRole(deleteRoleInput) if err != nil { if tfawserr.ErrCodeEquals(err, iam.ErrCodeDeleteConflictException) { diff --git a/aws/resource_aws_iam_role_policy.go b/aws/resource_aws_iam_role_policy.go index 341b648a671..04201164e45 100644 --- a/aws/resource_aws_iam_role_policy.go +++ b/aws/resource_aws_iam_role_policy.go @@ -99,7 +99,7 @@ func resourceAwsIamRolePolicyRead(d *schema.ResourceData, meta interface{}) erro var getResp *iam.GetRolePolicyOutput - err = resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error getResp, err = iamconn.GetRolePolicy(request) diff --git a/aws/resource_aws_iam_role_policy_attachment.go b/aws/resource_aws_iam_role_policy_attachment.go index 88b8104ab9c..dd3236ee10c 100644 --- a/aws/resource_aws_iam_role_policy_attachment.go +++ b/aws/resource_aws_iam_role_policy_attachment.go @@ -64,7 +64,7 @@ func resourceAwsIamRolePolicyAttachmentRead(d *schema.ResourceData, meta interfa var hasPolicyAttachment bool - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error hasPolicyAttachment, err = iamRoleHasPolicyARNAttachment(conn, role, policyARN) diff --git a/aws/resource_aws_iam_server_certificate.go b/aws/resource_aws_iam_server_certificate.go index 14dbcf34f80..63512e93dbb 100644 --- a/aws/resource_aws_iam_server_certificate.go +++ b/aws/resource_aws_iam_server_certificate.go @@ -17,6 +17,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsIAMServerCertificate() *schema.Resource { @@ -210,7 +211,7 @@ func resourceAwsIAMServerCertificateUpdate(d *schema.ResourceData, meta interfac func resourceAwsIAMServerCertificateDelete(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).iamconn log.Printf("[INFO] Deleting IAM Server Certificate: %s", d.Id()) - err := resource.Retry(15*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(15*time.Minute, func() *resource.RetryError { _, err := conn.DeleteServerCertificate(&iam.DeleteServerCertificateInput{ ServerCertificateName: aws.String(d.Get("name").(string)), }) diff --git a/aws/resource_aws_iam_user.go b/aws/resource_aws_iam_user.go index 91acdc2899f..ab11805a581 100644 --- a/aws/resource_aws_iam_user.go +++ b/aws/resource_aws_iam_user.go @@ -117,7 +117,7 @@ func resourceAwsIamUserRead(d *schema.ResourceData, meta interface{}) error { var output *iam.GetUserOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = iamconn.GetUser(request) @@ -416,7 +416,7 @@ func deleteAwsIamUserLoginProfile(svc *iam.IAM, username string) error { input := &iam.DeleteLoginProfileInput{ UserName: aws.String(username), } - err = resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { _, err = svc.DeleteLoginProfile(input) if err != nil { if isAWSErr(err, iam.ErrCodeNoSuchEntityException, "") { diff --git a/aws/resource_aws_iam_user_group_membership.go b/aws/resource_aws_iam_user_group_membership.go index 6aa64e42ca4..967bb91bb0d 100644 --- a/aws/resource_aws_iam_user_group_membership.go +++ b/aws/resource_aws_iam_user_group_membership.go @@ -68,7 +68,7 @@ func resourceAwsIamUserGroupMembershipRead(d *schema.ResourceData, meta interfac var gl []string - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { err := conn.ListGroupsForUserPages(input, func(page *iam.ListGroupsForUserOutput, lastPage bool) bool { if page == nil { return !lastPage diff --git a/aws/resource_aws_iam_user_login_profile.go b/aws/resource_aws_iam_user_login_profile.go index bf78bab893d..bd367518eec 100644 --- a/aws/resource_aws_iam_user_login_profile.go +++ b/aws/resource_aws_iam_user_login_profile.go @@ -172,7 +172,7 @@ func resourceAwsIamUserLoginProfileRead(d *schema.ResourceData, meta interface{} var output *iam.GetLoginProfileOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.GetLoginProfile(input) @@ -220,7 +220,7 @@ func resourceAwsIamUserLoginProfileDelete(d *schema.ResourceData, meta interface log.Printf("[DEBUG] Deleting IAM User Login Profile (%s): %s", d.Id(), input) // Handle IAM eventual consistency - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.DeleteLoginProfile(input) if isAWSErr(err, iam.ErrCodeNoSuchEntityException, "") { diff --git a/aws/resource_aws_iam_user_login_profile_test.go b/aws/resource_aws_iam_user_login_profile_test.go index 15b4d425885..91415a7047a 100644 --- a/aws/resource_aws_iam_user_login_profile_test.go +++ b/aws/resource_aws_iam_user_login_profile_test.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" "github.com/terraform-providers/terraform-provider-aws/aws/internal/vault/helper/pgpkeys" ) @@ -265,7 +266,7 @@ func testDecryptPasswordAndTest(nProfile, nAccessKey, key string) resource.TestC return fmt.Errorf("Error getting session credentials: %s", err) } - return resource.Retry(2*time.Minute, func() *resource.RetryError { + return tfresource.RetryOnConnectionResetByPeer(2*time.Minute, func() *resource.RetryError { iamAsCreatedUser := iam.New(iamAsCreatedUserSession) newPassword, err := generateIAMPassword(20) if err != nil { diff --git a/aws/resource_aws_iam_user_policy.go b/aws/resource_aws_iam_user_policy.go index 1be2841c6c7..ed203b8f2fb 100644 --- a/aws/resource_aws_iam_user_policy.go +++ b/aws/resource_aws_iam_user_policy.go @@ -103,7 +103,7 @@ func resourceAwsIamUserPolicyRead(d *schema.ResourceData, meta interface{}) erro var getResp *iam.GetUserPolicyOutput - err = resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error getResp, err = iamconn.GetUserPolicy(request) diff --git a/aws/resource_aws_iam_user_policy_attachment.go b/aws/resource_aws_iam_user_policy_attachment.go index 8739719d436..25183a6755b 100644 --- a/aws/resource_aws_iam_user_policy_attachment.go +++ b/aws/resource_aws_iam_user_policy_attachment.go @@ -65,7 +65,7 @@ func resourceAwsIamUserPolicyAttachmentRead(d *schema.ResourceData, meta interfa var attachedPolicy *iam.AttachedPolicy - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error attachedPolicy, err = finder.UserAttachedPolicy(conn, user, arn) diff --git a/aws/resource_aws_iam_user_ssh_key.go b/aws/resource_aws_iam_user_ssh_key.go index 68471ec4c06..375d111a5f8 100644 --- a/aws/resource_aws_iam_user_ssh_key.go +++ b/aws/resource_aws_iam_user_ssh_key.go @@ -105,7 +105,7 @@ func resourceAwsIamUserSshKeyRead(d *schema.ResourceData, meta interface{}) erro var getResp *iam.GetSSHPublicKeyOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error getResp, err = iamconn.GetSSHPublicKey(request) diff --git a/aws/resource_aws_imagebuilder_infrastructure_configuration.go b/aws/resource_aws_imagebuilder_infrastructure_configuration.go index b2d22e53076..3074c73e391 100644 --- a/aws/resource_aws_imagebuilder_infrastructure_configuration.go +++ b/aws/resource_aws_imagebuilder_infrastructure_configuration.go @@ -181,7 +181,7 @@ func resourceAwsImageBuilderInfrastructureConfigurationCreate(d *schema.Resource } var output *imagebuilder.CreateInfrastructureConfigurationOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.CreateInfrastructureConfiguration(input) @@ -332,7 +332,7 @@ func resourceAwsImageBuilderInfrastructureConfigurationUpdate(d *schema.Resource input.TerminateInstanceOnFailure = aws.Bool(v.(bool)) } - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.UpdateInfrastructureConfiguration(input) if tfawserr.ErrMessageContains(err, imagebuilder.ErrCodeInvalidParameterValueException, "instance profile does not exist") { diff --git a/aws/resource_aws_inspector_assessment_target.go b/aws/resource_aws_inspector_assessment_target.go index a3fa56ced61..f2d6fd09a5a 100644 --- a/aws/resource_aws_inspector_assessment_target.go +++ b/aws/resource_aws_inspector_assessment_target.go @@ -9,6 +9,7 @@ import ( "github.com/aws/aws-sdk-go/service/inspector" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAWSInspectorAssessmentTarget() *schema.Resource { @@ -107,7 +108,7 @@ func resourceAwsInspectorAssessmentTargetDelete(d *schema.ResourceData, meta int input := &inspector.DeleteAssessmentTargetInput{ AssessmentTargetArn: aws.String(d.Id()), } - err := resource.Retry(60*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(60*time.Minute, func() *resource.RetryError { _, err := conn.DeleteAssessmentTarget(input) if isAWSErr(err, inspector.ErrCodeAssessmentRunInProgressException, "") { diff --git a/aws/resource_aws_instance.go b/aws/resource_aws_instance.go index 6e50473399f..14754b9b9d1 100644 --- a/aws/resource_aws_instance.go +++ b/aws/resource_aws_instance.go @@ -764,7 +764,7 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error { log.Printf("[DEBUG] Run configuration: %s", runOpts) var runResp *ec2.Reservation - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error runResp, err = conn.RunInstances(runOpts) // IAM instance profiles can take ~10 seconds to propagate in AWS: @@ -1257,7 +1257,7 @@ func resourceAwsInstanceUpdate(d *schema.ResourceData, meta interface{}) error { return err } } else { - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.ReplaceIamInstanceProfileAssociation(input) if err != nil { if isAWSErr(err, "InvalidParameterValue", "Invalid IAM Instance Profile") { @@ -1442,7 +1442,7 @@ func resourceAwsInstanceUpdate(d *schema.ResourceData, meta interface{}) error { } // Reference: https://github.com/hashicorp/terraform-provider-aws/issues/16433 - err = resource.Retry(waiter.InstanceAttributePropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(waiter.InstanceAttributePropagationTimeout, func() *resource.RetryError { _, err := conn.StartInstances(input) if tfawserr.ErrMessageContains(err, tfec2.ErrCodeInvalidParameterValue, "LaunchPlan instance type does not match attribute value") { @@ -1925,7 +1925,7 @@ func associateInstanceProfile(d *schema.ResourceData, conn *ec2.EC2) error { Name: aws.String(d.Get("iam_instance_profile").(string)), }, } - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.AssociateIamInstanceProfile(input) if err != nil { if isAWSErr(err, "InvalidParameterValue", "Invalid IAM Instance Profile") { @@ -2495,7 +2495,7 @@ func getAwsEc2InstancePasswordData(instanceID string, conn *ec2.EC2) (string, er input := &ec2.GetPasswordDataInput{ InstanceId: aws.String(instanceID), } - err := resource.Retry(15*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(15*time.Minute, func() *resource.RetryError { var err error resp, err = conn.GetPasswordData(input) diff --git a/aws/resource_aws_internet_gateway.go b/aws/resource_aws_internet_gateway.go index bf66ec21d8c..74c1c8c1b56 100644 --- a/aws/resource_aws_internet_gateway.go +++ b/aws/resource_aws_internet_gateway.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsInternetGateway() *schema.Resource { @@ -66,7 +67,7 @@ func resourceAwsInternetGatewayCreate(d *schema.ResourceData, meta interface{}) d.SetId(aws.StringValue(ig.InternetGatewayId)) log.Printf("[INFO] InternetGateway ID: %s", d.Id()) var igRaw interface{} - err = resource.Retry(5*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { igRaw, _, err = IGStateRefreshFunc(conn, d.Id())() if igRaw != nil { return nil @@ -183,7 +184,7 @@ func resourceAwsInternetGatewayDelete(d *schema.ResourceData, meta interface{}) input := &ec2.DeleteInternetGatewayInput{ InternetGatewayId: aws.String(d.Id()), } - err := resource.Retry(10*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(10*time.Minute, func() *resource.RetryError { _, err := conn.DeleteInternetGateway(input) if err == nil { return nil @@ -226,7 +227,7 @@ func resourceAwsInternetGatewayAttach(d *schema.ResourceData, meta interface{}) InternetGatewayId: aws.String(d.Id()), VpcId: aws.String(d.Get("vpc_id").(string)), } - err := resource.Retry(2*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(2*time.Minute, func() *resource.RetryError { _, err := conn.AttachInternetGateway(input) if err == nil { return nil diff --git a/aws/resource_aws_iot_thing_type.go b/aws/resource_aws_iot_thing_type.go index 5eaf9246baf..865740f1c32 100644 --- a/aws/resource_aws_iot_thing_type.go +++ b/aws/resource_aws_iot_thing_type.go @@ -9,6 +9,7 @@ import ( "github.com/aws/aws-sdk-go/service/iot" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) // https://docs.aws.amazon.com/iot/latest/apireference/API_CreateThingType.html @@ -185,7 +186,7 @@ func resourceAwsIotThingTypeDelete(d *schema.ResourceData, meta interface{}) err } log.Printf("[DEBUG] Deleting IoT Thing Type: %s", deleteParams) - err = resource.Retry(6*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(6*time.Minute, func() *resource.RetryError { _, err := conn.DeleteThingType(deleteParams) if err != nil { diff --git a/aws/resource_aws_kinesis_firehose_delivery_stream.go b/aws/resource_aws_kinesis_firehose_delivery_stream.go index f5d1887fc37..91bf7382646 100644 --- a/aws/resource_aws_kinesis_firehose_delivery_stream.go +++ b/aws/resource_aws_kinesis_firehose_delivery_stream.go @@ -16,6 +16,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) const ( @@ -2523,7 +2524,7 @@ func resourceAwsKinesisFirehoseDeliveryStreamCreate(d *schema.ResourceData, meta createInput.Tags = tags.IgnoreAws().FirehoseTags() } - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.CreateDeliveryStream(createInput) if err != nil { // Access was denied when calling Glue. Please ensure that the role specified in the data format conversion configuration has the necessary permissions. @@ -2669,7 +2670,7 @@ func resourceAwsKinesisFirehoseDeliveryStreamUpdate(d *schema.ResourceData, meta } } - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.UpdateDestination(updateInput) if err != nil { // Access was denied when calling Glue. Please ensure that the role specified in the data format conversion configuration has the necessary permissions. diff --git a/aws/resource_aws_kms_alias.go b/aws/resource_aws_kms_alias.go index a47216d81b3..3c37e71ef6f 100644 --- a/aws/resource_aws_kms_alias.go +++ b/aws/resource_aws_kms_alias.go @@ -11,6 +11,7 @@ import ( "github.com/aws/aws-sdk-go/service/kms" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsKmsAlias() *schema.Resource { @@ -174,7 +175,7 @@ func resourceAwsKmsAliasDelete(d *schema.ResourceData, meta interface{}) error { func retryFindKmsAliasByName(conn *kms.KMS, name string) (*kms.AliasListEntry, error) { var resp *kms.AliasListEntry - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { var err error resp, err = findKmsAliasByName(conn, name, nil) if err != nil { diff --git a/aws/resource_aws_kms_external_key.go b/aws/resource_aws_kms_external_key.go index 933dd6e7dd7..327462eabb1 100644 --- a/aws/resource_aws_kms_external_key.go +++ b/aws/resource_aws_kms_external_key.go @@ -19,6 +19,7 @@ import ( "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/kms/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsKmsExternalKey() *schema.Resource { @@ -117,7 +118,7 @@ func resourceAwsKmsExternalKeyCreate(d *schema.ResourceData, meta interface{}) e } var output *kms.CreateKeyOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.CreateKey(input) @@ -174,7 +175,7 @@ func resourceAwsKmsExternalKeyRead(d *schema.ResourceData, meta interface{}) err var output *kms.DescribeKeyOutput // Retry for KMS eventual consistency on creation - err := resource.Retry(2*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(2*time.Minute, func() *resource.RetryError { var err error output, err = conn.DescribeKey(input) @@ -373,7 +374,7 @@ func importKmsExternalKeyMaterial(conn *kms.KMS, keyID, keyMaterialBase64, valid var getParametersForImportOutput *kms.GetParametersForImportOutput // Handle KMS eventual consistency - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { var err error getParametersForImportOutput, err = conn.GetParametersForImport(getParametersForImportInput) @@ -438,7 +439,7 @@ func importKmsExternalKeyMaterial(conn *kms.KMS, keyID, keyMaterialBase64, valid } // Handle KMS eventual consistency - err = resource.Retry(1*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := conn.ImportKeyMaterial(importKeyMaterialInput) if isAWSErr(err, kms.ErrCodeNotFoundException, "") { diff --git a/aws/resource_aws_kms_grant.go b/aws/resource_aws_kms_grant.go index 97d8af254ea..86c395d7a6b 100644 --- a/aws/resource_aws_kms_grant.go +++ b/aws/resource_aws_kms_grant.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/hashcode" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsKmsGrant() *schema.Resource { @@ -147,7 +148,7 @@ func resourceAwsKmsGrantCreate(d *schema.ResourceData, meta interface{}) error { var out *kms.CreateGrantOutput - err := resource.Retry(3*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(3*time.Minute, func() *resource.RetryError { var err error out, err = conn.CreateGrant(&input) @@ -302,7 +303,7 @@ by the list grants call when expected. // are handled by the findKmsGrantById function func findKmsGrantByIdWithRetry(conn *kms.KMS, keyId string, grantId string) (*kms.GrantListEntry, error) { var grant *kms.GrantListEntry - err := resource.Retry(3*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(3*time.Minute, func() *resource.RetryError { var err error grant, err = findKmsGrantById(conn, keyId, grantId, nil) @@ -326,7 +327,7 @@ func findKmsGrantByIdWithRetry(conn *kms.KMS, keyId string, grantId string) (*km // Used by the tests as well func waitForKmsGrantToBeRevoked(conn *kms.KMS, keyId string, grantId string) error { var grant *kms.GrantListEntry - err := resource.Retry(3*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(3*time.Minute, func() *resource.RetryError { var err error grant, err = findKmsGrantById(conn, keyId, grantId, nil) @@ -367,7 +368,7 @@ func findKmsGrantById(conn *kms.KMS, keyId string, grantId string, marker *strin var err error var grant *kms.GrantListEntry - err = resource.Retry(3*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(3*time.Minute, func() *resource.RetryError { out, err = conn.ListGrants(&input) if err != nil { diff --git a/aws/resource_aws_kms_key.go b/aws/resource_aws_kms_key.go index 586a7839fb9..82233ec02f5 100644 --- a/aws/resource_aws_kms_key.go +++ b/aws/resource_aws_kms_key.go @@ -14,6 +14,7 @@ import ( "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/kms/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsKmsKey() *schema.Resource { @@ -111,7 +112,7 @@ func resourceAwsKmsKeyCreate(d *schema.ResourceData, meta interface{}) error { // The KMS service's awareness of principals is limited by "eventual consistency". // They acknowledge this here: // http://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error resp, err = conn.CreateKey(req) if isAWSErr(err, kms.ErrCodeMalformedPolicyDocumentException, "") { @@ -214,7 +215,7 @@ func resourceAwsKmsKeyRead(d *schema.ResourceData, meta interface{}) error { d.Set("enable_key_rotation", krs.KeyRotationEnabled) var tags keyvaluetags.KeyValueTags - err = resource.Retry(2*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(2*time.Minute, func() *resource.RetryError { var err error tags, err = keyvaluetags.KmsListTags(conn, d.Id()) @@ -388,7 +389,7 @@ func updateKmsKeyStatus(conn *kms.KMS, id string, shouldBeEnabled bool) error { func updateKmsKeyRotationStatus(conn *kms.KMS, d *schema.ResourceData) error { shouldEnableRotation := d.Get("enable_key_rotation").(bool) - err := resource.Retry(10*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(10*time.Minute, func() *resource.RetryError { err := handleKeyRotation(conn, shouldEnableRotation, aws.String(d.Id())) if err != nil { diff --git a/aws/resource_aws_lakeformation_data_lake_settings.go b/aws/resource_aws_lakeformation_data_lake_settings.go index 6ea8926796e..a5ae147bb51 100644 --- a/aws/resource_aws_lakeformation_data_lake_settings.go +++ b/aws/resource_aws_lakeformation_data_lake_settings.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/hashcode" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsLakeFormationDataLakeSettings() *schema.Resource { @@ -132,7 +133,7 @@ func resourceAwsLakeFormationDataLakeSettingsCreate(d *schema.ResourceData, meta input.DataLakeSettings = settings var output *lakeformation.PutDataLakeSettingsOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.PutDataLakeSettings(input) if err != nil { diff --git a/aws/resource_aws_lakeformation_permissions.go b/aws/resource_aws_lakeformation_permissions.go index 0b95cc9ab0d..595e7d6f60e 100644 --- a/aws/resource_aws_lakeformation_permissions.go +++ b/aws/resource_aws_lakeformation_permissions.go @@ -305,7 +305,7 @@ func resourceAwsLakeFormationPermissionsCreate(d *schema.ResourceData, meta inte } var output *lakeformation.GrantPermissionsOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.GrantPermissions(input) if err != nil { @@ -574,7 +574,7 @@ func resourceAwsLakeFormationPermissionsDelete(d *schema.ResourceData, meta inte return nil } - err := resource.Retry(waiter.PermissionsDeleteRetryTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PermissionsDeleteRetryTimeout, func() *resource.RetryError { var err error _, err = conn.RevokePermissions(input) if err != nil { @@ -613,7 +613,7 @@ func resourceAwsLakeFormationPermissionsDelete(d *schema.ResourceData, meta inte // You can't just wait until permissions = 0 because there could be many other unrelated permissions // on the resource and filtering is non-trivial for table with columns. - err = resource.Retry(waiter.PermissionsDeleteRetryTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(waiter.PermissionsDeleteRetryTimeout, func() *resource.RetryError { var err error _, err = conn.RevokePermissions(input) diff --git a/aws/resource_aws_lakeformation_permissions_test.go b/aws/resource_aws_lakeformation_permissions_test.go index 57db85a834a..53f4e1be321 100644 --- a/aws/resource_aws_lakeformation_permissions_test.go +++ b/aws/resource_aws_lakeformation_permissions_test.go @@ -792,7 +792,7 @@ func permissionCountForLakeFormationResource(conn *lakeformation.LakeFormation, log.Printf("[DEBUG] Reading Lake Formation permissions: %v", input) var allPermissions []*lakeformation.PrincipalResourcePermissions - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { err := conn.ListPermissionsPages(input, func(resp *lakeformation.ListPermissionsOutput, lastPage bool) bool { for _, permission := range resp.PrincipalResourcePermissions { if permission == nil { diff --git a/aws/resource_aws_lambda_event_source_mapping.go b/aws/resource_aws_lambda_event_source_mapping.go index cb606aa14f6..5df49fb24c6 100644 --- a/aws/resource_aws_lambda_event_source_mapping.go +++ b/aws/resource_aws_lambda_event_source_mapping.go @@ -377,7 +377,7 @@ func resourceAwsLambdaEventSourceMappingCreate(d *schema.ResourceData, meta inte // retry var eventSourceMappingConfiguration *lambda.EventSourceMappingConfiguration var err error - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { eventSourceMappingConfiguration, err = conn.CreateEventSourceMapping(input) if tfawserr.ErrMessageContains(err, lambda.ErrCodeInvalidParameterValueException, "cannot be assumed by Lambda") { @@ -551,7 +551,7 @@ func resourceAwsLambdaEventSourceMappingUpdate(d *schema.ResourceData, meta inte input.TumblingWindowInSeconds = aws.Int64(int64(d.Get("tumbling_window_in_seconds").(int))) } - err := resource.Retry(waiter.EventSourceMappingPropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.EventSourceMappingPropagationTimeout, func() *resource.RetryError { _, err := conn.UpdateEventSourceMapping(input) if tfawserr.ErrCodeEquals(err, lambda.ErrCodeResourceInUseException) { @@ -589,7 +589,7 @@ func resourceAwsLambdaEventSourceMappingDelete(d *schema.ResourceData, meta inte UUID: aws.String(d.Id()), } - err := resource.Retry(waiter.EventSourceMappingPropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.EventSourceMappingPropagationTimeout, func() *resource.RetryError { _, err := conn.DeleteEventSourceMapping(input) if tfawserr.ErrCodeEquals(err, lambda.ErrCodeResourceInUseException) { diff --git a/aws/resource_aws_lambda_event_source_mapping_test.go b/aws/resource_aws_lambda_event_source_mapping_test.go index f5d7c9fe127..4f34f386c1b 100644 --- a/aws/resource_aws_lambda_event_source_mapping_test.go +++ b/aws/resource_aws_lambda_event_source_mapping_test.go @@ -819,7 +819,7 @@ func testAccCheckAWSLambdaEventSourceMappingIsBeingDisabled(conf *lambda.EventSo return func(s *terraform.State) error { conn := testAccProvider.Meta().(*AWSClient).lambdaconn // Disable enabled state - err := resource.Retry(10*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(10*time.Minute, func() *resource.RetryError { params := &lambda.UpdateEventSourceMappingInput{ UUID: conf.UUID, Enabled: aws.Bool(false), @@ -845,7 +845,7 @@ func testAccCheckAWSLambdaEventSourceMappingIsBeingDisabled(conf *lambda.EventSo } // wait for state to be propagated - return resource.Retry(10*time.Minute, func() *resource.RetryError { + return tfresource.RetryOnConnectionResetByPeer(10*time.Minute, func() *resource.RetryError { params := &lambda.GetEventSourceMappingInput{ UUID: conf.UUID, } diff --git a/aws/resource_aws_lambda_function.go b/aws/resource_aws_lambda_function.go index 5964148f1de..3debf754c1d 100644 --- a/aws/resource_aws_lambda_function.go +++ b/aws/resource_aws_lambda_function.go @@ -521,7 +521,7 @@ func resourceAwsLambdaFunctionCreate(d *schema.ResourceData, meta interface{}) e params.Tags = tags.IgnoreAws().LambdaTags() } - err := resource.Retry(waiter.LambdaFunctionCreateTimeout, func() *resource.RetryError { // nosem: helper-schema-resource-Retry-without-TimeoutError-check + err := tfresource.RetryOnConnectionResetByPeer(waiter.LambdaFunctionCreateTimeout, func() *resource.RetryError { // nosem: helper-schema-resource-Retry-without-TimeoutError-check _, err := conn.CreateFunction(params) if tfawserr.ErrMessageContains(err, lambda.ErrCodeInvalidParameterValueException, "The role defined for the function cannot be assumed by Lambda") { @@ -560,7 +560,7 @@ func resourceAwsLambdaFunctionCreate(d *schema.ResourceData, meta interface{}) e return fmt.Errorf("error creating Lambda Function (1): %w", err) } - err := resource.Retry(waiter.LambdaFunctionExtraThrottlingTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.LambdaFunctionExtraThrottlingTimeout, func() *resource.RetryError { _, err := conn.CreateFunction(params) if tfawserr.ErrMessageContains(err, lambda.ErrCodeInvalidParameterValueException, "throttled by EC2") { @@ -599,7 +599,7 @@ func resourceAwsLambdaFunctionCreate(d *schema.ResourceData, meta interface{}) e ReservedConcurrentExecutions: aws.Int64(int64(reservedConcurrentExecutions)), } - err := resource.Retry(waiter.LambdaFunctionPutConcurrencyTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.LambdaFunctionPutConcurrencyTimeout, func() *resource.RetryError { _, err := conn.PutFunctionConcurrency(concurrencyParams) if tfawserr.ErrCodeEquals(err, lambda.ErrCodeResourceNotFoundException) { @@ -1050,7 +1050,7 @@ func resourceAwsLambdaFunctionUpdate(d *schema.ResourceData, meta interface{}) e if configUpdate { log.Printf("[DEBUG] Send Update Lambda Function Configuration request: %#v", configReq) - err := resource.Retry(waiter.LambdaFunctionUpdateTimeout, func() *resource.RetryError { // nosem: helper-schema-resource-Retry-without-TimeoutError-check + err := tfresource.RetryOnConnectionResetByPeer(waiter.LambdaFunctionUpdateTimeout, func() *resource.RetryError { // nosem: helper-schema-resource-Retry-without-TimeoutError-check _, err := conn.UpdateFunctionConfiguration(configReq) if tfawserr.ErrMessageContains(err, lambda.ErrCodeInvalidParameterValueException, "The role defined for the function cannot be assumed by Lambda") { @@ -1090,7 +1090,7 @@ func resourceAwsLambdaFunctionUpdate(d *schema.ResourceData, meta interface{}) e } // Allow more time for EC2 throttling - err := resource.Retry(waiter.LambdaFunctionExtraThrottlingTimeout, func() *resource.RetryError { // nosem: helper-schema-resource-Retry-without-TimeoutError-check + err := tfresource.RetryOnConnectionResetByPeer(waiter.LambdaFunctionExtraThrottlingTimeout, func() *resource.RetryError { // nosem: helper-schema-resource-Retry-without-TimeoutError-check _, err = conn.UpdateFunctionConfiguration(configReq) if tfawserr.ErrMessageContains(err, lambda.ErrCodeInvalidParameterValueException, "throttled by EC2") { @@ -1197,7 +1197,7 @@ func resourceAwsLambdaFunctionUpdate(d *schema.ResourceData, meta interface{}) e } var output *lambda.FunctionConfiguration - err := resource.Retry(waiter.LambdaFunctionPublishTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.LambdaFunctionPublishTimeout, func() *resource.RetryError { var err error output, err = conn.PublishVersion(versionReq) diff --git a/aws/resource_aws_lambda_function_event_invoke_config.go b/aws/resource_aws_lambda_function_event_invoke_config.go index 009dd905eac..9a6cbf1ca88 100644 --- a/aws/resource_aws_lambda_function_event_invoke_config.go +++ b/aws/resource_aws_lambda_function_event_invoke_config.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsLambdaFunctionEventInvokeConfig() *schema.Resource { @@ -115,7 +116,7 @@ func resourceAwsLambdaFunctionEventInvokeConfigCreate(d *schema.ResourceData, me } // Retry for destination validation eventual consistency errors - err := resource.Retry(2*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(2*time.Minute, func() *resource.RetryError { _, err := conn.PutFunctionEventInvokeConfig(input) // InvalidParameterValueException: The destination ARN arn:PARTITION:SERVICE:REGION:ACCOUNT:RESOURCE is invalid. @@ -213,7 +214,7 @@ func resourceAwsLambdaFunctionEventInvokeConfigUpdate(d *schema.ResourceData, me } // Retry for destination validation eventual consistency errors - err = resource.Retry(2*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(2*time.Minute, func() *resource.RetryError { _, err := conn.PutFunctionEventInvokeConfig(input) // InvalidParameterValueException: The destination ARN arn:PARTITION:SERVICE:REGION:ACCOUNT:RESOURCE is invalid. diff --git a/aws/resource_aws_lambda_permission.go b/aws/resource_aws_lambda_permission.go index 5f7888fcfbe..53cc325f729 100644 --- a/aws/resource_aws_lambda_permission.go +++ b/aws/resource_aws_lambda_permission.go @@ -131,7 +131,7 @@ func resourceAwsLambdaPermissionCreate(d *schema.ResourceData, meta interface{}) log.Printf("[DEBUG] Adding new Lambda permission: %s", input) var out *lambda.AddPermissionOutput // Retry for IAM and Lambda eventual consistency - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { var err error out, err = conn.AddPermission(&input) @@ -159,7 +159,7 @@ func resourceAwsLambdaPermissionCreate(d *schema.ResourceData, meta interface{}) d.SetId(statementId) - err = resource.Retry(5*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { // IAM is eventually consistent :/ err := resourceAwsLambdaPermissionRead(d, meta) if err != nil { @@ -201,7 +201,7 @@ func resourceAwsLambdaPermissionRead(d *schema.ResourceData, meta interface{}) e log.Printf("[DEBUG] Looking for Lambda permission: %s", input) var out *lambda.GetPolicyOutput var statement *LambdaPolicyStatement - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { // IAM is eventually consistent :/ var err error out, err = conn.GetPolicy(&input) diff --git a/aws/resource_aws_lambda_permission_test.go b/aws/resource_aws_lambda_permission_test.go index 3cb0dc01ba6..5ddb912ef2c 100644 --- a/aws/resource_aws_lambda_permission_test.go +++ b/aws/resource_aws_lambda_permission_test.go @@ -597,7 +597,7 @@ func testAccCheckLambdaPermissionExists(n string, statement *LambdaPolicyStateme // IAM is eventually consistent var foundStatement *LambdaPolicyStatement - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { var err error foundStatement, err = lambdaPermissionExists(rs, conn) if err != nil { @@ -633,7 +633,7 @@ func testAccCheckAWSLambdaPermissionDestroy(s *terraform.State) error { } // IAM is eventually consistent - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { err := isLambdaPermissionGone(rs, conn) if err != nil { if !strings.HasPrefix(err.Error(), "Error unmarshalling Lambda policy") { diff --git a/aws/resource_aws_launch_configuration.go b/aws/resource_aws_launch_configuration.go index 18f29021980..0643b7e00b8 100644 --- a/aws/resource_aws_launch_configuration.go +++ b/aws/resource_aws_launch_configuration.go @@ -15,6 +15,7 @@ import ( "github.com/terraform-providers/terraform-provider-aws/aws/internal/hashcode" "github.com/terraform-providers/terraform-provider-aws/aws/internal/naming" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsLaunchConfiguration() *schema.Resource { @@ -533,7 +534,7 @@ func resourceAwsLaunchConfigurationCreate(d *schema.ResourceData, meta interface // IAM profiles can take ~10 seconds to propagate in AWS: // http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#launch-instance-with-role-console - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := autoscalingconn.CreateLaunchConfiguration(&createLaunchConfigurationOpts) if err != nil { if isAWSErr(err, "ValidationError", "Invalid IamInstanceProfile") { @@ -635,7 +636,7 @@ func resourceAwsLaunchConfigurationDelete(d *schema.ResourceData, meta interface log.Printf("[DEBUG] Deleting Autoscaling Launch Configuration: %s", d.Id()) // Retry for Autoscaling eventual consistency - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := autoscalingconn.DeleteLaunchConfiguration(input) if isAWSErr(err, autoscaling.ErrCodeResourceInUseFault, "") { diff --git a/aws/resource_aws_lb.go b/aws/resource_aws_lb.go index d5dde5f3cc8..363c702fce3 100644 --- a/aws/resource_aws_lb.go +++ b/aws/resource_aws_lb.go @@ -385,7 +385,7 @@ func resourceAwsLbUpdate(d *schema.ResourceData, meta interface{}) error { if d.HasChange("tags_all") { o, n := d.GetChange("tags_all") - err := resource.Retry(waiter.LoadBalancerTagPropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.LoadBalancerTagPropagationTimeout, func() *resource.RetryError { err := keyvaluetags.Elbv2UpdateTags(conn, d.Id(), o, n) if tfawserr.ErrCodeEquals(err, elbv2.ErrCodeLoadBalancerNotFoundException) { @@ -645,7 +645,7 @@ func waitForNLBNetworkInterfacesToDetach(conn *ec2.EC2, lbArn string) error { }, } var out *ec2.DescribeNetworkInterfacesOutput - err = resource.Retry(waiter.LoadBalancerNetworkInterfaceDetachTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(waiter.LoadBalancerNetworkInterfaceDetachTimeout, func() *resource.RetryError { var err error out, err = conn.DescribeNetworkInterfaces(input) if err != nil { diff --git a/aws/resource_aws_lb_listener.go b/aws/resource_aws_lb_listener.go index b9b9f56c9b2..dccb2fc9118 100644 --- a/aws/resource_aws_lb_listener.go +++ b/aws/resource_aws_lb_listener.go @@ -433,7 +433,7 @@ func resourceAwsLbListenerCreate(d *schema.ResourceData, meta interface{}) error var output *elbv2.CreateListenerOutput - err := resource.Retry(waiter.LoadBalancerListenerCreateTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.LoadBalancerListenerCreateTimeout, func() *resource.RetryError { var err error output, err = conn.CreateListener(params) @@ -473,7 +473,7 @@ func resourceAwsLbListenerRead(d *schema.ResourceData, meta interface{}) error { var listener *elbv2.Listener - err := resource.Retry(waiter.LoadBalancerListenerReadTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.LoadBalancerListenerReadTimeout, func() *resource.RetryError { var err error listener, err = finder.ListenerByARN(conn, d.Id()) @@ -592,7 +592,7 @@ func resourceAwsLbListenerUpdate(d *schema.ResourceData, meta interface{}) error } } - err := resource.Retry(waiter.LoadBalancerListenerUpdateTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.LoadBalancerListenerUpdateTimeout, func() *resource.RetryError { _, err := conn.ModifyListener(params) if tfawserr.ErrCodeEquals(err, elbv2.ErrCodeCertificateNotFoundException) { @@ -618,7 +618,7 @@ func resourceAwsLbListenerUpdate(d *schema.ResourceData, meta interface{}) error if d.HasChange("tags_all") { o, n := d.GetChange("tags_all") - err := resource.Retry(waiter.LoadBalancerTagPropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.LoadBalancerTagPropagationTimeout, func() *resource.RetryError { err := keyvaluetags.Elbv2UpdateTags(conn, d.Id(), o, n) if tfawserr.ErrCodeEquals(err, elbv2.ErrCodeLoadBalancerNotFoundException) || diff --git a/aws/resource_aws_lb_listener_certificate.go b/aws/resource_aws_lb_listener_certificate.go index 03c13532406..7db9f220394 100644 --- a/aws/resource_aws_lb_listener_certificate.go +++ b/aws/resource_aws_lb_listener_certificate.go @@ -10,6 +10,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" tfelbv2 "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/elbv2" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsLbListenerCertificate() *schema.Resource { @@ -55,7 +56,7 @@ func resourceAwsLbListenerCertificateCreate(d *schema.ResourceData, meta interfa log.Printf("[DEBUG] Adding certificate: %s of listener: %s", certificateArn, listenerArn) - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := conn.AddListenerCertificates(params) // Retry for IAM Server Certificate eventual consistency @@ -94,7 +95,7 @@ func resourceAwsLbListenerCertificateRead(d *schema.ResourceData, meta interface log.Printf("[DEBUG] Reading certificate: %s of listener: %s", certificateArn, listenerArn) var certificate *elbv2.Certificate - err = resource.Retry(1*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { var err error certificate, err = findAwsLbListenerCertificate(certificateArn, listenerArn, true, nil, conn) if err != nil { diff --git a/aws/resource_aws_lb_listener_rule.go b/aws/resource_aws_lb_listener_rule.go index 4945fa860e0..3633a7e8659 100644 --- a/aws/resource_aws_lb_listener_rule.go +++ b/aws/resource_aws_lb_listener_rule.go @@ -509,7 +509,7 @@ func resourceAwsLbListenerRuleCreate(d *schema.ResourceData, meta interface{}) e } } else { var priority int64 - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { var err error priority, err = highestListenerRulePriority(elbconn, listenerArn) if err != nil { @@ -557,7 +557,7 @@ func resourceAwsLbListenerRuleRead(d *schema.ResourceData, meta interface{}) err RuleArns: []*string{aws.String(d.Id())}, } - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { var err error resp, err = elbconn.DescribeRules(req) if err != nil { @@ -844,7 +844,7 @@ func resourceAwsLbListenerRuleUpdate(d *schema.ResourceData, meta interface{}) e if d.HasChange("tags_all") { o, n := d.GetChange("tags_all") - err := resource.Retry(waiter.LoadBalancerTagPropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.LoadBalancerTagPropagationTimeout, func() *resource.RetryError { err := keyvaluetags.Elbv2UpdateTags(elbconn, d.Id(), o, n) if tfawserr.ErrCodeEquals(err, elbv2.ErrCodeLoadBalancerNotFoundException) { diff --git a/aws/resource_aws_lb_target_group.go b/aws/resource_aws_lb_target_group.go index 73ee689aa8c..0d526bcf89c 100644 --- a/aws/resource_aws_lb_target_group.go +++ b/aws/resource_aws_lb_target_group.go @@ -386,7 +386,7 @@ func resourceAwsLbTargetGroupRead(d *schema.ResourceData, meta interface{}) erro var targetGroup *elbv2.TargetGroup - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error targetGroup, err = finder.TargetGroupByARN(conn, d.Id()) @@ -441,7 +441,7 @@ func resourceAwsLbTargetGroupUpdate(d *schema.ResourceData, meta interface{}) er if d.HasChange("tags_all") { o, n := d.GetChange("tags_all") - err := resource.Retry(waiter.LoadBalancerTagPropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.LoadBalancerTagPropagationTimeout, func() *resource.RetryError { err := keyvaluetags.Elbv2UpdateTags(conn, d.Id(), o, n) if tfawserr.ErrCodeEquals(err, elbv2.ErrCodeTargetGroupNotFoundException) { @@ -632,7 +632,7 @@ func resourceAwsLbTargetGroupDelete(d *schema.ResourceData, meta interface{}) er } log.Printf("[DEBUG] Deleting Target Group (%s): %s", d.Id(), input) - err := resource.Retry(waiter.TargetGroupDeleteTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.TargetGroupDeleteTimeout, func() *resource.RetryError { _, err := conn.DeleteTargetGroup(input) if tfawserr.ErrMessageContains(err, "ResourceInUse", "is currently in use by a listener or a rule") { diff --git a/aws/resource_aws_lb_target_group_attachment.go b/aws/resource_aws_lb_target_group_attachment.go index e506ab491f2..c93db74b492 100644 --- a/aws/resource_aws_lb_target_group_attachment.go +++ b/aws/resource_aws_lb_target_group_attachment.go @@ -9,6 +9,7 @@ import ( "github.com/aws/aws-sdk-go/service/elbv2" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsLbTargetGroupAttachment() *schema.Resource { @@ -68,7 +69,7 @@ func resourceAwsLbAttachmentCreate(d *schema.ResourceData, meta interface{}) err log.Printf("[INFO] Registering Target %s with Target Group %s", d.Get("target_id").(string), d.Get("target_group_arn").(string)) - err := resource.Retry(10*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(10*time.Minute, func() *resource.RetryError { _, err := elbconn.RegisterTargets(params) if isAWSErr(err, "InvalidTarget", "") { diff --git a/aws/resource_aws_lex_bot.go b/aws/resource_aws_lex_bot.go index c9f63219559..c0aadec8003 100644 --- a/aws/resource_aws_lex_bot.go +++ b/aws/resource_aws_lex_bot.go @@ -221,7 +221,7 @@ func resourceAwsLexBotCreate(d *schema.ResourceData, meta interface{}) error { input.VoiceId = aws.String(v.(string)) } - err := resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { output, err := conn.PutBot(input) if tfawserr.ErrCodeEquals(err, lexmodelbuildingservice.ErrCodeConflictException) { @@ -349,7 +349,7 @@ func resourceAwsLexBotUpdate(d *schema.ResourceData, meta interface{}) error { input.VoiceId = aws.String(v.(string)) } - err := resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { _, err := conn.PutBot(input) if isAWSErr(err, lexmodelbuildingservice.ErrCodeConflictException, "") { @@ -380,7 +380,7 @@ func resourceAwsLexBotDelete(d *schema.ResourceData, meta interface{}) error { Name: aws.String(d.Id()), } - err := resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { _, err := conn.DeleteBot(input) if isAWSErr(err, lexmodelbuildingservice.ErrCodeConflictException, "") { diff --git a/aws/resource_aws_lex_bot_alias.go b/aws/resource_aws_lex_bot_alias.go index 77eadab03d7..9f128b158f9 100644 --- a/aws/resource_aws_lex_bot_alias.go +++ b/aws/resource_aws_lex_bot_alias.go @@ -136,7 +136,7 @@ func resourceAwsLexBotAliasCreate(d *schema.ResourceData, meta interface{}) erro input.ConversationLogs = conversationLogs } - err := resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { output, err := conn.PutBotAlias(input) input.Checksum = output.Checksum @@ -229,7 +229,7 @@ func resourceAwsLexBotAliasUpdate(d *schema.ResourceData, meta interface{}) erro input.ConversationLogs = conversationLogs } - err := resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { _, err := conn.PutBotAlias(input) // IAM eventual consistency @@ -268,7 +268,7 @@ func resourceAwsLexBotAliasDelete(d *schema.ResourceData, meta interface{}) erro Name: aws.String(botAliasName), } - err := resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { _, err := conn.DeleteBotAlias(input) if isAWSErr(err, lexmodelbuildingservice.ErrCodeConflictException, "") { diff --git a/aws/resource_aws_lex_intent.go b/aws/resource_aws_lex_intent.go index ae7cc5117a7..ed40e10b550 100644 --- a/aws/resource_aws_lex_intent.go +++ b/aws/resource_aws_lex_intent.go @@ -296,7 +296,7 @@ func resourceAwsLexIntentCreate(d *schema.ResourceData, meta interface{}) error input.Slots = expandLexSlots(v.(*schema.Set).List()) } - err := resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { output, err := conn.PutIntent(input) if tfawserr.ErrCodeEquals(err, lexmodelbuildingservice.ErrCodeConflictException) { @@ -447,7 +447,7 @@ func resourceAwsLexIntentUpdate(d *schema.ResourceData, meta interface{}) error input.Slots = expandLexSlots(v.(*schema.Set).List()) } - err := resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { _, err := conn.PutIntent(input) if isAWSErr(err, lexmodelbuildingservice.ErrCodeConflictException, "") { @@ -478,7 +478,7 @@ func resourceAwsLexIntentDelete(d *schema.ResourceData, meta interface{}) error Name: aws.String(d.Id()), } - err := resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { _, err := conn.DeleteIntent(input) if isAWSErr(err, lexmodelbuildingservice.ErrCodeConflictException, "") { diff --git a/aws/resource_aws_lex_intent_test.go b/aws/resource_aws_lex_intent_test.go index bc601880d30..28910d152c7 100644 --- a/aws/resource_aws_lex_intent_test.go +++ b/aws/resource_aws_lex_intent_test.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func init() { @@ -595,7 +596,7 @@ func TestAccAwsLexIntent_updateWithExternalChange(t *testing.T) { Type: aws.String("ReturnIntent"), }, } - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := conn.PutIntent(input) if isAWSErr(err, lexmodelbuildingservice.ErrCodeConflictException, "") { diff --git a/aws/resource_aws_lex_slot_type.go b/aws/resource_aws_lex_slot_type.go index 2a485363aa6..1d1b24d15bc 100644 --- a/aws/resource_aws_lex_slot_type.go +++ b/aws/resource_aws_lex_slot_type.go @@ -124,7 +124,7 @@ func resourceAwsLexSlotTypeCreate(d *schema.ResourceData, meta interface{}) erro input.EnumerationValues = expandLexEnumerationValues(v.(*schema.Set).List()) } - err := resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { output, err := conn.PutSlotType(input) if tfawserr.ErrCodeEquals(err, lexmodelbuildingservice.ErrCodeConflictException) { @@ -235,7 +235,7 @@ func resourceAwsLexSlotTypeUpdate(d *schema.ResourceData, meta interface{}) erro input.EnumerationValues = expandLexEnumerationValues(v.(*schema.Set).List()) } - err := resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { _, err := conn.PutSlotType(input) if tfawserr.ErrCodeEquals(err, lexmodelbuildingservice.ErrCodeConflictException) { @@ -266,7 +266,7 @@ func resourceAwsLexSlotTypeDelete(d *schema.ResourceData, meta interface{}) erro Name: aws.String(d.Id()), } - err := resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { _, err := conn.DeleteSlotType(input) if tfawserr.ErrCodeEquals(err, lexmodelbuildingservice.ErrCodeConflictException) { diff --git a/aws/resource_aws_media_package_channel.go b/aws/resource_aws_media_package_channel.go index 17e7fe93126..f3dae367ec6 100644 --- a/aws/resource_aws_media_package_channel.go +++ b/aws/resource_aws_media_package_channel.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsMediaPackageChannel() *schema.Resource { @@ -175,7 +176,7 @@ func resourceAwsMediaPackageChannelDelete(d *schema.ResourceData, meta interface dcinput := &mediapackage.DescribeChannelInput{ Id: aws.String(d.Id()), } - err = resource.Retry(5*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.DescribeChannel(dcinput) if err != nil { if isAWSErr(err, mediapackage.ErrCodeNotFoundException, "") { diff --git a/aws/resource_aws_media_store_container.go b/aws/resource_aws_media_store_container.go index eb1cdc4a1c1..673d8aaea49 100644 --- a/aws/resource_aws_media_store_container.go +++ b/aws/resource_aws_media_store_container.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsMediaStoreContainer() *schema.Resource { @@ -158,7 +159,7 @@ func resourceAwsMediaStoreContainerDelete(d *schema.ResourceData, meta interface dcinput := &mediastore.DescribeContainerInput{ ContainerName: aws.String(d.Id()), } - err = resource.Retry(5*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.DescribeContainer(dcinput) if err != nil { if isAWSErr(err, mediastore.ErrCodeContainerNotFoundException, "") { diff --git a/aws/resource_aws_msk_cluster.go b/aws/resource_aws_msk_cluster.go index c36694446dc..5dba39d6705 100644 --- a/aws/resource_aws_msk_cluster.go +++ b/aws/resource_aws_msk_cluster.go @@ -15,6 +15,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/msk/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsMskCluster() *schema.Resource { @@ -415,7 +416,7 @@ func waitForMskClusterCreation(conn *kafka.Kafka, arn string) error { input := &kafka.DescribeClusterInput{ ClusterArn: aws.String(arn), } - err := resource.Retry(waiter.ClusterCreateTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.ClusterCreateTimeout, func() *resource.RetryError { out, err := conn.DescribeCluster(input) if err != nil { return resource.NonRetryableError(err) @@ -1216,7 +1217,7 @@ func resourceAwsMskClusterDeleteWaiter(conn *kafka.Kafka, arn string) error { input := &kafka.DescribeClusterInput{ ClusterArn: aws.String(arn), } - err := resource.Retry(waiter.ClusterDeleteTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.ClusterDeleteTimeout, func() *resource.RetryError { _, err := conn.DescribeCluster(input) if err != nil { diff --git a/aws/resource_aws_neptune_cluster.go b/aws/resource_aws_neptune_cluster.go index de27ba7af5d..fbfb2a1bafe 100644 --- a/aws/resource_aws_neptune_cluster.go +++ b/aws/resource_aws_neptune_cluster.go @@ -15,6 +15,7 @@ import ( "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/neptune/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) const ( @@ -385,7 +386,7 @@ func resourceAwsNeptuneClusterCreate(d *schema.ResourceData, meta interface{}) e log.Printf("[DEBUG] Neptune Cluster create options: %s", createDbClusterInput) } - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error if restoreDBClusterFromSnapshot { _, err = conn.RestoreDBClusterFromSnapshot(restoreDBClusterFromSnapshotInput) @@ -627,7 +628,7 @@ func resourceAwsNeptuneClusterUpdate(d *schema.ResourceData, meta interface{}) e } if requestUpdate { - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.ModifyDBCluster(req) if err != nil { if isAWSErr(err, "InvalidParameterValue", "IAM role ARN value is invalid or does not include the required permissions") { @@ -715,7 +716,7 @@ func resourceAwsNeptuneClusterDelete(d *schema.ResourceData, meta interface{}) e log.Printf("[DEBUG] Neptune Cluster delete options: %s", deleteOpts) - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := conn.DeleteDBCluster(&deleteOpts) if err != nil { if isAWSErr(err, neptune.ErrCodeInvalidDBClusterStateFault, "is not currently in the available state") { diff --git a/aws/resource_aws_neptune_cluster_instance.go b/aws/resource_aws_neptune_cluster_instance.go index 3d008504212..4c627ba5d95 100644 --- a/aws/resource_aws_neptune_cluster_instance.go +++ b/aws/resource_aws_neptune_cluster_instance.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsNeptuneClusterInstance() *schema.Resource { @@ -242,7 +243,7 @@ func resourceAwsNeptuneClusterInstanceCreate(d *schema.ResourceData, meta interf log.Printf("[DEBUG] Creating Neptune Instance: %s", createOpts) var resp *neptune.CreateDBInstanceOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error resp, err = conn.CreateDBInstance(createOpts) if err != nil { @@ -418,7 +419,7 @@ func resourceAwsNeptuneClusterInstanceUpdate(d *schema.ResourceData, meta interf log.Printf("[DEBUG] Send Neptune Instance Modification request: %#v", requestUpdate) if requestUpdate { log.Printf("[DEBUG] Neptune Instance Modification request: %#v", req) - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.ModifyDBInstance(req) if err != nil { if isAWSErr(err, "InvalidParameterValue", "IAM role ARN value is invalid or does not include the required permissions") { diff --git a/aws/resource_aws_neptune_parameter_group.go b/aws/resource_aws_neptune_parameter_group.go index b260ab615e9..dfac242ca80 100644 --- a/aws/resource_aws_neptune_parameter_group.go +++ b/aws/resource_aws_neptune_parameter_group.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) // We can only modify 20 parameters at a time, so walk them until @@ -219,7 +220,7 @@ func resourceAwsNeptuneParameterGroupUpdate(d *schema.ResourceData, meta interfa } log.Printf("[DEBUG] Reset Neptune Parameter Group: %s", resetOpts) - err := resource.Retry(30*time.Second, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(30*time.Second, func() *resource.RetryError { _, err := conn.ResetDBParameterGroup(&resetOpts) if err != nil { if isAWSErr(err, "InvalidDBParameterGroupState", " has pending changes") { @@ -274,7 +275,7 @@ func resourceAwsNeptuneParameterGroupDelete(d *schema.ResourceData, meta interfa deleteOpts := neptune.DeleteDBParameterGroupInput{ DBParameterGroupName: aws.String(d.Id()), } - err := resource.Retry(3*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(3*time.Minute, func() *resource.RetryError { _, err := conn.DeleteDBParameterGroup(&deleteOpts) if err != nil { if isAWSErr(err, neptune.ErrCodeDBParameterGroupNotFoundFault, "") { diff --git a/aws/resource_aws_network_acl.go b/aws/resource_aws_network_acl.go index f127019cb47..7263aec584e 100644 --- a/aws/resource_aws_network_acl.go +++ b/aws/resource_aws_network_acl.go @@ -273,7 +273,7 @@ func resourceAwsNetworkAclRead(d *schema.ResourceData, meta interface{}) error { var networkAcl *ec2.NetworkAcl - err := resource.Retry(waiter.NetworkAclPropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.NetworkAclPropagationTimeout, func() *resource.RetryError { var err error networkAcl, err = finder.NetworkAclByID(conn, d.Id()) @@ -585,7 +585,7 @@ func resourceAwsNetworkAclDelete(d *schema.ResourceData, meta interface{}) error input := &ec2.DeleteNetworkAclInput{ NetworkAclId: aws.String(d.Id()), } - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.DeleteNetworkAcl(input) if err != nil { if isAWSErr(err, "InvalidNetworkAclID.NotFound", "") { diff --git a/aws/resource_aws_network_acl_rule.go b/aws/resource_aws_network_acl_rule.go index 36dd1686fa6..2f21f8eb9a1 100644 --- a/aws/resource_aws_network_acl_rule.go +++ b/aws/resource_aws_network_acl_rule.go @@ -210,7 +210,7 @@ func resourceAwsNetworkAclRuleRead(d *schema.ResourceData, meta interface{}) err var resp *ec2.NetworkAclEntry - err := resource.Retry(waiter.NetworkAclEntryPropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.NetworkAclEntryPropagationTimeout, func() *resource.RetryError { var err error resp, err = finder.NetworkAclEntry(conn, networkAclID, egress, ruleNumber) diff --git a/aws/resource_aws_network_interface_sg_attachment.go b/aws/resource_aws_network_interface_sg_attachment.go index 1684f41639e..65ad4139ae4 100644 --- a/aws/resource_aws_network_interface_sg_attachment.go +++ b/aws/resource_aws_network_interface_sg_attachment.go @@ -92,7 +92,7 @@ func resourceAwsNetworkInterfaceSGAttachmentRead(d *schema.ResourceData, meta in var groupIdentifier *ec2.GroupIdentifier - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error groupIdentifier, err = finder.NetworkInterfaceSecurityGroup(conn, interfaceID, sgID) diff --git a/aws/resource_aws_opsworks_permission.go b/aws/resource_aws_opsworks_permission.go index 3a9a73ae1f5..4a823c7330c 100644 --- a/aws/resource_aws_opsworks_permission.go +++ b/aws/resource_aws_opsworks_permission.go @@ -10,6 +10,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsOpsworksPermission() *schema.Resource { @@ -120,7 +121,7 @@ func resourceAwsOpsworksSetPermission(d *schema.ResourceData, meta interface{}) req.Level = aws.String(d.Get("level").(string)) } - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := client.SetPermission(req) if err != nil { diff --git a/aws/resource_aws_opsworks_stack.go b/aws/resource_aws_opsworks_stack.go index d884210bbbd..1f9770198a8 100644 --- a/aws/resource_aws_opsworks_stack.go +++ b/aws/resource_aws_opsworks_stack.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsOpsworksStack() *schema.Resource { @@ -467,7 +468,7 @@ func resourceAwsOpsworksStackCreate(d *schema.ResourceData, meta interface{}) er log.Printf("[DEBUG] Creating OpsWorks stack: %s", req) var resp *opsworks.CreateStackOutput - err = resource.Retry(20*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(20*time.Minute, func() *resource.RetryError { resp, err = client.CreateStack(req) if err != nil { // If Terraform is also managing the service IAM role, it may have just been created and not yet be diff --git a/aws/resource_aws_organizations_account.go b/aws/resource_aws_organizations_account.go index 47029fb8b37..16ef692ac98 100644 --- a/aws/resource_aws_organizations_account.go +++ b/aws/resource_aws_organizations_account.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsOrganizationsAccount() *schema.Resource { @@ -108,7 +109,7 @@ func resourceAwsOrganizationsAccountCreate(d *schema.ResourceData, meta interfac log.Printf("[DEBUG] Creating AWS Organizations Account: %s", createOpts) var resp *organizations.CreateAccountOutput - err := resource.Retry(4*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(4*time.Minute, func() *resource.RetryError { var err error resp, err = conn.CreateAccount(createOpts) diff --git a/aws/resource_aws_organizations_organizational_unit.go b/aws/resource_aws_organizations_organizational_unit.go index e2b9f4e0827..ee7ff3ce019 100644 --- a/aws/resource_aws_organizations_organizational_unit.go +++ b/aws/resource_aws_organizations_organizational_unit.go @@ -88,7 +88,7 @@ func resourceAwsOrganizationsOrganizationalUnitCreate(d *schema.ResourceData, me var err error var resp *organizations.CreateOrganizationalUnitOutput - err = resource.Retry(4*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(4*time.Minute, func() *resource.RetryError { resp, err = conn.CreateOrganizationalUnit(createOpts) if tfawserr.ErrCodeEquals(err, organizations.ErrCodeFinalizingOrganizationException) { diff --git a/aws/resource_aws_organizations_policy.go b/aws/resource_aws_organizations_policy.go index eb7a4034c83..8b1119941f3 100644 --- a/aws/resource_aws_organizations_policy.go +++ b/aws/resource_aws_organizations_policy.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsOrganizationsPolicy() *schema.Resource { @@ -78,7 +79,7 @@ func resourceAwsOrganizationsPolicyCreate(ctx context.Context, d *schema.Resourc var err error var resp *organizations.CreatePolicyOutput - err = resource.Retry(4*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(4*time.Minute, func() *resource.RetryError { resp, err = conn.CreatePolicy(input) if err != nil { diff --git a/aws/resource_aws_organizations_policy_attachment.go b/aws/resource_aws_organizations_policy_attachment.go index b69f7d92670..b23225fcec5 100644 --- a/aws/resource_aws_organizations_policy_attachment.go +++ b/aws/resource_aws_organizations_policy_attachment.go @@ -10,6 +10,7 @@ import ( "github.com/aws/aws-sdk-go/service/organizations" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsOrganizationsPolicyAttachment() *schema.Resource { @@ -49,7 +50,7 @@ func resourceAwsOrganizationsPolicyAttachmentCreate(d *schema.ResourceData, meta log.Printf("[DEBUG] Creating Organizations Policy Attachment: %s", input) - err := resource.Retry(4*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(4*time.Minute, func() *resource.RetryError { _, err := conn.AttachPolicy(input) if err != nil { diff --git a/aws/resource_aws_pinpoint_event_stream.go b/aws/resource_aws_pinpoint_event_stream.go index 5fff883003e..1e8c1a4f94f 100644 --- a/aws/resource_aws_pinpoint_event_stream.go +++ b/aws/resource_aws_pinpoint_event_stream.go @@ -59,7 +59,7 @@ func resourceAwsPinpointEventStreamUpsert(d *schema.ResourceData, meta interface } // Retry for IAM eventual consistency - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.PutEventStream(&req) if tfawserr.ErrMessageContains(err, pinpoint.ErrCodeBadRequestException, "make sure the IAM Role is configured correctly") { diff --git a/aws/resource_aws_qldb_ledger.go b/aws/resource_aws_qldb_ledger.go index bbb9109f4a8..dfce8482c71 100644 --- a/aws/resource_aws_qldb_ledger.go +++ b/aws/resource_aws_qldb_ledger.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsQLDBLedger() *schema.Resource { @@ -201,7 +202,7 @@ func resourceAwsQLDBLedgerDelete(d *schema.ResourceData, meta interface{}) error } log.Printf("[INFO] Deleting QLDB Ledger: %s", d.Id()) - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.DeleteLedger(deleteLedgerOpts) if isAWSErr(err, qldb.ErrCodeResourceInUseException, "") { diff --git a/aws/resource_aws_rds_cluster.go b/aws/resource_aws_rds_cluster.go index 7fbac5d135d..be415a4a463 100644 --- a/aws/resource_aws_rds_cluster.go +++ b/aws/resource_aws_rds_cluster.go @@ -16,6 +16,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) const ( @@ -574,7 +575,7 @@ func resourceAwsRDSClusterCreate(d *schema.ResourceData, meta interface{}) error } log.Printf("[DEBUG] RDS Cluster restore from snapshot configuration: %s", opts) - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.RestoreDBClusterFromSnapshot(&opts) if err != nil { if isAWSErr(err, "InvalidParameterValue", "IAM role ARN value is invalid or does not include the required permissions") { @@ -676,7 +677,7 @@ func resourceAwsRDSClusterCreate(d *schema.ResourceData, meta interface{}) error log.Printf("[DEBUG] RDS Cluster restore options: %s", createOpts) // Retry for IAM/S3 eventual consistency var resp *rds.RestoreDBClusterFromS3Output - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { var err error resp, err = conn.RestoreDBClusterFromS3(createOpts) if err != nil { @@ -904,7 +905,7 @@ func resourceAwsRDSClusterCreate(d *schema.ResourceData, meta interface{}) error log.Printf("[DEBUG] RDS Cluster create options: %s", createOpts) var resp *rds.CreateDBClusterOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error resp, err = conn.CreateDBCluster(createOpts) if err != nil { @@ -1227,7 +1228,7 @@ func resourceAwsRDSClusterUpdate(d *schema.ResourceData, meta interface{}) error } if requestUpdate { - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.ModifyDBCluster(req) if err != nil { if isAWSErr(err, "InvalidParameterValue", "IAM role ARN value is invalid or does not include the required permissions") { @@ -1362,7 +1363,7 @@ func resourceAwsRDSClusterDelete(d *schema.ResourceData, meta interface{}) error log.Printf("[DEBUG] RDS Cluster delete options: %s", deleteOpts) - err := resource.Retry(rdsClusterTimeoutDelete, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(rdsClusterTimeoutDelete, func() *resource.RetryError { _, err := conn.DeleteDBCluster(&deleteOpts) if err != nil { if isAWSErr(err, rds.ErrCodeInvalidDBClusterStateFault, "is not currently in the available state") { diff --git a/aws/resource_aws_rds_cluster_instance.go b/aws/resource_aws_rds_cluster_instance.go index 6a1725c68a8..f744dc609b8 100644 --- a/aws/resource_aws_rds_cluster_instance.go +++ b/aws/resource_aws_rds_cluster_instance.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsRDSClusterInstance() *schema.Resource { @@ -288,7 +289,7 @@ func resourceAwsRDSClusterInstanceCreate(d *schema.ResourceData, meta interface{ log.Printf("[DEBUG] Creating RDS DB Instance opts: %s", createOpts) var resp *rds.CreateDBInstanceOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error resp, err = conn.CreateDBInstance(createOpts) if err != nil { @@ -562,7 +563,7 @@ func resourceAwsRDSClusterInstanceUpdate(d *schema.ResourceData, meta interface{ log.Printf("[DEBUG] Send DB Instance Modification request: %#v", requestUpdate) if requestUpdate { log.Printf("[DEBUG] DB Instance Modification request: %#v", req) - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.ModifyDBInstance(req) if err != nil { if isAWSErr(err, "InvalidParameterValue", "IAM role ARN value is invalid or does not include the required permissions") { diff --git a/aws/resource_aws_rds_cluster_instance_test.go b/aws/resource_aws_rds_cluster_instance_test.go index 1edc28ebe52..c6971f5ccb1 100644 --- a/aws/resource_aws_rds_cluster_instance_test.go +++ b/aws/resource_aws_rds_cluster_instance_test.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func TestAccAWSRDSClusterInstance_basic(t *testing.T) { @@ -349,7 +350,7 @@ func testAccAWSClusterInstanceDisappears(v *rds.DBInstance) resource.TestCheckFu if _, err := conn.DeleteDBInstance(opts); err != nil { return err } - return resource.Retry(40*time.Minute, func() *resource.RetryError { + return tfresource.RetryOnConnectionResetByPeer(40*time.Minute, func() *resource.RetryError { opts := &rds.DescribeDBInstancesInput{ DBInstanceIdentifier: v.DBInstanceIdentifier, } diff --git a/aws/resource_aws_rds_cluster_parameter_group.go b/aws/resource_aws_rds_cluster_parameter_group.go index 49d0c18cb5d..2c9f4caa9ab 100644 --- a/aws/resource_aws_rds_cluster_parameter_group.go +++ b/aws/resource_aws_rds_cluster_parameter_group.go @@ -270,7 +270,7 @@ func resourceAwsRDSClusterParameterGroupUpdate(d *schema.ResourceData, meta inte } log.Printf("[DEBUG] Reset DB Cluster Parameter Group: %s", resetOpts) - err := resource.Retry(3*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(3*time.Minute, func() *resource.RetryError { _, err := rdsconn.ResetDBClusterParameterGroup(&resetOpts) if err != nil { if isAWSErr(err, "InvalidDBParameterGroupState", "has pending changes") { diff --git a/aws/resource_aws_rds_cluster_parameter_group_test.go b/aws/resource_aws_rds_cluster_parameter_group_test.go index 7978f96bb4e..9f43260c034 100644 --- a/aws/resource_aws_rds_cluster_parameter_group_test.go +++ b/aws/resource_aws_rds_cluster_parameter_group_test.go @@ -15,6 +15,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func init() { @@ -533,7 +534,7 @@ func testAccAWSDBClusterParameterGroupDisappears(v *rds.DBClusterParameterGroup) if _, err := conn.DeleteDBClusterParameterGroup(opts); err != nil { return err } - return resource.Retry(40*time.Minute, func() *resource.RetryError { + return tfresource.RetryOnConnectionResetByPeer(40*time.Minute, func() *resource.RetryError { opts := &rds.DescribeDBClusterParameterGroupsInput{ DBClusterParameterGroupName: v.DBClusterParameterGroupName, } diff --git a/aws/resource_aws_rds_global_cluster.go b/aws/resource_aws_rds_global_cluster.go index 763c4e05618..e5e7fbaa9c3 100644 --- a/aws/resource_aws_rds_global_cluster.go +++ b/aws/resource_aws_rds_global_cluster.go @@ -295,7 +295,7 @@ func resourceAwsRDSGlobalClusterDelete(d *schema.ResourceData, meta interface{}) // Allow for eventual consistency // InvalidGlobalClusterStateFault: Global Cluster arn:aws:rds::123456789012:global-cluster:tf-acc-test-5618525093076697001-0 is not empty - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := conn.DeleteGlobalCluster(input) if isAWSErr(err, rds.ErrCodeInvalidGlobalClusterStateFault, "is not empty") { @@ -489,7 +489,7 @@ func waitForRdsGlobalClusterRemoval(conn *rds.RDS, dbClusterIdentifier string) e var globalCluster *rds.GlobalCluster stillExistsErr := fmt.Errorf("RDS DB Cluster still exists in RDS Global Cluster") - err := resource.Retry(rdsGlobalClusterRemovalTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(rdsGlobalClusterRemovalTimeout, func() *resource.RetryError { var err error globalCluster, err = rdsDescribeGlobalClusterFromDbClusterARN(conn, dbClusterIdentifier) @@ -526,7 +526,7 @@ func resourceAwsRDSGlobalClusterUpgradeMajorEngineVersion(clusterId string, engi } input.AllowMajorVersionUpgrade = aws.Bool(true) input.EngineVersion = aws.String(engineVersion) - err := resource.Retry(waiter.RdsClusterInitiateUpgradeTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.RdsClusterInitiateUpgradeTimeout, func() *resource.RetryError { _, err := conn.ModifyGlobalCluster(input) if err != nil { if isAWSErr(err, rds.ErrCodeGlobalClusterNotFoundFault, "") { @@ -556,7 +556,7 @@ func resourceAwsRDSGlobalClusterUpgradeMinorEngineVersion(clusterMembers *schema DBClusterIdentifier: aws.String(clusterMemberArn.(string)), EngineVersion: aws.String(engineVersion), } - err := resource.Retry(waiter.RdsClusterInitiateUpgradeTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.RdsClusterInitiateUpgradeTimeout, func() *resource.RetryError { _, err := conn.ModifyDBCluster(modInput) if err != nil { if isAWSErr(err, "InvalidParameterValue", "IAM role ARN value is invalid or does not include the required permissions") { diff --git a/aws/resource_aws_redshift_cluster.go b/aws/resource_aws_redshift_cluster.go index ece741ddcf0..267a68417ec 100644 --- a/aws/resource_aws_redshift_cluster.go +++ b/aws/resource_aws_redshift_cluster.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsRedshiftCluster() *schema.Resource { @@ -916,7 +917,7 @@ func resourceAwsRedshiftClusterDelete(d *schema.ResourceData, meta interface{}) func deleteAwsRedshiftCluster(opts *redshift.DeleteClusterInput, conn *redshift.Redshift, timeout time.Duration) error { id := *opts.ClusterIdentifier log.Printf("[INFO] Deleting Redshift Cluster %q", id) - err := resource.Retry(15*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(15*time.Minute, func() *resource.RetryError { _, err := conn.DeleteCluster(opts) if isAWSErr(err, redshift.ErrCodeInvalidClusterStateFault, "") { return resource.RetryableError(err) diff --git a/aws/resource_aws_redshift_snapshot_copy_grant.go b/aws/resource_aws_redshift_snapshot_copy_grant.go index 25bbbe9e550..71010fcb06e 100644 --- a/aws/resource_aws_redshift_snapshot_copy_grant.go +++ b/aws/resource_aws_redshift_snapshot_copy_grant.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsRedshiftSnapshotCopyGrant() *schema.Resource { @@ -79,7 +80,7 @@ func resourceAwsRedshiftSnapshotCopyGrantCreate(d *schema.ResourceData, meta int log.Printf("[DEBUG] Created new Redshift SnapshotCopyGrant: %s", *out.SnapshotCopyGrant.SnapshotCopyGrantName) d.SetId(grantName) - err = resource.Retry(3*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(3*time.Minute, func() *resource.RetryError { var err error var grant *redshift.SnapshotCopyGrant grant, err = findAwsRedshiftSnapshotCopyGrant(conn, grantName) @@ -188,7 +189,7 @@ func resourceAwsRedshiftSnapshotCopyGrantDelete(d *schema.ResourceData, meta int // Used by the tests as well func waitForAwsRedshiftSnapshotCopyGrantToBeDeleted(conn *redshift.Redshift, grantName string) error { - err := resource.Retry(3*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(3*time.Minute, func() *resource.RetryError { var err error var grant *redshift.SnapshotCopyGrant grant, err = findAwsRedshiftSnapshotCopyGrant(conn, grantName) diff --git a/aws/resource_aws_route.go b/aws/resource_aws_route.go index 3ec120e060b..70746be0807 100644 --- a/aws/resource_aws_route.go +++ b/aws/resource_aws_route.go @@ -425,7 +425,7 @@ func resourceAwsRouteDelete(d *schema.ResourceData, meta interface{}) error { } log.Printf("[DEBUG] Deleting Route: %s", input) - err = resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { _, err = conn.DeleteRoute(input) if err == nil { diff --git a/aws/resource_aws_route53_record.go b/aws/resource_aws_route53_record.go index eeca2996097..febc46d9a0c 100644 --- a/aws/resource_aws_route53_record.go +++ b/aws/resource_aws_route53_record.go @@ -17,6 +17,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/hashcode" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) var r53NoRecordsFound = errors.New("No matching records found") @@ -469,7 +470,7 @@ func resourceAwsRoute53RecordCreate(d *schema.ResourceData, meta interface{}) er func changeRoute53RecordSet(conn *route53.Route53, input *route53.ChangeResourceRecordSetsInput) (interface{}, error) { var out *route53.ChangeResourceRecordSetsOutput - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { var err error out, err = conn.ChangeResourceRecordSets(input) if isAWSErr(err, route53.ErrCodeNoSuchHostedZone, "") { diff --git a/aws/resource_aws_route_table_test.go b/aws/resource_aws_route_table_test.go index f377447270a..9866f3cdee3 100644 --- a/aws/resource_aws_route_table_test.go +++ b/aws/resource_aws_route_table_test.go @@ -1280,7 +1280,7 @@ func testAccCheckAWSRouteTableWaitForVpcEndpointRoute(routeTable *ec2.RouteTable plId := aws.StringValue(resp.PrefixLists[0].PrefixListId) - err = resource.Retry(3*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(3*time.Minute, func() *resource.RetryError { resp, err := conn.DescribeRouteTables(&ec2.DescribeRouteTablesInput{ RouteTableIds: []*string{routeTable.RouteTableId}, }) diff --git a/aws/resource_aws_s3_account_public_access_block.go b/aws/resource_aws_s3_account_public_access_block.go index c564c4a840f..98ab51d568a 100644 --- a/aws/resource_aws_s3_account_public_access_block.go +++ b/aws/resource_aws_s3_account_public_access_block.go @@ -93,7 +93,7 @@ func resourceAwsS3AccountPublicAccessBlockRead(d *schema.ResourceData, meta inte // Retry for eventual consistency on creation var output *s3control.GetPublicAccessBlockOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.GetPublicAccessBlock(input) diff --git a/aws/resource_aws_s3_account_public_access_block_test.go b/aws/resource_aws_s3_account_public_access_block_test.go index 5b77d47908b..0f287243459 100644 --- a/aws/resource_aws_s3_account_public_access_block_test.go +++ b/aws/resource_aws_s3_account_public_access_block_test.go @@ -9,6 +9,7 @@ import ( "github.com/aws/aws-sdk-go/service/s3control" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) // S3 account-level settings must run serialized @@ -298,7 +299,7 @@ func testAccCheckAWSS3AccountPublicAccessBlockExists(resourceName string, config // Retry for eventual consistency var output *s3control.GetPublicAccessBlockOutput - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { var err error output, err = conn.GetPublicAccessBlock(input) @@ -340,7 +341,7 @@ func testAccCheckAWSS3AccountPublicAccessBlockDestroy(s *terraform.State) error } // Retry for eventual consistency - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := conn.GetPublicAccessBlock(input) if isAWSErr(err, s3control.ErrCodeNoSuchPublicAccessBlockConfiguration, "") { @@ -382,7 +383,7 @@ func testAccCheckAWSS3AccountPublicAccessBlockDisappears() resource.TestCheckFun } // Retry for eventual consistency - return resource.Retry(1*time.Minute, func() *resource.RetryError { + return tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := conn.GetPublicAccessBlock(getInput) if isAWSErr(err, s3control.ErrCodeNoSuchPublicAccessBlockConfiguration, "") { diff --git a/aws/resource_aws_s3_bucket.go b/aws/resource_aws_s3_bucket.go index 54af265517f..d131c1bf40b 100644 --- a/aws/resource_aws_s3_bucket.go +++ b/aws/resource_aws_s3_bucket.go @@ -685,7 +685,7 @@ func resourceAwsS3BucketCreate(d *schema.ResourceData, meta interface{}) error { req.ObjectLockEnabledForBucket = aws.Bool(true) } - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { log.Printf("[DEBUG] Trying to create new S3 bucket: %q", bucket) _, err := s3conn.CreateBucket(req) if awsErr, ok := err.(awserr.Error); ok { @@ -818,7 +818,7 @@ func resourceAwsS3BucketRead(d *schema.ResourceData, meta interface{}) error { Bucket: aws.String(d.Id()), } - err := resource.Retry(s3BucketCreationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(s3BucketCreationTimeout, func() *resource.RetryError { _, err := s3conn.HeadBucket(input) if d.IsNewResource() && isAWSErrRequestFailureStatusCode(err, 404) { @@ -1425,7 +1425,7 @@ func resourceAwsS3BucketPolicyUpdate(s3conn *s3.S3, d *schema.ResourceData) erro Policy: aws.String(policy), } - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := s3conn.PutBucketPolicy(params) if isAWSErr(err, "MalformedPolicy", "") || isAWSErr(err, s3.ErrCodeNoSuchBucket, "") { return resource.RetryableError(err) @@ -2139,7 +2139,7 @@ func resourceAwsS3BucketReplicationConfigurationUpdate(s3conn *s3.S3, d *schema. } log.Printf("[DEBUG] S3 put bucket replication configuration: %#v", i) - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := s3conn.PutBucketReplication(i) if isAWSErr(err, s3.ErrCodeNoSuchBucket, "") || isAWSErr(err, "InvalidRequest", "Versioning must be 'Enabled' on the bucket") { return resource.RetryableError(err) diff --git a/aws/resource_aws_s3_bucket_analytics_configuration.go b/aws/resource_aws_s3_bucket_analytics_configuration.go index 3004ff6daf9..f05a18e7075 100644 --- a/aws/resource_aws_s3_bucket_analytics_configuration.go +++ b/aws/resource_aws_s3_bucket_analytics_configuration.go @@ -146,7 +146,7 @@ func resourceAwsS3BucketAnalyticsConfigurationPut(d *schema.ResourceData, meta i AnalyticsConfiguration: analyticsConfiguration, } - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := s3conn.PutBucketAnalyticsConfiguration(input) if tfawserr.ErrCodeEquals(err, s3.ErrCodeNoSuchBucket) { @@ -435,7 +435,7 @@ func waitForDeleteS3BucketAnalyticsConfiguration(conn *s3.S3, bucket, name strin Id: aws.String(name), } - err := resource.Retry(timeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(timeout, func() *resource.RetryError { output, err := conn.GetBucketAnalyticsConfiguration(input) if err != nil { diff --git a/aws/resource_aws_s3_bucket_inventory.go b/aws/resource_aws_s3_bucket_inventory.go index e3a77a304d5..0c4440100bf 100644 --- a/aws/resource_aws_s3_bucket_inventory.go +++ b/aws/resource_aws_s3_bucket_inventory.go @@ -235,7 +235,7 @@ func resourceAwsS3BucketInventoryPut(d *schema.ResourceData, meta interface{}) e } log.Printf("[DEBUG] Putting S3 bucket inventory configuration: %s", input) - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.PutBucketInventoryConfiguration(input) if tfawserr.ErrCodeEquals(err, s3.ErrCodeNoSuchBucket) { @@ -311,7 +311,7 @@ func resourceAwsS3BucketInventoryRead(d *schema.ResourceData, meta interface{}) log.Printf("[DEBUG] Reading S3 bucket inventory configuration: %s", input) var output *s3.GetBucketInventoryConfigurationOutput - err = resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.GetBucketInventoryConfiguration(input) diff --git a/aws/resource_aws_s3_bucket_inventory_test.go b/aws/resource_aws_s3_bucket_inventory_test.go index 24812e2f0bb..554cfbd9e0c 100644 --- a/aws/resource_aws_s3_bucket_inventory_test.go +++ b/aws/resource_aws_s3_bucket_inventory_test.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func TestAccAWSS3BucketInventory_basic(t *testing.T) { @@ -167,7 +168,7 @@ func testAccCheckAWSS3BucketInventoryDestroy(s *terraform.State) error { return err } - err = resource.Retry(1*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { input := &s3.GetBucketInventoryConfigurationInput{ Bucket: aws.String(bucket), Id: aws.String(name), diff --git a/aws/resource_aws_s3_bucket_metric.go b/aws/resource_aws_s3_bucket_metric.go index adce6a9fb9c..9dd3d396a0c 100644 --- a/aws/resource_aws_s3_bucket_metric.go +++ b/aws/resource_aws_s3_bucket_metric.go @@ -84,7 +84,7 @@ func resourceAwsS3BucketMetricPut(d *schema.ResourceData, meta interface{}) erro } log.Printf("[DEBUG] Putting S3 Bucket Metrics Configuration: %s", input) - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.PutBucketMetricsConfiguration(input) if tfawserr.ErrCodeEquals(err, s3.ErrCodeNoSuchBucket) { diff --git a/aws/resource_aws_s3_bucket_metric_test.go b/aws/resource_aws_s3_bucket_metric_test.go index e32fad9f814..aef80078938 100644 --- a/aws/resource_aws_s3_bucket_metric_test.go +++ b/aws/resource_aws_s3_bucket_metric_test.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func TestExpandS3MetricsFilter(t *testing.T) { @@ -568,7 +569,7 @@ func testAccCheckAWSS3BucketMetricDestroy(s *terraform.State) error { return err } - err = resource.Retry(1*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { input := &s3.GetBucketMetricsConfigurationInput{ Bucket: aws.String(bucket), Id: aws.String(name), diff --git a/aws/resource_aws_s3_bucket_notification.go b/aws/resource_aws_s3_bucket_notification.go index 57559a7ee20..3cfe0eb8cda 100644 --- a/aws/resource_aws_s3_bucket_notification.go +++ b/aws/resource_aws_s3_bucket_notification.go @@ -309,7 +309,7 @@ func resourceAwsS3BucketNotificationPut(d *schema.ResourceData, meta interface{} } log.Printf("[DEBUG] S3 bucket: %s, Putting notification: %v", bucket, i) - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { _, err := s3conn.PutBucketNotificationConfiguration(i) if tfawserr.ErrCodeEquals(err, s3.ErrCodeNoSuchBucket) { diff --git a/aws/resource_aws_s3_bucket_notification_test.go b/aws/resource_aws_s3_bucket_notification_test.go index c920412e4f1..6285f26606e 100644 --- a/aws/resource_aws_s3_bucket_notification_test.go +++ b/aws/resource_aws_s3_bucket_notification_test.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func TestAccAWSS3BucketNotification_LambdaFunction(t *testing.T) { @@ -272,7 +273,7 @@ func testAccCheckAWSS3BucketNotificationDestroy(s *terraform.State) error { if rs.Type != "aws_s3_bucket_notification" { continue } - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { out, err := conn.GetBucketNotificationConfiguration(&s3.GetBucketNotificationConfigurationRequest{ Bucket: aws.String(rs.Primary.ID), }) @@ -308,7 +309,7 @@ func testAccCheckAWSS3BucketTopicNotification(n, i, t string, events []string, f topicArn := s.RootModule().Resources[t].Primary.ID conn := testAccProvider.Meta().(*AWSClient).s3conn - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { out, err := conn.GetBucketNotificationConfiguration(&s3.GetBucketNotificationConfigurationRequest{ Bucket: aws.String(rs.Primary.ID), }) @@ -365,7 +366,7 @@ func testAccCheckAWSS3BucketQueueNotification(n, i, t string, events []string, f queueArn := s.RootModule().Resources[t].Primary.Attributes["arn"] conn := testAccProvider.Meta().(*AWSClient).s3conn - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { out, err := conn.GetBucketNotificationConfiguration(&s3.GetBucketNotificationConfigurationRequest{ Bucket: aws.String(rs.Primary.ID), }) @@ -422,7 +423,7 @@ func testAccCheckAWSS3BucketLambdaFunctionConfiguration(n, i, t string, events [ funcArn := s.RootModule().Resources[t].Primary.Attributes["arn"] conn := testAccProvider.Meta().(*AWSClient).s3conn - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { out, err := conn.GetBucketNotificationConfiguration(&s3.GetBucketNotificationConfigurationRequest{ Bucket: aws.String(rs.Primary.ID), }) diff --git a/aws/resource_aws_s3_bucket_object.go b/aws/resource_aws_s3_bucket_object.go index cc95b3a5060..5c2af25312a 100644 --- a/aws/resource_aws_s3_bucket_object.go +++ b/aws/resource_aws_s3_bucket_object.go @@ -338,7 +338,7 @@ func resourceAwsS3BucketObjectRead(d *schema.ResourceData, meta interface{}) err var resp *s3.HeadObjectOutput - err := resource.Retry(s3BucketObjectCreationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(s3BucketObjectCreationTimeout, func() *resource.RetryError { var err error resp, err = s3conn.HeadObject(input) diff --git a/aws/resource_aws_s3_bucket_object_test.go b/aws/resource_aws_s3_bucket_object_test.go index e7d2c0d6dae..11b333675ae 100644 --- a/aws/resource_aws_s3_bucket_object_test.go +++ b/aws/resource_aws_s3_bucket_object_test.go @@ -21,6 +21,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func init() { @@ -1357,7 +1358,7 @@ func testAccCheckAWSS3BucketObjectExists(n string, obj *s3.GetObjectOutput) reso var out *s3.GetObjectOutput - err := resource.Retry(2*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(2*time.Minute, func() *resource.RetryError { var err error out, err = s3conn.GetObject(input) if awsErr, ok := err.(awserr.Error); ok { diff --git a/aws/resource_aws_s3_bucket_policy.go b/aws/resource_aws_s3_bucket_policy.go index 1c272f3d679..5e2b03e0e0b 100644 --- a/aws/resource_aws_s3_bucket_policy.go +++ b/aws/resource_aws_s3_bucket_policy.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsS3BucketPolicy() *schema.Resource { @@ -53,7 +54,7 @@ func resourceAwsS3BucketPolicyPut(d *schema.ResourceData, meta interface{}) erro Policy: aws.String(policy), } - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := s3conn.PutBucketPolicy(params) if isAWSErr(err, "MalformedPolicy", "") { return resource.RetryableError(err) diff --git a/aws/resource_aws_s3_bucket_public_access_block.go b/aws/resource_aws_s3_bucket_public_access_block.go index 57c6d5bc46a..2ff3e70ec0a 100644 --- a/aws/resource_aws_s3_bucket_public_access_block.go +++ b/aws/resource_aws_s3_bucket_public_access_block.go @@ -74,7 +74,7 @@ func resourceAwsS3BucketPublicAccessBlockCreate(d *schema.ResourceData, meta int } log.Printf("[DEBUG] S3 bucket: %s, public access block: %v", bucket, input.PublicAccessBlockConfiguration) - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := s3conn.PutPublicAccessBlock(input) if isAWSErr(err, s3.ErrCodeNoSuchBucket, "") { @@ -107,7 +107,7 @@ func resourceAwsS3BucketPublicAccessBlockRead(d *schema.ResourceData, meta inter // Retry for eventual consistency on creation var output *s3.GetPublicAccessBlockOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = s3conn.GetPublicAccessBlock(input) diff --git a/aws/resource_aws_s3_bucket_public_access_block_test.go b/aws/resource_aws_s3_bucket_public_access_block_test.go index 0805084ce2a..5c91d62b176 100644 --- a/aws/resource_aws_s3_bucket_public_access_block_test.go +++ b/aws/resource_aws_s3_bucket_public_access_block_test.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" tfs3 "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/s3" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func TestAccAWSS3BucketPublicAccessBlock_basic(t *testing.T) { @@ -275,7 +276,7 @@ func testAccCheckAWSS3BucketPublicAccessBlockExists(n string, config *s3.PublicA } var output *s3.GetPublicAccessBlockOutput - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { var err error output, err = conn.GetPublicAccessBlock(input) @@ -329,7 +330,7 @@ func testAccCheckAWSS3BucketPublicAccessBlockDisappears(n string) resource.TestC Bucket: aws.String(rs.Primary.ID), } - return resource.Retry(1*time.Minute, func() *resource.RetryError { + return tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := conn.GetPublicAccessBlock(getInput) if tfawserr.ErrCodeEquals(err, tfs3.ErrCodeNoSuchPublicAccessBlockConfiguration) { diff --git a/aws/resource_aws_s3_bucket_test.go b/aws/resource_aws_s3_bucket_test.go index 3897510930c..807ada1f38f 100644 --- a/aws/resource_aws_s3_bucket_test.go +++ b/aws/resource_aws_s3_bucket_test.go @@ -27,6 +27,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/cloudformation/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func init() { @@ -105,7 +106,7 @@ func testSweepS3Buckets(region string) error { } log.Printf("[INFO] Deleting S3 Bucket: %s", name) - err = resource.Retry(1*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := conn.DeleteBucket(input) if isAWSErr(err, s3.ErrCodeNoSuchBucket, "") { @@ -2759,7 +2760,7 @@ func testAccCheckAWSS3BucketDestroyWithProvider(s *terraform.State, provider *sc } // Retry for S3 eventual consistency - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := conn.HeadBucket(input) if isAWSErr(err, s3.ErrCodeNoSuchBucket, "") || isAWSErr(err, "NotFound", "") { diff --git a/aws/resource_aws_s3control_bucket.go b/aws/resource_aws_s3control_bucket.go index 1caaefd52a7..2f93133b8b7 100644 --- a/aws/resource_aws_s3control_bucket.go +++ b/aws/resource_aws_s3control_bucket.go @@ -211,7 +211,7 @@ func resourceAwsS3ControlBucketDelete(d *schema.ResourceData, meta interface{}) // S3 Control Bucket have a backend state which cannot be checked so this error // can occur on deletion: // InvalidBucketState: Bucket is in an invalid state - err = resource.Retry(s3controlBucketStatePropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(s3controlBucketStatePropagationTimeout, func() *resource.RetryError { _, err := conn.DeleteBucket(input) if tfawserr.ErrCodeEquals(err, "InvalidBucketState") { diff --git a/aws/resource_aws_sagemaker_feature_group.go b/aws/resource_aws_sagemaker_feature_group.go index 48804a817bc..280953592c1 100644 --- a/aws/resource_aws_sagemaker_feature_group.go +++ b/aws/resource_aws_sagemaker_feature_group.go @@ -15,6 +15,7 @@ import ( iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/sagemaker/finder" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/sagemaker/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsSagemakerFeatureGroup() *schema.Resource { @@ -228,7 +229,7 @@ func resourceAwsSagemakerFeatureGroupCreate(d *schema.ResourceData, meta interfa } log.Printf("[DEBUG] Sagemaker Feature Group create config: %#v", *input) - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.CreateFeatureGroup(input) if err != nil { if isAWSErr(err, "ValidationException", "The execution role ARN is invalid.") { diff --git a/aws/resource_aws_sagemaker_model.go b/aws/resource_aws_sagemaker_model.go index 1bf6f5a891e..0a513aaf0a9 100644 --- a/aws/resource_aws_sagemaker_model.go +++ b/aws/resource_aws_sagemaker_model.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsSagemakerModel() *schema.Resource { @@ -361,7 +362,7 @@ func resourceAwsSagemakerModelDelete(d *schema.ResourceData, meta interface{}) e } log.Printf("[INFO] Deleting Sagemaker model: %s", d.Id()) - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.DeleteModel(deleteOpts) if err == nil { return nil diff --git a/aws/resource_aws_sagemaker_notebook_instance.go b/aws/resource_aws_sagemaker_notebook_instance.go index 7e829d9a809..2042bce7a19 100644 --- a/aws/resource_aws_sagemaker_notebook_instance.go +++ b/aws/resource_aws_sagemaker_notebook_instance.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/sagemaker/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsSagemakerNotebookInstance() *schema.Resource { @@ -387,7 +388,7 @@ func resourceAwsSagemakerNotebookInstanceUpdate(d *schema.ResourceData, meta int } // StartNotebookInstance sometimes doesn't take so we'll check for a state change and if // it doesn't change we'll send another request - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.StartNotebookInstance(startOpts) if err != nil { return resource.NonRetryableError(fmt.Errorf("error starting sagemaker notebook instance (%s): %s", d.Id(), err)) diff --git a/aws/resource_aws_secretsmanager_secret.go b/aws/resource_aws_secretsmanager_secret.go index 8158086b9d4..b3a0a42268b 100644 --- a/aws/resource_aws_secretsmanager_secret.go +++ b/aws/resource_aws_secretsmanager_secret.go @@ -181,7 +181,7 @@ func resourceAwsSecretsManagerSecretCreate(d *schema.ResourceData, meta interfac // Retry for secret recreation after deletion var output *secretsmanager.CreateSecretOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.CreateSecret(input) // Temporarily retry on these errors to support immediate secret recreation: @@ -210,7 +210,7 @@ func resourceAwsSecretsManagerSecretCreate(d *schema.ResourceData, meta interfac SecretId: aws.String(d.Id()), } - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error _, err = conn.PutResourcePolicy(input) if isAWSErr(err, secretsmanager.ErrCodeMalformedPolicyDocumentException, @@ -238,7 +238,7 @@ func resourceAwsSecretsManagerSecretCreate(d *schema.ResourceData, meta interfac } log.Printf("[DEBUG] Enabling Secrets Manager Secret rotation: %s", input) - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := conn.RotateSecret(input) if err != nil { // AccessDeniedException: Secrets Manager cannot invoke the specified Lambda function. @@ -271,7 +271,7 @@ func resourceAwsSecretsManagerSecretRead(d *schema.ResourceData, meta interface{ var output *secretsmanager.DescribeSecretOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.DescribeSecret(input) @@ -408,7 +408,7 @@ func resourceAwsSecretsManagerSecretUpdate(d *schema.ResourceData, meta interfac } log.Printf("[DEBUG] Setting Secrets Manager Secret resource policy; %#v", input) - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error _, err = conn.PutResourcePolicy(input) if isAWSErr(err, secretsmanager.ErrCodeMalformedPolicyDocumentException, @@ -448,7 +448,7 @@ func resourceAwsSecretsManagerSecretUpdate(d *schema.ResourceData, meta interfac } log.Printf("[DEBUG] Enabling Secrets Manager Secret rotation: %s", input) - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := conn.RotateSecret(input) if err != nil { // AccessDeniedException: Secrets Manager cannot invoke the specified Lambda function. diff --git a/aws/resource_aws_secretsmanager_secret_policy.go b/aws/resource_aws_secretsmanager_secret_policy.go index 07ab8b027e3..27867441d8f 100644 --- a/aws/resource_aws_secretsmanager_secret_policy.go +++ b/aws/resource_aws_secretsmanager_secret_policy.go @@ -62,7 +62,7 @@ func resourceAwsSecretsManagerSecretPolicyCreate(d *schema.ResourceData, meta in log.Printf("[DEBUG] Setting Secrets Manager Secret resource policy; %#v", input) var res *secretsmanager.PutResourcePolicyOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error res, err = conn.PutResourcePolicy(input) if isAWSErr(err, secretsmanager.ErrCodeMalformedPolicyDocumentException, @@ -95,7 +95,7 @@ func resourceAwsSecretsManagerSecretPolicyRead(d *schema.ResourceData, meta inte var res *secretsmanager.GetResourcePolicyOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error res, err = conn.GetResourcePolicy(input) @@ -158,7 +158,7 @@ func resourceAwsSecretsManagerSecretPolicyUpdate(d *schema.ResourceData, meta in } log.Printf("[DEBUG] Setting Secrets Manager Secret resource policy; %#v", input) - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error _, err = conn.PutResourcePolicy(input) if isAWSErr(err, secretsmanager.ErrCodeMalformedPolicyDocumentException, diff --git a/aws/resource_aws_secretsmanager_secret_policy_test.go b/aws/resource_aws_secretsmanager_secret_policy_test.go index 82dd06a31f0..8c5213a53f6 100644 --- a/aws/resource_aws_secretsmanager_secret_policy_test.go +++ b/aws/resource_aws_secretsmanager_secret_policy_test.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/secretsmanager/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func init() { @@ -179,7 +180,7 @@ func testAccCheckAwsSecretsManagerSecretPolicyDestroy(s *terraform.State) error var output *secretsmanager.DescribeSecretOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.DescribeSecret(secretInput) diff --git a/aws/resource_aws_secretsmanager_secret_rotation.go b/aws/resource_aws_secretsmanager_secret_rotation.go index d5ad3079dc3..a0e569e23b0 100644 --- a/aws/resource_aws_secretsmanager_secret_rotation.go +++ b/aws/resource_aws_secretsmanager_secret_rotation.go @@ -68,7 +68,7 @@ func resourceAwsSecretsManagerSecretRotationCreate(d *schema.ResourceData, meta } log.Printf("[DEBUG] Enabling Secrets Manager Secret rotation: %s", input) - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { output, err := conn.RotateSecret(input) if err != nil { // AccessDeniedException: Secrets Manager cannot invoke the specified Lambda function. @@ -104,7 +104,7 @@ func resourceAwsSecretsManagerSecretRotationRead(d *schema.ResourceData, meta in var output *secretsmanager.DescribeSecretOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.DescribeSecret(input) @@ -167,7 +167,7 @@ func resourceAwsSecretsManagerSecretRotationUpdate(d *schema.ResourceData, meta } log.Printf("[DEBUG] Enabling Secrets Manager Secret Rotation: %s", input) - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := conn.RotateSecret(input) if err != nil { // AccessDeniedException: Secrets Manager cannot invoke the specified Lambda function. diff --git a/aws/resource_aws_secretsmanager_secret_test.go b/aws/resource_aws_secretsmanager_secret_test.go index 9aee10460f6..1e430c9bcaa 100644 --- a/aws/resource_aws_secretsmanager_secret_test.go +++ b/aws/resource_aws_secretsmanager_secret_test.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/secretsmanager/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func init() { @@ -511,7 +512,7 @@ func testAccCheckAwsSecretsManagerSecretDestroy(s *terraform.State) error { var output *secretsmanager.DescribeSecretOutput - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.DescribeSecret(input) diff --git a/aws/resource_aws_secretsmanager_secret_version.go b/aws/resource_aws_secretsmanager_secret_version.go index 072e9e50eb8..6f795bb2ad9 100644 --- a/aws/resource_aws_secretsmanager_secret_version.go +++ b/aws/resource_aws_secretsmanager_secret_version.go @@ -120,7 +120,7 @@ func resourceAwsSecretsManagerSecretVersionRead(d *schema.ResourceData, meta int var output *secretsmanager.GetSecretValueOutput - err = resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.GetSecretValue(input) diff --git a/aws/resource_aws_security_group.go b/aws/resource_aws_security_group.go index 784f43dbf93..59703366844 100644 --- a/aws/resource_aws_security_group.go +++ b/aws/resource_aws_security_group.go @@ -23,6 +23,7 @@ import ( tfec2 "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/ec2" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/ec2/finder" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/ec2/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsSecurityGroup() *schema.Resource { @@ -452,7 +453,7 @@ func resourceAwsSecurityGroupDelete(d *schema.ResourceData, meta interface{}) er input := &ec2.DeleteSecurityGroupInput{ GroupId: aws.String(d.Id()), } - err := resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { _, err := conn.DeleteSecurityGroup(input) if err != nil { if tfawserr.ErrCodeEquals(err, "InvalidGroup.NotFound") { diff --git a/aws/resource_aws_security_group_rule.go b/aws/resource_aws_security_group_rule.go index e6844c405bc..830e1e145e0 100644 --- a/aws/resource_aws_security_group_rule.go +++ b/aws/resource_aws_security_group_rule.go @@ -227,7 +227,7 @@ information and instructions for recovery. Error: %w`, sg_id, autherr) id := ipPermissionIDHash(sg_id, ruleType, perm) log.Printf("[DEBUG] Computed group rule ID %s", id) - err = resource.Retry(5*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { sg, err := finder.SecurityGroupByID(conn, sg_id) if err != nil { diff --git a/aws/resource_aws_security_group_test.go b/aws/resource_aws_security_group_test.go index f3f97df2226..8d62242648d 100644 --- a/aws/resource_aws_security_group_test.go +++ b/aws/resource_aws_security_group_test.go @@ -97,7 +97,7 @@ func testSweepSecurityGroups(region string) error { } // Handle EC2 eventual consistency - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := conn.DeleteSecurityGroup(input) if isAWSErr(err, "DependencyViolation", "") { diff --git a/aws/resource_aws_securityhub_account.go b/aws/resource_aws_securityhub_account.go index 356eb361273..a2856a43d38 100644 --- a/aws/resource_aws_securityhub_account.go +++ b/aws/resource_aws_securityhub_account.go @@ -62,7 +62,7 @@ func resourceAwsSecurityHubAccountDelete(d *schema.ResourceData, meta interface{ conn := meta.(*AWSClient).securityhubconn log.Print("[DEBUG] Disabling Security Hub for account") - err := resource.Retry(waiter.AdminAccountNotFoundTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.AdminAccountNotFoundTimeout, func() *resource.RetryError { _, err := conn.DisableSecurityHub(&securityhub.DisableSecurityHubInput{}) if tfawserr.ErrMessageContains(err, securityhub.ErrCodeInvalidInputException, "Cannot disable Security Hub on the Security Hub administrator") { diff --git a/aws/resource_aws_servicecatalog_budget_resource_association.go b/aws/resource_aws_servicecatalog_budget_resource_association.go index 1d7a4925a9f..8281f64c49a 100644 --- a/aws/resource_aws_servicecatalog_budget_resource_association.go +++ b/aws/resource_aws_servicecatalog_budget_resource_association.go @@ -48,7 +48,7 @@ func resourceAwsServiceCatalogBudgetResourceAssociationCreate(d *schema.Resource } var output *servicecatalog.AssociateBudgetWithResourceOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.AssociateBudgetWithResource(input) diff --git a/aws/resource_aws_servicecatalog_constraint.go b/aws/resource_aws_servicecatalog_constraint.go index 8a9f3d46763..5328e9fa2c8 100644 --- a/aws/resource_aws_servicecatalog_constraint.go +++ b/aws/resource_aws_servicecatalog_constraint.go @@ -92,7 +92,7 @@ func resourceAwsServiceCatalogConstraintCreate(d *schema.ResourceData, meta inte } var output *servicecatalog.CreateConstraintOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.CreateConstraint(input) @@ -189,7 +189,7 @@ func resourceAwsServiceCatalogConstraintUpdate(d *schema.ResourceData, meta inte input.Parameters = aws.String(d.Get("parameters").(string)) } - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.UpdateConstraint(input) if tfawserr.ErrMessageContains(err, servicecatalog.ErrCodeInvalidParametersException, "profile does not exist") { diff --git a/aws/resource_aws_servicecatalog_portfolio_share.go b/aws/resource_aws_servicecatalog_portfolio_share.go index 97375e835aa..25ec12c9f35 100644 --- a/aws/resource_aws_servicecatalog_portfolio_share.go +++ b/aws/resource_aws_servicecatalog_portfolio_share.go @@ -115,7 +115,7 @@ func resourceAwsServiceCatalogPortfolioShareCreate(d *schema.ResourceData, meta } var output *servicecatalog.CreatePortfolioShareOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.CreatePortfolioShare(input) @@ -220,7 +220,7 @@ func resourceAwsServiceCatalogPortfolioShareUpdate(d *schema.ResourceData, meta input.ShareTagOptions = aws.Bool(v.(bool)) } - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.UpdatePortfolioShare(input) if tfawserr.ErrMessageContains(err, servicecatalog.ErrCodeInvalidParametersException, "profile does not exist") { diff --git a/aws/resource_aws_servicecatalog_principal_portfolio_association.go b/aws/resource_aws_servicecatalog_principal_portfolio_association.go index 3099cbef5ee..04be92bad13 100644 --- a/aws/resource_aws_servicecatalog_principal_portfolio_association.go +++ b/aws/resource_aws_servicecatalog_principal_portfolio_association.go @@ -71,7 +71,7 @@ func resourceAwsServiceCatalogPrincipalPortfolioAssociationCreate(d *schema.Reso } var output *servicecatalog.AssociatePrincipalWithPortfolioOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.AssociatePrincipalWithPortfolio(input) diff --git a/aws/resource_aws_servicecatalog_product.go b/aws/resource_aws_servicecatalog_product.go index e73856735e2..37ec381a087 100644 --- a/aws/resource_aws_servicecatalog_product.go +++ b/aws/resource_aws_servicecatalog_product.go @@ -185,7 +185,7 @@ func resourceAwsServiceCatalogProductCreate(d *schema.ResourceData, meta interfa } var output *servicecatalog.CreateProductOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.CreateProduct(input) @@ -323,7 +323,7 @@ func resourceAwsServiceCatalogProductUpdate(d *schema.ResourceData, meta interfa input.SupportUrl = aws.String(v.(string)) } - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.UpdateProduct(input) if tfawserr.ErrMessageContains(err, servicecatalog.ErrCodeInvalidParametersException, "profile does not exist") { diff --git a/aws/resource_aws_servicecatalog_product_portfolio_association.go b/aws/resource_aws_servicecatalog_product_portfolio_association.go index 20522207ac2..14ad122c343 100644 --- a/aws/resource_aws_servicecatalog_product_portfolio_association.go +++ b/aws/resource_aws_servicecatalog_product_portfolio_association.go @@ -69,7 +69,7 @@ func resourceAwsServiceCatalogProductPortfolioAssociationCreate(d *schema.Resour } var output *servicecatalog.AssociateProductWithPortfolioOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.AssociateProductWithPortfolio(input) diff --git a/aws/resource_aws_servicecatalog_provisioned_product.go b/aws/resource_aws_servicecatalog_provisioned_product.go index 122ec920fcb..463b423c0a2 100644 --- a/aws/resource_aws_servicecatalog_provisioned_product.go +++ b/aws/resource_aws_servicecatalog_provisioned_product.go @@ -288,7 +288,7 @@ func resourceAwsServiceCatalogProvisionedProductCreate(d *schema.ResourceData, m var output *servicecatalog.ProvisionProductOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.ProvisionProduct(input) @@ -467,7 +467,7 @@ func resourceAwsServiceCatalogProvisionedProductUpdate(d *schema.ResourceData, m } } - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.UpdateProvisionedProduct(input) if tfawserr.ErrMessageContains(err, servicecatalog.ErrCodeInvalidParametersException, "profile does not exist") { diff --git a/aws/resource_aws_servicecatalog_provisioning_artifact.go b/aws/resource_aws_servicecatalog_provisioning_artifact.go index cdd73138c82..8a8272862cf 100644 --- a/aws/resource_aws_servicecatalog_provisioning_artifact.go +++ b/aws/resource_aws_servicecatalog_provisioning_artifact.go @@ -119,7 +119,7 @@ func resourceAwsServiceCatalogProvisioningArtifactCreate(d *schema.ResourceData, } var output *servicecatalog.CreateProvisioningArtifactOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.CreateProvisioningArtifact(input) @@ -235,7 +235,7 @@ func resourceAwsServiceCatalogProvisioningArtifactUpdate(d *schema.ResourceData, input.Name = aws.String(v.(string)) } - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.UpdateProvisioningArtifact(input) if tfawserr.ErrMessageContains(err, servicecatalog.ErrCodeInvalidParametersException, "profile does not exist") { diff --git a/aws/resource_aws_servicecatalog_service_action.go b/aws/resource_aws_servicecatalog_service_action.go index 319119e0a6b..69d6d69b1cf 100644 --- a/aws/resource_aws_servicecatalog_service_action.go +++ b/aws/resource_aws_servicecatalog_service_action.go @@ -99,7 +99,7 @@ func resourceAwsServiceCatalogServiceActionCreate(d *schema.ResourceData, meta i } var output *servicecatalog.CreateServiceActionOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.CreateServiceAction(input) @@ -188,7 +188,7 @@ func resourceAwsServiceCatalogServiceActionUpdate(d *schema.ResourceData, meta i input.Name = aws.String(d.Get("name").(string)) } - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.UpdateServiceAction(input) if tfawserr.ErrMessageContains(err, servicecatalog.ErrCodeInvalidParametersException, "profile does not exist") { @@ -220,7 +220,7 @@ func resourceAwsServiceCatalogServiceActionDelete(d *schema.ResourceData, meta i Id: aws.String(d.Id()), } - err := resource.Retry(waiter.ServiceActionDeleteTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.ServiceActionDeleteTimeout, func() *resource.RetryError { _, err := conn.DeleteServiceAction(input) if tfawserr.ErrCodeEquals(err, servicecatalog.ErrCodeResourceInUseException) { diff --git a/aws/resource_aws_servicecatalog_tag_option.go b/aws/resource_aws_servicecatalog_tag_option.go index 66e86d7cd5c..d3f0867a9e6 100644 --- a/aws/resource_aws_servicecatalog_tag_option.go +++ b/aws/resource_aws_servicecatalog_tag_option.go @@ -56,7 +56,7 @@ func resourceAwsServiceCatalogTagOptionCreate(d *schema.ResourceData, meta inter } var output *servicecatalog.CreateTagOptionOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.CreateTagOption(input) @@ -148,7 +148,7 @@ func resourceAwsServiceCatalogTagOptionUpdate(d *schema.ResourceData, meta inter input.Value = aws.String(d.Get("value").(string)) } - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn.UpdateTagOption(input) if tfawserr.ErrMessageContains(err, servicecatalog.ErrCodeInvalidParametersException, "profile does not exist") { diff --git a/aws/resource_aws_servicecatalog_tag_option_resource_association.go b/aws/resource_aws_servicecatalog_tag_option_resource_association.go index 1b1678d3721..867a7d7591d 100644 --- a/aws/resource_aws_servicecatalog_tag_option_resource_association.go +++ b/aws/resource_aws_servicecatalog_tag_option_resource_association.go @@ -65,7 +65,7 @@ func resourceAwsServiceCatalogTagOptionResourceAssociationCreate(d *schema.Resou } var output *servicecatalog.AssociateTagOptionWithResourceOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error output, err = conn.AssociateTagOptionWithResource(input) diff --git a/aws/resource_aws_ses_domain_identity_verification.go b/aws/resource_aws_ses_domain_identity_verification.go index a8f9704c773..67f0f594f47 100644 --- a/aws/resource_aws_ses_domain_identity_verification.go +++ b/aws/resource_aws_ses_domain_identity_verification.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsSesDomainIdentityVerification() *schema.Resource { @@ -56,7 +57,7 @@ func getAwsSesIdentityVerificationAttributes(conn *ses.SES, domainName string) ( func resourceAwsSesDomainIdentityVerificationCreate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).sesconn domainName := d.Get("domain").(string) - err := resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { att, err := getAwsSesIdentityVerificationAttributes(conn, domainName) if err != nil { return resource.NonRetryableError(fmt.Errorf("Error getting identity verification attributes: %s", err)) diff --git a/aws/resource_aws_ses_template_test.go b/aws/resource_aws_ses_template_test.go index 7796b9e82b7..2c2421da4ae 100644 --- a/aws/resource_aws_ses_template_test.go +++ b/aws/resource_aws_ses_template_test.go @@ -10,6 +10,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func TestAccAWSSesTemplate_basic(t *testing.T) { @@ -155,7 +156,7 @@ func testAccCheckSesTemplateDestroy(s *terraform.State) error { if rs.Type != "aws_ses_template" { continue } - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { input := ses.GetTemplateInput{ TemplateName: aws.String(rs.Primary.ID), } diff --git a/aws/resource_aws_sfn_activity_test.go b/aws/resource_aws_sfn_activity_test.go index 302baf1cb46..23c358623e5 100644 --- a/aws/resource_aws_sfn_activity_test.go +++ b/aws/resource_aws_sfn_activity_test.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func TestAccAWSSfnActivity_basic(t *testing.T) { @@ -114,7 +115,7 @@ func testAccCheckAWSSfnActivityDestroy(s *terraform.State) error { } // Retrying as Read after Delete is not always consistent - retryErr := resource.Retry(1*time.Minute, func() *resource.RetryError { + retryErr := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { var err error _, err = conn.DescribeActivity(&sfn.DescribeActivityInput{ diff --git a/aws/resource_aws_sfn_state_machine.go b/aws/resource_aws_sfn_state_machine.go index 2e1e90e5e3b..fd4bffc7173 100644 --- a/aws/resource_aws_sfn_state_machine.go +++ b/aws/resource_aws_sfn_state_machine.go @@ -144,7 +144,7 @@ func resourceAwsSfnStateMachineCreate(d *schema.ResourceData, meta interface{}) var output *sfn.CreateStateMachineOutput log.Printf("[DEBUG] Creating Step Function State Machine: %s", input) - err := resource.Retry(waiter.StateMachineCreatedTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.StateMachineCreatedTimeout, func() *resource.RetryError { var err error output, err = conn.CreateStateMachine(input) @@ -281,7 +281,7 @@ func resourceAwsSfnStateMachineUpdate(d *schema.ResourceData, meta interface{}) } // Handle eventual consistency after update. - err = resource.Retry(waiter.StateMachineUpdatedTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(waiter.StateMachineUpdatedTimeout, func() *resource.RetryError { output, err := finder.StateMachineByARN(conn, d.Id()) if err != nil { diff --git a/aws/resource_aws_signer_signing_profile_permission.go b/aws/resource_aws_signer_signing_profile_permission.go index f3d40c8bf80..9155dcc0574 100644 --- a/aws/resource_aws_signer_signing_profile_permission.go +++ b/aws/resource_aws_signer_signing_profile_permission.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/naming" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsSignerSigningProfilePermission() *schema.Resource { @@ -115,7 +116,7 @@ func resourceAwsSignerSigningProfilePermissionCreate(d *schema.ResourceData, met log.Printf("[DEBUG] Adding new Signer signing profile permission: %s", addProfilePermissionInput) //var addProfilePermissionOutput *signer.AddProfilePermissionOutput // Retry for IAM eventual consistency - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error _, err = conn.AddProfilePermission(addProfilePermissionInput) @@ -136,7 +137,7 @@ func resourceAwsSignerSigningProfilePermissionCreate(d *schema.ResourceData, met return fmt.Errorf("error adding new Signer signing profile permission for %q: %s", profileName, err) } - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { // IAM is eventually consistent :/ err := resourceAwsSignerSigningProfilePermissionRead(d, meta) if err != nil { @@ -173,7 +174,7 @@ func resourceAwsSignerSigningProfilePermissionRead(d *schema.ResourceData, meta log.Printf("[DEBUG] Getting Signer signing profile permissions: %s", listProfilePermissionsInput) var listProfilePermissionsOutput *signer.ListProfilePermissionsOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { // IAM is eventually consistent :/ var err error listProfilePermissionsOutput, err = conn.ListProfilePermissions(listProfilePermissionsInput) diff --git a/aws/resource_aws_sns_platform_application.go b/aws/resource_aws_sns_platform_application.go index a017c3df893..040e73dfe62 100644 --- a/aws/resource_aws_sns_platform_application.go +++ b/aws/resource_aws_sns_platform_application.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) var snsPlatformRequiresPlatformPrincipal = map[string]bool{ @@ -180,7 +181,7 @@ func resourceAwsSnsPlatformApplicationUpdate(d *schema.ResourceData, meta interf Attributes: attributes, } - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := snsconn.SetPlatformApplicationAttributes(req) if err != nil { if isAWSErr(err, sns.ErrCodeInvalidParameterException, "is not a valid role to allow SNS to write to Cloudwatch Logs") { diff --git a/aws/resource_aws_sns_topic_subscription.go b/aws/resource_aws_sns_topic_subscription.go index 6be9990e225..148aabe7708 100644 --- a/aws/resource_aws_sns_topic_subscription.go +++ b/aws/resource_aws_sns_topic_subscription.go @@ -173,7 +173,7 @@ func resourceAwsSnsTopicSubscriptionRead(d *schema.ResourceData, meta interface{ var output *sns.GetSubscriptionAttributesOutput - err := resource.Retry(waiter.SubscriptionCreateTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.SubscriptionCreateTimeout, func() *resource.RetryError { var err error output, err = finder.SubscriptionByARN(conn, d.Id()) diff --git a/aws/resource_aws_spot_datafeed_subscription_test.go b/aws/resource_aws_spot_datafeed_subscription_test.go index 7d053671320..8f58f407043 100644 --- a/aws/resource_aws_spot_datafeed_subscription_test.go +++ b/aws/resource_aws_spot_datafeed_subscription_test.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func TestAccAWSSpotDatafeedSubscription_serial(t *testing.T) { @@ -61,7 +62,7 @@ func testAccCheckAWSSpotDatafeedSubscriptionDisappears(subscription *ec2.SpotDat return err } - return resource.Retry(40*time.Minute, func() *resource.RetryError { + return tfresource.RetryOnConnectionResetByPeer(40*time.Minute, func() *resource.RetryError { _, err := conn.DescribeSpotDatafeedSubscription(&ec2.DescribeSpotDatafeedSubscriptionInput{}) if err != nil { cgw, ok := err.(awserr.Error) diff --git a/aws/resource_aws_spot_fleet_request.go b/aws/resource_aws_spot_fleet_request.go index 2cd909d1ada..904e189ee69 100644 --- a/aws/resource_aws_spot_fleet_request.go +++ b/aws/resource_aws_spot_fleet_request.go @@ -15,6 +15,7 @@ import ( "github.com/terraform-providers/terraform-provider-aws/aws/internal/hashcode" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsSpotFleetRequest() *schema.Resource { @@ -1053,7 +1054,7 @@ func resourceAwsSpotFleetRequestCreate(d *schema.ResourceData, meta interface{}) // Since IAM is eventually consistent, we retry creation as a newly created role may not // take effect immediately, resulting in an InvalidSpotFleetRequestConfig error var resp *ec2.RequestSpotFleetOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error resp, err = conn.RequestSpotFleet(spotFleetOpts) @@ -1688,7 +1689,7 @@ func deleteSpotFleetRequest(spotFleetRequestID string, terminateInstances bool, return len(resp.ActiveInstances), nil } - err = resource.Retry(timeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(timeout, func() *resource.RetryError { n, err := activeInstances(spotFleetRequestID) if err != nil { return resource.NonRetryableError(err) diff --git a/aws/resource_aws_spot_instance_request.go b/aws/resource_aws_spot_instance_request.go index 990b0605dfc..7b28dc19301 100644 --- a/aws/resource_aws_spot_instance_request.go +++ b/aws/resource_aws_spot_instance_request.go @@ -228,7 +228,7 @@ func resourceAwsSpotInstanceRequestCreate(d *schema.ResourceData, meta interface log.Printf("[DEBUG] Requesting spot bid opts: %s", spotOpts) var resp *ec2.RequestSpotInstancesOutput - err = resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { resp, err = conn.RequestSpotInstances(spotOpts) // IAM instance profiles can take ~10 seconds to propagate in AWS: // http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#launch-instance-with-role-console @@ -292,7 +292,7 @@ func resourceAwsSpotInstanceRequestRead(d *schema.ResourceData, meta interface{} var request *ec2.SpotInstanceRequest - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error request, err = finder.SpotInstanceRequestByID(conn, d.Id()) diff --git a/aws/resource_aws_sqs_queue.go b/aws/resource_aws_sqs_queue.go index 4ea09c112aa..94cb9baa3cb 100644 --- a/aws/resource_aws_sqs_queue.go +++ b/aws/resource_aws_sqs_queue.go @@ -219,7 +219,7 @@ func resourceAwsSqsQueueCreate(d *schema.ResourceData, meta interface{}) error { log.Printf("[DEBUG] Creating SQS Queue: %s", input) var output *sqs.CreateQueueOutput - err = resource.Retry(waiter.QueueCreatedTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(waiter.QueueCreatedTimeout, func() *resource.RetryError { var err error output, err = conn.CreateQueue(input) diff --git a/aws/resource_aws_ssm_activation.go b/aws/resource_aws_ssm_activation.go index 1abcc7863a4..d2fbbbea912 100644 --- a/aws/resource_aws_ssm_activation.go +++ b/aws/resource_aws_ssm_activation.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" iamwaiter "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/iam/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsSsmActivation() *schema.Resource { @@ -108,7 +109,7 @@ func resourceAwsSsmActivationCreate(d *schema.ResourceData, meta interface{}) er // Retry to allow iam_role to be created and policy attachment to take place var resp *ssm.CreateActivationOutput - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { var err error resp, err = ssmconn.CreateActivation(activationInput) diff --git a/aws/resource_aws_ssm_parameter.go b/aws/resource_aws_ssm_parameter.go index fda4d794a55..9e0d8dfb544 100644 --- a/aws/resource_aws_ssm_parameter.go +++ b/aws/resource_aws_ssm_parameter.go @@ -185,7 +185,7 @@ func resourceAwsSsmParameterRead(d *schema.ResourceData, meta interface{}) error } var resp *ssm.GetParameterOutput - err := resource.Retry(ssmParameterCreationValidationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(ssmParameterCreationValidationTimeout, func() *resource.RetryError { var err error resp, err = conn.GetParameter(input) diff --git a/aws/resource_aws_ssm_resource_data_sync.go b/aws/resource_aws_ssm_resource_data_sync.go index 6db40db4e6c..55ab7e47468 100644 --- a/aws/resource_aws_ssm_resource_data_sync.go +++ b/aws/resource_aws_ssm_resource_data_sync.go @@ -7,6 +7,7 @@ import ( "github.com/aws/aws-sdk-go/service/ssm" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsSsmResourceDataSync() *schema.Resource { @@ -72,7 +73,7 @@ func resourceAwsSsmResourceDataSyncCreate(d *schema.ResourceData, meta interface SyncName: aws.String(d.Get("name").(string)), } - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := conn.CreateResourceDataSync(input) if err != nil { if isAWSErr(err, ssm.ErrCodeResourceDataSyncInvalidConfigurationException, "S3 write failed for bucket") { diff --git a/aws/resource_aws_ssoadmin_permission_set.go b/aws/resource_aws_ssoadmin_permission_set.go index e96cc7cf479..2e68ea0efcd 100644 --- a/aws/resource_aws_ssoadmin_permission_set.go +++ b/aws/resource_aws_ssoadmin_permission_set.go @@ -281,7 +281,7 @@ func provisionSsoAdminPermissionSet(conn *ssoadmin.SSOAdmin, arn, instanceArn st } var output *ssoadmin.ProvisionPermissionSetOutput - err := resource.Retry(waiter.AWSSSOAdminPermissionSetProvisionTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.AWSSSOAdminPermissionSetProvisionTimeout, func() *resource.RetryError { var err error output, err = conn.ProvisionPermissionSet(input) diff --git a/aws/resource_aws_storagegateway_cached_iscsi_volume.go b/aws/resource_aws_storagegateway_cached_iscsi_volume.go index afd61d8938a..50a354afaac 100644 --- a/aws/resource_aws_storagegateway_cached_iscsi_volume.go +++ b/aws/resource_aws_storagegateway_cached_iscsi_volume.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsStorageGatewayCachedIscsiVolume() *schema.Resource { @@ -245,7 +246,7 @@ func resourceAwsStorageGatewayCachedIscsiVolumeDelete(d *schema.ResourceData, me } log.Printf("[DEBUG] Deleting Storage Gateway cached iSCSI volume: %s", input) - err := resource.Retry(2*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(2*time.Minute, func() *resource.RetryError { _, err := conn.DeleteVolume(input) if err != nil { if isAWSErr(err, storagegateway.ErrorCodeVolumeNotFound, "") { diff --git a/aws/resource_aws_storagegateway_gateway.go b/aws/resource_aws_storagegateway_gateway.go index 18c1498c253..d40698f2287 100644 --- a/aws/resource_aws_storagegateway_gateway.go +++ b/aws/resource_aws_storagegateway_gateway.go @@ -18,6 +18,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/storagegateway/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsStorageGatewayGateway() *schema.Resource { @@ -272,7 +273,7 @@ func resourceAwsStorageGatewayGatewayCreate(d *schema.ResourceData, meta interfa } var response *http.Response - err = resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { log.Printf("[DEBUG] Making HTTP request: %s", request.URL.String()) response, err = client.Do(request) diff --git a/aws/resource_aws_storagegateway_stored_iscsi_volume.go b/aws/resource_aws_storagegateway_stored_iscsi_volume.go index a2418377b95..08fabf50ac2 100644 --- a/aws/resource_aws_storagegateway_stored_iscsi_volume.go +++ b/aws/resource_aws_storagegateway_stored_iscsi_volume.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/storagegateway/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsStorageGatewayStoredIscsiVolume() *schema.Resource { @@ -256,7 +257,7 @@ func resourceAwsStorageGatewayStoredIscsiVolumeDelete(d *schema.ResourceData, me } log.Printf("[DEBUG] Deleting Storage Gateway Stored iSCSI volume: %s", input) - err := resource.Retry(2*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(2*time.Minute, func() *resource.RetryError { _, err := conn.DeleteVolume(input) if err != nil { if isAWSErr(err, storagegateway.ErrorCodeVolumeNotFound, "") { diff --git a/aws/resource_aws_subnet.go b/aws/resource_aws_subnet.go index c36de8b53b0..53f9664dcf8 100644 --- a/aws/resource_aws_subnet.go +++ b/aws/resource_aws_subnet.go @@ -237,7 +237,7 @@ func resourceAwsSubnetRead(d *schema.ResourceData, meta interface{}) error { var subnet *ec2.Subnet - err := resource.Retry(waiter.SubnetPropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.SubnetPropagationTimeout, func() *resource.RetryError { var err error subnet, err = finder.SubnetByID(conn, d.Id()) diff --git a/aws/resource_aws_synthetics_canary.go b/aws/resource_aws_synthetics_canary.go index 99518674bcf..b83954633db 100644 --- a/aws/resource_aws_synthetics_canary.go +++ b/aws/resource_aws_synthetics_canary.go @@ -274,7 +274,7 @@ func resourceAwsSyntheticsCanaryCreate(d *schema.ResourceData, meta interface{}) iamwaiterStopTime := time.Now().Add(iamwaiter.PropagationTimeout) // Ensure to add IAM eventual consistency timeout in case of retries - err = resource.Retry(iamwaiter.PropagationTimeout+waiter.CanaryCreatedTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout+waiter.CanaryCreatedTimeout, func() *resource.RetryError { // Only retry IAM eventual consistency errors up to that timeout iamwaiterRetry := time.Now().Before(iamwaiterStopTime) diff --git a/aws/resource_aws_transfer_server.go b/aws/resource_aws_transfer_server.go index d388f43f578..c243b40c8f6 100644 --- a/aws/resource_aws_transfer_server.go +++ b/aws/resource_aws_transfer_server.go @@ -736,7 +736,7 @@ func updateTransferServer(conn *transfer.Transfer, input *transfer.UpdateServerI // To prevent accessing the EC2 API directly to check the VPC Endpoint // state, which can require confusing IAM permissions and have other // eventual consistency consideration, we retry only via the Transfer API. - err := resource.Retry(Ec2VpcEndpointCreationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(Ec2VpcEndpointCreationTimeout, func() *resource.RetryError { _, err := conn.UpdateServer(input) if tfawserr.ErrMessageContains(err, transfer.ErrCodeConflictException, "VPC Endpoint state is not yet available") { diff --git a/aws/resource_aws_vpc.go b/aws/resource_aws_vpc.go index d27f34f4363..e16b7969a47 100644 --- a/aws/resource_aws_vpc.go +++ b/aws/resource_aws_vpc.go @@ -254,7 +254,7 @@ func resourceAwsVpcRead(d *schema.ResourceData, meta interface{}) error { var vpc *ec2.Vpc - err := resource.Retry(waiter.VpcPropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.VpcPropagationTimeout, func() *resource.RetryError { var err error vpc, err = finder.VpcByID(conn, d.Id()) @@ -587,7 +587,7 @@ func resourceAwsVpcDelete(d *schema.ResourceData, meta interface{}) error { } log.Printf("[INFO] Deleting VPC: %s", d.Id()) - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.DeleteVpc(deleteVpcOpts) if err == nil { return nil diff --git a/aws/resource_aws_vpc_dhcp_options.go b/aws/resource_aws_vpc_dhcp_options.go index cdbe3b36de2..f91eb4b0670 100644 --- a/aws/resource_aws_vpc_dhcp_options.go +++ b/aws/resource_aws_vpc_dhcp_options.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsVpcDhcpOptions() *schema.Resource { @@ -236,7 +237,7 @@ func resourceAwsVpcDhcpOptionsUpdate(d *schema.ResourceData, meta interface{}) e func resourceAwsVpcDhcpOptionsDelete(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).ec2conn - err := resource.Retry(3*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(3*time.Minute, func() *resource.RetryError { log.Printf("[INFO] Deleting DHCP Options ID %s...", d.Id()) _, err := conn.DeleteDhcpOptions(&ec2.DeleteDhcpOptionsInput{ DhcpOptionsId: aws.String(d.Id()), diff --git a/aws/resource_aws_vpc_dhcp_options_association.go b/aws/resource_aws_vpc_dhcp_options_association.go index 3a009f765d1..3a9f7224904 100644 --- a/aws/resource_aws_vpc_dhcp_options_association.go +++ b/aws/resource_aws_vpc_dhcp_options_association.go @@ -89,7 +89,7 @@ func resourceAwsVpcDhcpOptionsAssociationRead(d *schema.ResourceData, meta inter var vpc *ec2.Vpc - err := resource.Retry(waiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.PropagationTimeout, func() *resource.RetryError { var err error vpc, err = finder.VpcByID(conn, d.Get("vpc_id").(string)) diff --git a/aws/resource_aws_vpc_peering_connection_options.go b/aws/resource_aws_vpc_peering_connection_options.go index 9558048e324..9915c5b7fc5 100644 --- a/aws/resource_aws_vpc_peering_connection_options.go +++ b/aws/resource_aws_vpc_peering_connection_options.go @@ -9,6 +9,7 @@ import ( "github.com/aws/aws-sdk-go/service/ec2" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsVpcPeeringConnectionOptions() *schema.Resource { @@ -101,7 +102,7 @@ func resourceAwsVpcPeeringConnectionOptionsUpdate(d *schema.ResourceData, meta i // Retry reading back the modified options to deal with eventual consistency. // Often this is to do with a delay transitioning from pending-acceptance to active. - err = resource.Retry(3*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(3*time.Minute, func() *resource.RetryError { pc, err = vpcPeeringConnection(conn, d.Id()) if err != nil { diff --git a/aws/resource_aws_vpn_gateway.go b/aws/resource_aws_vpn_gateway.go index 50e5478c485..bd1419fbf17 100644 --- a/aws/resource_aws_vpn_gateway.go +++ b/aws/resource_aws_vpn_gateway.go @@ -14,6 +14,7 @@ import ( "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" tfec2 "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/ec2" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/ec2/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsVpnGateway() *schema.Resource { @@ -198,7 +199,7 @@ func resourceAwsVpnGatewayDelete(d *schema.ResourceData, meta interface{}) error input := &ec2.DeleteVpnGatewayInput{ VpnGatewayId: aws.String(d.Id()), } - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.DeleteVpnGateway(input) if err == nil { return nil @@ -246,7 +247,7 @@ func resourceAwsVpnGatewayAttach(d *schema.ResourceData, meta interface{}) error VpcId: aws.String(vpcId), } - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { _, err := conn.AttachVpnGateway(req) if err != nil { if isAWSErr(err, tfec2.InvalidVpnGatewayIDNotFound, "") { diff --git a/aws/resource_aws_waf_rule.go b/aws/resource_aws_waf_rule.go index ab180eca1d6..583455520a7 100644 --- a/aws/resource_aws_waf_rule.go +++ b/aws/resource_aws_waf_rule.go @@ -226,7 +226,7 @@ func resourceAwsWafRuleDelete(d *schema.ResourceData, meta interface{}) error { } wr := newWafRetryer(conn) - err := resource.Retry(WafRuleDeleteTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(WafRuleDeleteTimeout, func() *resource.RetryError { var err error _, err = wr.RetryWithToken(func(token *string) (interface{}, error) { req := &waf.DeleteRuleInput{ diff --git a/aws/resource_aws_wafregional_web_acl_association.go b/aws/resource_aws_wafregional_web_acl_association.go index 7eb56bd3bc2..f0677ea3b56 100644 --- a/aws/resource_aws_wafregional_web_acl_association.go +++ b/aws/resource_aws_wafregional_web_acl_association.go @@ -10,6 +10,7 @@ import ( "github.com/aws/aws-sdk-go/service/wafregional" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsWafRegionalWebAclAssociation() *schema.Resource { @@ -52,7 +53,7 @@ func resourceAwsWafRegionalWebAclAssociationCreate(d *schema.ResourceData, meta // create association and wait on retryable error // no response body var err error - err = resource.Retry(2*time.Minute, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(2*time.Minute, func() *resource.RetryError { _, err = conn.AssociateWebACL(params) if err != nil { if isAWSErr(err, wafregional.ErrCodeWAFUnavailableEntityException, "") { diff --git a/aws/resource_aws_wafv2_ip_set.go b/aws/resource_aws_wafv2_ip_set.go index adc2ee53e42..575e0e65261 100644 --- a/aws/resource_aws_wafv2_ip_set.go +++ b/aws/resource_aws_wafv2_ip_set.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" tfnet "github.com/terraform-providers/terraform-provider-aws/aws/internal/net" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsWafv2IPSet() *schema.Resource { @@ -252,7 +253,7 @@ func resourceAwsWafv2IPSetDelete(d *schema.ResourceData, meta interface{}) error LockToken: aws.String(d.Get("lock_token").(string)), } - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { var err error _, err = conn.DeleteIPSet(params) if err != nil { diff --git a/aws/resource_aws_wafv2_regex_pattern_set.go b/aws/resource_aws_wafv2_regex_pattern_set.go index 7c11d3cd78e..b036b9e45eb 100644 --- a/aws/resource_aws_wafv2_regex_pattern_set.go +++ b/aws/resource_aws_wafv2_regex_pattern_set.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsWafv2RegexPatternSet() *schema.Resource { @@ -223,7 +224,7 @@ func resourceAwsWafv2RegexPatternSetDelete(d *schema.ResourceData, meta interfac Scope: aws.String(d.Get("scope").(string)), LockToken: aws.String(d.Get("lock_token").(string)), } - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.DeleteRegexPatternSet(params) if err != nil { if isAWSErr(err, wafv2.ErrCodeWAFAssociatedItemException, "") { diff --git a/aws/resource_aws_wafv2_rule_group.go b/aws/resource_aws_wafv2_rule_group.go index 3543e7dbb8c..48241e16f41 100644 --- a/aws/resource_aws_wafv2_rule_group.go +++ b/aws/resource_aws_wafv2_rule_group.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsWafv2RuleGroup() *schema.Resource { @@ -137,7 +138,7 @@ func resourceAwsWafv2RuleGroupCreate(d *schema.ResourceData, meta interface{}) e params.Tags = tags.IgnoreAws().Wafv2Tags() } - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { var err error resp, err = conn.CreateRuleGroup(params) if err != nil { @@ -243,7 +244,7 @@ func resourceAwsWafv2RuleGroupUpdate(d *schema.ResourceData, meta interface{}) e u.Description = aws.String(v.(string)) } - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.UpdateRuleGroup(u) if err != nil { if isAWSErr(err, wafv2.ErrCodeWAFUnavailableEntityException, "") { @@ -284,7 +285,7 @@ func resourceAwsWafv2RuleGroupDelete(d *schema.ResourceData, meta interface{}) e LockToken: aws.String(d.Get("lock_token").(string)), } - err := resource.Retry(5*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(5*time.Minute, func() *resource.RetryError { _, err := conn.DeleteRuleGroup(r) if err != nil { if isAWSErr(err, wafv2.ErrCodeWAFAssociatedItemException, "") { diff --git a/aws/resource_aws_wafv2_web_acl.go b/aws/resource_aws_wafv2_web_acl.go index bb9e69c896b..3a8ca0ef1f1 100644 --- a/aws/resource_aws_wafv2_web_acl.go +++ b/aws/resource_aws_wafv2_web_acl.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) const ( @@ -164,7 +165,7 @@ func resourceAwsWafv2WebACLCreate(d *schema.ResourceData, meta interface{}) erro params.Tags = tags.IgnoreAws().Wafv2Tags() } - err := resource.Retry(Wafv2WebACLCreateTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(Wafv2WebACLCreateTimeout, func() *resource.RetryError { var err error resp, err = conn.CreateWebACL(params) if err != nil { @@ -274,7 +275,7 @@ func resourceAwsWafv2WebACLUpdate(d *schema.ResourceData, meta interface{}) erro u.Description = aws.String(v.(string)) } - err := resource.Retry(Wafv2WebACLUpdateTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(Wafv2WebACLUpdateTimeout, func() *resource.RetryError { _, err := conn.UpdateWebACL(u) if err != nil { if isAWSErr(err, wafv2.ErrCodeWAFUnavailableEntityException, "") { @@ -319,7 +320,7 @@ func resourceAwsWafv2WebACLDelete(d *schema.ResourceData, meta interface{}) erro LockToken: aws.String(d.Get("lock_token").(string)), } - err := resource.Retry(Wafv2WebACLDeleteTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(Wafv2WebACLDeleteTimeout, func() *resource.RetryError { _, err := conn.DeleteWebACL(r) if err != nil { if tfawserr.ErrCodeEquals(err, wafv2.ErrCodeWAFAssociatedItemException) { diff --git a/aws/resource_aws_wafv2_web_acl_association.go b/aws/resource_aws_wafv2_web_acl_association.go index 0f1c6da20a7..0467b6a8777 100644 --- a/aws/resource_aws_wafv2_web_acl_association.go +++ b/aws/resource_aws_wafv2_web_acl_association.go @@ -10,6 +10,7 @@ import ( "github.com/aws/aws-sdk-go/service/wafv2" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) const ( @@ -59,7 +60,7 @@ func resourceAwsWafv2WebACLAssociationCreate(d *schema.ResourceData, meta interf WebACLArn: aws.String(webAclArn), } - err := resource.Retry(Wafv2WebACLAssociationCreateTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(Wafv2WebACLAssociationCreateTimeout, func() *resource.RetryError { var err error _, err = conn.AssociateWebACL(params) if err != nil { diff --git a/aws/waf_token_handlers.go b/aws/waf_token_handlers.go index 96f731d92de..b808caeb01f 100644 --- a/aws/waf_token_handlers.go +++ b/aws/waf_token_handlers.go @@ -7,6 +7,7 @@ import ( "github.com/aws/aws-sdk-go/service/waf" "github.com/hashicorp/aws-sdk-go-base/tfawserr" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) type WafRetryer struct { @@ -21,7 +22,7 @@ func (t *WafRetryer) RetryWithToken(f withTokenFunc) (interface{}, error) { var out interface{} var tokenOut *waf.GetChangeTokenOutput - err := resource.Retry(15*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(15*time.Minute, func() *resource.RetryError { var err error tokenOut, err = t.Connection.GetChangeToken(&waf.GetChangeTokenInput{}) if err != nil { diff --git a/aws/wafregional_token_handlers.go b/aws/wafregional_token_handlers.go index 9810358c9a6..1ec5ada919f 100644 --- a/aws/wafregional_token_handlers.go +++ b/aws/wafregional_token_handlers.go @@ -8,6 +8,7 @@ import ( "github.com/aws/aws-sdk-go/service/wafregional" "github.com/hashicorp/aws-sdk-go-base/tfawserr" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) type WafRegionalRetryer struct { @@ -23,7 +24,7 @@ func (t *WafRegionalRetryer) RetryWithToken(f withRegionalTokenFunc) (interface{ var out interface{} var tokenOut *waf.GetChangeTokenOutput - err := resource.Retry(15*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(15*time.Minute, func() *resource.RetryError { var err error tokenOut, err = t.Connection.GetChangeToken(&waf.GetChangeTokenInput{}) diff --git a/awsproviderlint/vendor/github.com/bflad/tfproviderlint/passes/R006/README.md b/awsproviderlint/vendor/github.com/bflad/tfproviderlint/passes/R006/README.md index af7441563a8..cc5c2684a1c 100644 --- a/awsproviderlint/vendor/github.com/bflad/tfproviderlint/passes/R006/README.md +++ b/awsproviderlint/vendor/github.com/bflad/tfproviderlint/passes/R006/README.md @@ -9,7 +9,7 @@ Optional parameters: ## Flagged Code ```go -err := resource.Retry(1 * time.Minute, func() *RetryError { +err := tfresource.RetryOnConnectionResetByPeer(1 * time.Minute, func() *RetryError { // Calling API logic, e.g. _, err := conn.DoSomething(input) @@ -32,7 +32,7 @@ if err != nil { // or -err := resource.Retry(1 * time.Minute, func() *RetryError { +err := tfresource.RetryOnConnectionResetByPeer(1 * time.Minute, func() *RetryError { // Calling API logic, e.g. _, err := conn.DoSomething(input) @@ -54,7 +54,7 @@ Singular reports can be ignored by adding the a `//lintignore:R006` Go code comm ```go //lintignore:R006 -err := resource.Retry(1 * time.Minute, func() *RetryError { +err := tfresource.RetryOnConnectionResetByPeer(1 * time.Minute, func() *RetryError { // Calling API logic, e.g. _, err := conn.DoSomething(input) diff --git a/awsproviderlint/vendor/github.com/bflad/tfproviderlint/passes/R018/R018.go b/awsproviderlint/vendor/github.com/bflad/tfproviderlint/passes/R018/R018.go index 09502b86f21..3cdebf551df 100644 --- a/awsproviderlint/vendor/github.com/bflad/tfproviderlint/passes/R018/R018.go +++ b/awsproviderlint/vendor/github.com/bflad/tfproviderlint/passes/R018/R018.go @@ -11,7 +11,7 @@ import ( const Doc = `check for time.Sleep() function usage -Terraform Providers should generally avoid this function when waiting for API operations and prefer polling methods such as resource.Retry() or (resource.StateChangeConf).WaitForState().` +Terraform Providers should generally avoid this function when waiting for API operations and prefer polling methods such as tfresource.RetryOnConnectionResetByPeer() or (resource.StateChangeConf).WaitForState().` const analyzerName = "R018" @@ -33,7 +33,7 @@ func run(pass *analysis.Pass) (interface{}, error) { continue } - pass.Reportf(callExpr.Pos(), "%s: prefer resource.Retry() or (resource.StateChangeConf).WaitForState() over time.Sleep()", analyzerName) + pass.Reportf(callExpr.Pos(), "%s: prefer tfresource.RetryOnConnectionResetByPeer() or (resource.StateChangeConf).WaitForState() over time.Sleep()", analyzerName) } return nil, nil diff --git a/awsproviderlint/vendor/github.com/bflad/tfproviderlint/passes/R018/README.md b/awsproviderlint/vendor/github.com/bflad/tfproviderlint/passes/R018/README.md index 633911da3ec..e76a149dc20 100644 --- a/awsproviderlint/vendor/github.com/bflad/tfproviderlint/passes/R018/README.md +++ b/awsproviderlint/vendor/github.com/bflad/tfproviderlint/passes/R018/README.md @@ -1,6 +1,6 @@ # R018 -The R018 analyzer reports [`time.Sleep()`](https://pkg.go.dev/time?tab=doc#Sleep) function usage. Terraform Providers should generally avoid this function when waiting for API operations and prefer polling methods such as [`resource.Retry()`](https://pkg.go.dev/github.com/hashicorp/terraform-plugin-sdk/helper/resource?tab=doc#Retry) or [`(resource.StateChangeConf).WaitForState()`](https://pkg.go.dev/github.com/hashicorp/terraform-plugin-sdk/helper/resource?tab=doc#StateChangeConf.WaitForState). +The R018 analyzer reports [`time.Sleep()`](https://pkg.go.dev/time?tab=doc#Sleep) function usage. Terraform Providers should generally avoid this function when waiting for API operations and prefer polling methods such as [`tfresource.RetryOnConnectionResetByPeer()`](https://pkg.go.dev/github.com/hashicorp/terraform-plugin-sdk/helper/resource?tab=doc#Retry) or [`(resource.StateChangeConf).WaitForState()`](https://pkg.go.dev/github.com/hashicorp/terraform-plugin-sdk/helper/resource?tab=doc#StateChangeConf.WaitForState). ## Flagged Code @@ -11,7 +11,7 @@ time.Sleep(10) ## Passing Code ```go -err := resource.Retry(/* ... */) +err := tfresource.RetryOnConnectionResetByPeer(/* ... */) ``` Or diff --git a/docs/contributing/pullrequest-submission-and-lifecycle.md b/docs/contributing/pullrequest-submission-and-lifecycle.md index a3cd2b85cc9..3cab513cd92 100644 --- a/docs/contributing/pullrequest-submission-and-lifecycle.md +++ b/docs/contributing/pullrequest-submission-and-lifecycle.md @@ -135,11 +135,11 @@ This Contribution Guide also includes separate sections on topics such as [Error - [ ] __Uses AWS Go SDK Pointer Conversion Functions__: Many APIs return pointer types and these functions return the zero value for the type if the pointer is `nil`. This prevents potential panics from unchecked `*` pointer dereferences and can eliminate boilerplate `nil` checking in many cases. See also the [`aws` package in the AWS Go SDK documentation](https://docs.aws.amazon.com/sdk-for-go/api/aws/). - [ ] __Uses AWS Go SDK Types__: Use available SDK structs instead of implementing custom types with indirection. - [ ] __Uses Existing Validation Functions__: Schema definitions including `ValidateFunc` for attribute validation should use available [Terraform `helper/validation` package](https://godoc.org/github.com/hashicorp/terraform/helper/validation) functions. `All()`/`Any()` can be used for combining multiple validation function behaviors. -- [ ] __Uses tfresource.TimedOut() with resource.Retry()__: Resource logic implementing [`resource.Retry()`](https://godoc.org/github.com/hashicorp/terraform/helper/resource#Retry) should error check with [`tfresource.TimedOut(err error)`](https://godoc.org/github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource#TimedOut) and potentially unset the error before returning the error. For example: +- [ ] __Uses tfresource.TimedOut() with tfresource.RetryOnConnectionResetByPeer()__: Resource logic implementing [`tfresource.RetryOnConnectionResetByPeer()`](https://godoc.org/github.com/hashicorp/terraform/helper/resource#Retry) should error check with [`tfresource.TimedOut(err error)`](https://godoc.org/github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource#TimedOut) and potentially unset the error before returning the error. For example: ```go var output *kms.CreateKeyOutput - err := resource.Retry(1*time.Minute, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(1*time.Minute, func() *resource.RetryError { var err error output, err = conn.CreateKey(input) diff --git a/docs/contributing/retries-and-waiters.md b/docs/contributing/retries-and-waiters.md index b98a525b33e..0648ef4125c 100644 --- a/docs/contributing/retries-and-waiters.md +++ b/docs/contributing/retries-and-waiters.md @@ -29,7 +29,7 @@ This guide describes the behavior of the Terraform AWS Provider and provides cod ## Terraform Plugin SDK Functionality -The [Terraform Plugin SDK](https://github.com/hashicorp/terraform-plugin-sdk/), which the AWS Provider uses, provides vital tools for handling consistency: the `resource.StateChangeConf{}` struct, and the retry functions, `resource.Retry()` and `resource.RetryContext()`. We will discuss these throughout the rest of this guide. Since they help keep the AWS Provider code consistent, we heavily prefer them over custom implementations. +The [Terraform Plugin SDK](https://github.com/hashicorp/terraform-plugin-sdk/), which the AWS Provider uses, provides vital tools for handling consistency: the `resource.StateChangeConf{}` struct, and the retry functions, `resource.Retry() Deprecated` and `resource.RetryContext()`. We will discuss these throughout the rest of this guide. Since they help keep the AWS Provider code consistent, we heavily prefer them over custom implementations. This guide goes beyond the [Extending Terraform documentation](https://www.terraform.io/docs/extend/resources/retries-and-customizable-timeouts.html) by providing additional context and emergent implementations specific to the Terraform AWS Provider. @@ -43,7 +43,7 @@ The [`resource.StateChangeConf` type](https://pkg.go.dev/github.com/hashicorp/te ### Retry Functions -The [`resource.Retry()`](https://pkg.go.dev/github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource#Retry) and [`resource.RetryContext()`](https://pkg.go.dev/github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource#RetryContext) functions provide a simplified retry implementation around `resource.StateChangeConf`. Their most common use is for simple error-based retries. +The [`tfresource.RetryOnConnectionResetByPeer()`](https://pkg.go.dev/github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource#Retry) and [`resource.RetryContext()`](https://pkg.go.dev/github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource#RetryContext) functions provide a simplified retry implementation around `resource.StateChangeConf`. Their most common use is for simple error-based retries. ## AWS Request Handling @@ -108,7 +108,7 @@ These two concepts conflict with each other and require additional handling in T ### Operation Specific Error Retries -Even given a properly ordered Terraform configuration, eventual consistency can unexpectedly prevent downstream operations from succeeding. A simple retry after a few seconds resolves many of these issues. To reduce frustrating behavior for operators, wrap AWS Go SDK operations with the `resource.Retry()` or `resource.RetryContext()` functions. These retries should have a reasonably low timeout (typically two minutes but up to five minutes). Save them in a constant for reusability. These functions are preferably in line with the associated resource logic to remove any indirection with the code. +Even given a properly ordered Terraform configuration, eventual consistency can unexpectedly prevent downstream operations from succeeding. A simple retry after a few seconds resolves many of these issues. To reduce frustrating behavior for operators, wrap AWS Go SDK operations with the `tfresource.RetryOnConnectionResetByPeer()` or `resource.RetryContext()` functions. These retries should have a reasonably low timeout (typically two minutes but up to five minutes). Save them in a constant for reusability. These functions are preferably in line with the associated resource logic to remove any indirection with the code. Do not use this type of logic to overcome improperly ordered Terraform configurations. The approach may not work in larger environments. @@ -130,7 +130,7 @@ import ( ) // ... Create, Read, Update, or Delete function ... - err := resource.Retry(waiter.ThingOperationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.ThingOperationTimeout, func() *resource.RetryError { _, err := conn./* ... AWS Go SDK operation with eventual consistency errors ... */ // Retryable conditions which can be checked. @@ -187,7 +187,7 @@ import ( ) // ... Create and typically Update function ... - err := resource.Retry(iamwaiter.PropagationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout, func() *resource.RetryError { _, err := conn./* ... AWS Go SDK operation with IAM eventual consistency errors ... */ // Example retryable condition @@ -237,7 +237,7 @@ import ( iamwaiterStopTime := time.Now().Add(iamwaiter.PropagationTimeout) // Ensure to add IAM eventual consistency timeout in case of retries - err = resource.Retry(iamwaiter.PropagationTimeout+waiter.ThingOperationTimeout, func() *resource.RetryError { + err = tfresource.RetryOnConnectionResetByPeer(iamwaiter.PropagationTimeout+waiter.ThingOperationTimeout, func() *resource.RetryError { // Only retry IAM eventual consistency errors up to that timeout iamwaiterRetry := time.Now().Before(iamwaiterStopTime) @@ -310,7 +310,7 @@ function ExampleThingRead(d *schema.ResourceData, meta interface{}) error { input := &example.OperationInput{/* ... */} var output *example.OperationOutput - err := resource.Retry(waiter.ThingCreationTimeout, func() *resource.RetryError { + err := tfresource.RetryOnConnectionResetByPeer(waiter.ThingCreationTimeout, func() *resource.RetryError { var err error output, err = conn.Operation(input) @@ -356,7 +356,7 @@ function ExampleThingRead(d *schema.ResourceData, meta interface{}) error { Some other general guidelines are: - If the `Create` function uses `resource.StateChangeConf`, the underlying `resource.RefreshStateFunc` should `return nil, "", nil` instead of the API "not found" error. This way the `StateChangeConf` logic will automatically retry. -- If the `Create` function uses `resource.Retry()`, the API "not found" error should be caught and `return resource.RetryableError(err)` to automatically retry. +- If the `Create` function uses `tfresource.RetryOnConnectionResetByPeer()`, the API "not found" error should be caught and `return resource.RetryableError(err)` to automatically retry. In rare cases, it may be easier to duplicate all `Read` function logic in the `Create` function to handle all retries in one place.