Skip to content

Commit

Permalink
Add and use 'tfresource.Delete'.
Browse files Browse the repository at this point in the history
  • Loading branch information
ewbankkit committed Jun 11, 2021
1 parent 68e3361 commit 3ce6f12
Show file tree
Hide file tree
Showing 6 changed files with 132 additions and 30 deletions.
3 changes: 2 additions & 1 deletion aws/aws_sweeper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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/envvar"
"github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource"
)

// sweeperAwsClients is a shared cache of regional AWSClient
Expand Down Expand Up @@ -77,7 +78,7 @@ func testSweepResourceOrchestrator(sweepResources []*testSweepResource) error {
sweepResource := sweepResource

g.Go(func() error {
return testAccDeleteResource(sweepResource.resource, sweepResource.d, sweepResource.meta)
return tfresource.Delete(sweepResource.resource, sweepResource.d, sweepResource.meta)
})
}

Expand Down
7 changes: 4 additions & 3 deletions aws/internal/tfresource/errors_test.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package tfresource
package tfresource_test

import (
"errors"
"fmt"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource"
)

func TestNotFound(t *testing.T) {
Expand Down Expand Up @@ -40,7 +41,7 @@ func TestNotFound(t *testing.T) {

for _, testCase := range testCases {
t.Run(testCase.Name, func(t *testing.T) {
got := NotFound(testCase.Err)
got := tfresource.NotFound(testCase.Err)

if got != testCase.Expected {
t.Errorf("got %t, expected %t", got, testCase.Expected)
Expand Down Expand Up @@ -88,7 +89,7 @@ func TestTimedOut(t *testing.T) {

for _, testCase := range testCases {
t.Run(testCase.Name, func(t *testing.T) {
got := TimedOut(testCase.Err)
got := tfresource.TimedOut(testCase.Err)

if got != testCase.Expected {
t.Errorf("got %t, expected %t", got, testCase.Expected)
Expand Down
34 changes: 34 additions & 0 deletions aws/internal/tfresource/resource.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package tfresource

import (
"context"
"errors"

multierror "github.com/hashicorp/go-multierror"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

// Delete calls the specified resource's delete handler.
func Delete(resource *schema.Resource, d *schema.ResourceData, meta interface{}) error {
if resource.DeleteContext != nil || resource.DeleteWithoutTimeout != nil {
var diags diag.Diagnostics
var err *multierror.Error

if resource.DeleteContext != nil {
diags = resource.DeleteContext(context.Background(), d, meta)
} else {
diags = resource.DeleteWithoutTimeout(context.Background(), d, meta)
}

for i := range diags {
if diags[i].Severity == diag.Error {
err = multierror.Append(err, errors.New(diags[i].Summary))
}
}

return err.ErrorOrNil()
}

return resource.Delete(d, meta)
}
88 changes: 88 additions & 0 deletions aws/internal/tfresource/resource_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package tfresource_test

import (
"context"
"errors"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource"
)

func TestDeleteNoError(t *testing.T) {
theError := errors.New("fail")

testCases := []struct {
Name string
Resource *schema.Resource
ExpectError bool
}{
{
Name: "no error Delete function",
Resource: &schema.Resource{
Delete: func(rd *schema.ResourceData, i interface{}) error {
return nil
},
},
},
{
Name: "no error DeleteContext function",
Resource: &schema.Resource{
DeleteContext: func(c context.Context, rd *schema.ResourceData, i interface{}) diag.Diagnostics {
return nil
},
},
},
{
Name: "no error DeleteWithoutTimeout function",
Resource: &schema.Resource{
DeleteWithoutTimeout: func(c context.Context, rd *schema.ResourceData, i interface{}) diag.Diagnostics {
return nil
},
},
},
{
Name: "error Delete function",
Resource: &schema.Resource{
Delete: func(rd *schema.ResourceData, i interface{}) error {
return theError
},
},
ExpectError: true,
},
{
Name: "error DeleteContext function",
Resource: &schema.Resource{
DeleteContext: func(c context.Context, rd *schema.ResourceData, i interface{}) diag.Diagnostics {
return diag.FromErr(theError)
},
},
ExpectError: true,
},
{
Name: "error DeleteWithoutTimeout function",
Resource: &schema.Resource{
DeleteWithoutTimeout: func(c context.Context, rd *schema.ResourceData, i interface{}) diag.Diagnostics {
return diag.FromErr(theError)
},
},
ExpectError: true,
},
}

for _, testCase := range testCases {
t.Run(testCase.Name, func(t *testing.T) {
r := testCase.Resource
d := r.Data(nil)

err := tfresource.Delete(r, d, nil)

if testCase.ExpectError && err == nil {
t.Fatal("expected error")
} else if !testCase.ExpectError && err != nil {
t.Fatalf("unexpected error: %s", err)
}
})
}
}
26 changes: 2 additions & 24 deletions aws/provider_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,14 @@ import (
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/aws/aws-sdk-go/service/iam"
"github.com/aws/aws-sdk-go/service/organizations"
"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/structure"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
"github.com/terraform-providers/terraform-provider-aws/aws/internal/envvar"
organizationsfinder "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/organizations/finder"
stsfinder "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/sts/finder"
"github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource"
)

const (
Expand Down Expand Up @@ -1035,28 +1035,6 @@ func testAccAwsRegionProviderFunc(region string, providers *[]*schema.Provider)
}
}

func testAccDeleteResource(resource *schema.Resource, d *schema.ResourceData, meta interface{}) error {
if resource.DeleteContext != nil || resource.DeleteWithoutTimeout != nil {
var diags diag.Diagnostics

if resource.DeleteContext != nil {
diags = resource.DeleteContext(context.Background(), d, meta)
} else {
diags = resource.DeleteWithoutTimeout(context.Background(), d, meta)
}

for i := range diags {
if diags[i].Severity == diag.Error {
return fmt.Errorf("error deleting resource: %s", diags[i].Summary)
}
}

return nil
}

return resource.Delete(d, meta)
}

func testAccCheckResourceDisappears(provider *schema.Provider, resource *schema.Resource, resourceName string) resource.TestCheckFunc {
return func(s *terraform.State) error {
resourceState, ok := s.RootModule().Resources[resourceName]
Expand All @@ -1069,7 +1047,7 @@ func testAccCheckResourceDisappears(provider *schema.Provider, resource *schema.
return fmt.Errorf("resource ID missing: %s", resourceName)
}

return testAccDeleteResource(resource, resource.Data(resourceState.Primary), provider.Meta())
return tfresource.Delete(resource, resource.Data(resourceState.Primary), provider.Meta())
}
}

Expand Down
4 changes: 2 additions & 2 deletions aws/resource_aws_route_table.go
Original file line number Diff line number Diff line change
Expand Up @@ -517,7 +517,7 @@ func resourceAwsRouteTableDelete(d *schema.ResourceData, meta interface{}) error
d := r.Data(nil)
d.SetId(v)

if err := r.Delete(d, meta); err != nil {
if err := tfresource.Delete(r, d, meta); err != nil {
return err
}
}
Expand All @@ -538,7 +538,7 @@ func resourceAwsRouteTableDelete(d *schema.ResourceData, meta interface{}) error
// Wait for the route table to really destroy
log.Printf("[DEBUG] Waiting for route table (%s) deletion", d.Id())
if _, err := waiter.RouteTableDeleted(conn, d.Id()); err != nil {
return fmt.Errorf("error waiting for Route Table (%s) deletion: %w", d.Id(), err)
return fmt.Errorf("error waiting for Route Table (%s) to delete: %w", d.Id(), err)
}

return nil
Expand Down

0 comments on commit 3ce6f12

Please sign in to comment.