Skip to content

Commit

Permalink
r/aws_nat_gateway: Switch to 'WithoutTimeout' CRUD handlers (#15090).
Browse files Browse the repository at this point in the history
  • Loading branch information
ewbankkit committed Nov 22, 2022
1 parent 4d62028 commit 4281e0f
Show file tree
Hide file tree
Showing 7 changed files with 56 additions and 52 deletions.
12 changes: 6 additions & 6 deletions internal/service/ec2/find.go
Original file line number Diff line number Diff line change
Expand Up @@ -6010,8 +6010,8 @@ func FindManagedPrefixListEntryByIDAndCIDR(ctx context.Context, conn *ec2.EC2, i
return nil, &resource.NotFoundError{}
}

func FindNATGateway(conn *ec2.EC2, input *ec2.DescribeNatGatewaysInput) (*ec2.NatGateway, error) {
output, err := FindNATGateways(conn, input)
func FindNATGateway(ctx context.Context, conn *ec2.EC2, input *ec2.DescribeNatGatewaysInput) (*ec2.NatGateway, error) {
output, err := FindNATGateways(ctx, conn, input)

if err != nil {
return nil, err
Expand All @@ -6028,10 +6028,10 @@ func FindNATGateway(conn *ec2.EC2, input *ec2.DescribeNatGatewaysInput) (*ec2.Na
return output[0], nil
}

func FindNATGateways(conn *ec2.EC2, input *ec2.DescribeNatGatewaysInput) ([]*ec2.NatGateway, error) {
func FindNATGateways(ctx context.Context, conn *ec2.EC2, input *ec2.DescribeNatGatewaysInput) ([]*ec2.NatGateway, error) {
var output []*ec2.NatGateway

err := conn.DescribeNatGatewaysPages(input, func(page *ec2.DescribeNatGatewaysOutput, lastPage bool) bool {
err := conn.DescribeNatGatewaysPagesWithContext(ctx, input, func(page *ec2.DescribeNatGatewaysOutput, lastPage bool) bool {
if page == nil {
return !lastPage
}
Expand Down Expand Up @@ -6059,12 +6059,12 @@ func FindNATGateways(conn *ec2.EC2, input *ec2.DescribeNatGatewaysInput) ([]*ec2
return output, nil
}

func FindNATGatewayByID(conn *ec2.EC2, id string) (*ec2.NatGateway, error) {
func FindNATGatewayByID(ctx context.Context, conn *ec2.EC2, id string) (*ec2.NatGateway, error) {
input := &ec2.DescribeNatGatewaysInput{
NatGatewayIds: aws.StringSlice([]string{id}),
}

output, err := FindNATGateway(conn, input)
output, err := FindNATGateway(ctx, conn, input)

if err != nil {
return nil, err
Expand Down
4 changes: 2 additions & 2 deletions internal/service/ec2/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -334,9 +334,9 @@ func StatusInstanceRootBlockDeviceDeleteOnTermination(conn *ec2.EC2, id string)
}
}

func StatusNATGatewayState(conn *ec2.EC2, id string) resource.StateRefreshFunc {
func StatusNATGatewayState(ctx context.Context, conn *ec2.EC2, id string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
output, err := FindNATGatewayByID(conn, id)
output, err := FindNATGatewayByID(ctx, conn, id)

if tfresource.NotFound(err) {
return nil, "", nil
Expand Down
51 changes: 26 additions & 25 deletions internal/service/ec2/vpc_nat_gateway.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package ec2

import (
"fmt"
"context"
"log"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"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"
Expand All @@ -18,10 +19,10 @@ import (

func ResourceNATGateway() *schema.Resource {
return &schema.Resource{
Create: resourceNATGatewayCreate,
Read: resourceNATGatewayRead,
Update: resourceNATGatewayUpdate,
Delete: resourceNATGatewayDelete,
CreateWithoutTimeout: resourceNATGatewayCreate,
ReadWithoutTimeout: resourceNATGatewayRead,
UpdateWithoutTimeout: resourceNATGatewayUpdate,
DeleteWithoutTimeout: resourceNATGatewayDelete,

Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
Expand Down Expand Up @@ -68,7 +69,7 @@ func ResourceNATGateway() *schema.Resource {
}
}

func resourceNATGatewayCreate(d *schema.ResourceData, meta interface{}) error {
func resourceNATGatewayCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*conns.AWSClient).EC2Conn
defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig
tags := defaultTagsConfig.MergeTags(tftags.New(d.Get("tags").(map[string]interface{})))
Expand All @@ -94,27 +95,27 @@ func resourceNATGatewayCreate(d *schema.ResourceData, meta interface{}) error {
input.SubnetId = aws.String(v.(string))
}

output, err := conn.CreateNatGateway(input)
output, err := conn.CreateNatGatewayWithContext(ctx, input)

if err != nil {
return fmt.Errorf("creating EC2 NAT Gateway: %w", err)
return diag.Errorf("creating EC2 NAT Gateway: %s", err)
}

d.SetId(aws.StringValue(output.NatGateway.NatGatewayId))

if _, err := WaitNATGatewayCreated(conn, d.Id()); err != nil {
return fmt.Errorf("waiting for EC2 NAT Gateway (%s) create: %w", d.Id(), err)
if _, err := WaitNATGatewayCreated(ctx, conn, d.Id()); err != nil {
return diag.Errorf("waiting for EC2 NAT Gateway (%s) create: %s", d.Id(), err)
}

return resourceNATGatewayRead(d, meta)
return resourceNATGatewayRead(ctx, d, meta)
}

func resourceNATGatewayRead(d *schema.ResourceData, meta interface{}) error {
func resourceNATGatewayRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*conns.AWSClient).EC2Conn
defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig

ng, err := FindNATGatewayByID(conn, d.Id())
ng, err := FindNATGatewayByID(ctx, conn, d.Id())

if !d.IsNewResource() && tfresource.NotFound(err) {
log.Printf("[WARN] EC2 NAT Gateway (%s) not found, removing from state", d.Id())
Expand All @@ -123,7 +124,7 @@ func resourceNATGatewayRead(d *schema.ResourceData, meta interface{}) error {
}

if err != nil {
return fmt.Errorf("reading EC2 NAT Gateway (%s): %w", d.Id(), err)
return diag.Errorf("reading EC2 NAT Gateway (%s): %s", d.Id(), err)
}

address := ng.NatGatewayAddresses[0]
Expand All @@ -138,35 +139,35 @@ func resourceNATGatewayRead(d *schema.ResourceData, meta interface{}) error {

//lintignore:AWSR002
if err := d.Set("tags", tags.RemoveDefaultConfig(defaultTagsConfig).Map()); err != nil {
return fmt.Errorf("setting tags: %w", err)
return diag.Errorf("setting tags: %s", err)
}

if err := d.Set("tags_all", tags.Map()); err != nil {
return fmt.Errorf("setting tags_all: %w", err)
return diag.Errorf("setting tags_all: %s", err)
}

return nil
}

func resourceNATGatewayUpdate(d *schema.ResourceData, meta interface{}) error {
func resourceNATGatewayUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*conns.AWSClient).EC2Conn

if d.HasChange("tags_all") {
o, n := d.GetChange("tags_all")

if err := UpdateTags(conn, d.Id(), o, n); err != nil {
return fmt.Errorf("updating EC2 NAT Gateway (%s) tags: %w", d.Id(), err)
if err := UpdateTagsWithContext(ctx, conn, d.Id(), o, n); err != nil {
return diag.Errorf("updating EC2 NAT Gateway (%s) tags: %s", d.Id(), err)
}
}

return resourceNATGatewayRead(d, meta)
return resourceNATGatewayRead(ctx, d, meta)
}

func resourceNATGatewayDelete(d *schema.ResourceData, meta interface{}) error {
func resourceNATGatewayDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*conns.AWSClient).EC2Conn

log.Printf("[INFO] Deleting EC2 NAT Gateway: %s", d.Id())
_, err := conn.DeleteNatGateway(&ec2.DeleteNatGatewayInput{
_, err := conn.DeleteNatGatewayWithContext(ctx, &ec2.DeleteNatGatewayInput{
NatGatewayId: aws.String(d.Id()),
})

Expand All @@ -175,11 +176,11 @@ func resourceNATGatewayDelete(d *schema.ResourceData, meta interface{}) error {
}

if err != nil {
return fmt.Errorf("deleting EC2 NAT Gateway (%s): %w", d.Id(), err)
return diag.Errorf("deleting EC2 NAT Gateway (%s): %s", d.Id(), err)
}

if _, err := WaitNATGatewayDeleted(conn, d.Id()); err != nil {
return fmt.Errorf("waiting for EC2 NAT Gateway (%s) delete: %w", d.Id(), err)
if _, err := WaitNATGatewayDeleted(ctx, conn, d.Id()); err != nil {
return diag.Errorf("waiting for EC2 NAT Gateway (%s) delete: %s", d.Id(), err)
}

return nil
Expand Down
13 changes: 7 additions & 6 deletions internal/service/ec2/vpc_nat_gateway_data_source.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package ec2

import (
"fmt"
"context"
"time"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-provider-aws/internal/conns"
tftags "github.com/hashicorp/terraform-provider-aws/internal/tags"
Expand All @@ -14,7 +15,7 @@ import (

func DataSourceNATGateway() *schema.Resource {
return &schema.Resource{
Read: dataSourceNATGatewayRead,
ReadWithoutTimeout: dataSourceNATGatewayRead,

Timeouts: &schema.ResourceTimeout{
Read: schema.DefaultTimeout(20 * time.Minute),
Expand Down Expand Up @@ -67,7 +68,7 @@ func DataSourceNATGateway() *schema.Resource {
}
}

func dataSourceNATGatewayRead(d *schema.ResourceData, meta interface{}) error {
func dataSourceNATGatewayRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*conns.AWSClient).EC2Conn
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig

Expand Down Expand Up @@ -99,10 +100,10 @@ func dataSourceNATGatewayRead(d *schema.ResourceData, meta interface{}) error {
input.Filter = nil
}

ngw, err := FindNATGateway(conn, input)
ngw, err := FindNATGateway(ctx, conn, input)

if err != nil {
return tfresource.SingularDataSourceFindError("EC2 NAT Gateway", err)
return diag.FromErr(tfresource.SingularDataSourceFindError("EC2 NAT Gateway", err))
}

d.SetId(aws.StringValue(ngw.NatGatewayId))
Expand All @@ -122,7 +123,7 @@ func dataSourceNATGatewayRead(d *schema.ResourceData, meta interface{}) error {
}

if err := d.Set("tags", KeyValueTags(ngw.Tags).IgnoreAWS().IgnoreConfig(ignoreTagsConfig).Map()); err != nil {
return fmt.Errorf("error setting tags: %w", err)
return diag.Errorf("error setting tags: %s", err)
}

return nil
Expand Down
5 changes: 3 additions & 2 deletions internal/service/ec2/vpc_nat_gateway_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package ec2_test

import (
"context"
"fmt"
"testing"

Expand Down Expand Up @@ -186,7 +187,7 @@ func testAccCheckNATGatewayDestroy(s *terraform.State) error {
continue
}

_, err := tfec2.FindNATGatewayByID(conn, rs.Primary.ID)
_, err := tfec2.FindNATGatewayByID(context.Background(), conn, rs.Primary.ID)

if tfresource.NotFound(err) {
continue
Expand Down Expand Up @@ -215,7 +216,7 @@ func testAccCheckNATGatewayExists(n string, v *ec2.NatGateway) resource.TestChec

conn := acctest.Provider.Meta().(*conns.AWSClient).EC2Conn

output, err := tfec2.FindNATGatewayByID(conn, rs.Primary.ID)
output, err := tfec2.FindNATGatewayByID(context.Background(), conn, rs.Primary.ID)

if err != nil {
return err
Expand Down
11 changes: 6 additions & 5 deletions internal/service/ec2/vpc_nat_gateways_data_source.go
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
package ec2

import (
"fmt"
"context"
"time"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-provider-aws/internal/conns"
tftags "github.com/hashicorp/terraform-provider-aws/internal/tags"
)

func DataSourceNATGateways() *schema.Resource {
return &schema.Resource{
Read: dataSourceNATGatewaysRead,
ReadWithoutTimeout: dataSourceNATGatewaysRead,

Timeouts: &schema.ResourceTimeout{
Read: schema.DefaultTimeout(20 * time.Minute),
Expand All @@ -35,7 +36,7 @@ func DataSourceNATGateways() *schema.Resource {
}
}

func dataSourceNATGatewaysRead(d *schema.ResourceData, meta interface{}) error {
func dataSourceNATGatewaysRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*conns.AWSClient).EC2Conn

input := &ec2.DescribeNatGatewaysInput{}
Expand All @@ -62,10 +63,10 @@ func dataSourceNATGatewaysRead(d *schema.ResourceData, meta interface{}) error {
input.Filter = nil
}

output, err := FindNATGateways(conn, input)
output, err := FindNATGateways(ctx, conn, input)

if err != nil {
return fmt.Errorf("error reading EC2 NAT Gateways: %w", err)
return diag.Errorf("error reading EC2 NAT Gateways: %s", err)
}

var natGatewayIDs []string
Expand Down
12 changes: 6 additions & 6 deletions internal/service/ec2/wait.go
Original file line number Diff line number Diff line change
Expand Up @@ -2037,15 +2037,15 @@ const (
natGatewayDeletedTimeout = 30 * time.Minute
)

func WaitNATGatewayCreated(conn *ec2.EC2, id string) (*ec2.NatGateway, error) {
func WaitNATGatewayCreated(ctx context.Context, conn *ec2.EC2, id string) (*ec2.NatGateway, error) {
stateConf := &resource.StateChangeConf{
Pending: []string{ec2.NatGatewayStatePending},
Target: []string{ec2.NatGatewayStateAvailable},
Refresh: StatusNATGatewayState(conn, id),
Refresh: StatusNATGatewayState(ctx, conn, id),
Timeout: natGatewayCreatedTimeout,
}

outputRaw, err := stateConf.WaitForState()
outputRaw, err := stateConf.WaitForStateContext(ctx)

if output, ok := outputRaw.(*ec2.NatGateway); ok {
if state := aws.StringValue(output.State); state == ec2.NatGatewayStateFailed {
Expand All @@ -2058,17 +2058,17 @@ func WaitNATGatewayCreated(conn *ec2.EC2, id string) (*ec2.NatGateway, error) {
return nil, err
}

func WaitNATGatewayDeleted(conn *ec2.EC2, id string) (*ec2.NatGateway, error) {
func WaitNATGatewayDeleted(ctx context.Context, conn *ec2.EC2, id string) (*ec2.NatGateway, error) {
stateConf := &resource.StateChangeConf{
Pending: []string{ec2.NatGatewayStateDeleting},
Target: []string{},
Refresh: StatusNATGatewayState(conn, id),
Refresh: StatusNATGatewayState(ctx, conn, id),
Timeout: natGatewayDeletedTimeout,
Delay: 10 * time.Second,
MinTimeout: 10 * time.Second,
}

outputRaw, err := stateConf.WaitForState()
outputRaw, err := stateConf.WaitForStateContext(ctx)

if output, ok := outputRaw.(*ec2.NatGateway); ok {
if state := aws.StringValue(output.State); state == ec2.NatGatewayStateFailed {
Expand Down

0 comments on commit 4281e0f

Please sign in to comment.