Skip to content

Commit

Permalink
r/aws_globalaccelerator_listener: Use internal finder and waiter pack…
Browse files Browse the repository at this point in the history
…ages. Add '_disappears' test (hashicorp#13826, hashicorp#13527).

Acceptance test output:

$ make testacc TEST=./aws/ TESTARGS='-run=TestAccAwsGlobalAcceleratorListener_disappears'
==> Checking that code complies with gofmt requirements...
TF_ACC=1 go test ./aws -v -count 1 -parallel 20 -run=TestAccAwsGlobalAcceleratorListener_disappears -timeout 120m
=== RUN   TestAccAwsGlobalAcceleratorListener_disappears
=== PAUSE TestAccAwsGlobalAcceleratorListener_disappears
=== CONT  TestAccAwsGlobalAcceleratorListener_disappears
--- PASS: TestAccAwsGlobalAcceleratorListener_disappears (120.32s)
PASS
ok  	github.com/terraform-providers/terraform-provider-aws/aws	120.416s
  • Loading branch information
ewbankkit committed Feb 21, 2021
1 parent 7ecb101 commit 954c245
Show file tree
Hide file tree
Showing 5 changed files with 168 additions and 237 deletions.
36 changes: 36 additions & 0 deletions aws/internal/service/globalaccelerator/finder/finder.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,3 +114,39 @@ func EndpointGroup(conn *globalaccelerator.GlobalAccelerator, input *globalaccel

return output.EndpointGroup, nil
}

// ListenerByARN returns the listener corresponding to the specified ARN.
// Returns NotFoundError if no listener is found.
func ListenerByARN(conn *globalaccelerator.GlobalAccelerator, arn string) (*globalaccelerator.Listener, error) {
input := &globalaccelerator.DescribeListenerInput{
ListenerArn: aws.String(arn),
}

return Listener(conn, input)
}

// Listener returns the listener corresponding to the specified input.
// Returns NotFoundError if no listener is found.
func Listener(conn *globalaccelerator.GlobalAccelerator, input *globalaccelerator.DescribeListenerInput) (*globalaccelerator.Listener, error) {
output, err := conn.DescribeListener(input)

if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeListenerNotFoundException) {
return nil, &resource.NotFoundError{
LastError: err,
LastRequest: input,
}
}

if err != nil {
return nil, err
}

if output == nil || output.Listener == nil {
return nil, &resource.NotFoundError{
Message: "Empty result",
LastRequest: input,
}
}

return output.Listener, nil
}
96 changes: 9 additions & 87 deletions aws/resource_aws_globalaccelerator_accelerator.go
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ func resourceAwsGlobalAcceleratorAcceleratorUpdate(d *schema.ResourceData, meta

log.Printf("[DEBUG] Updating Global Accelerator Accelerator: %s", input)
if _, err := conn.UpdateAccelerator(input); err != nil {
return fmt.Errorf("error updating Global Accelerator Accelerator (%s) attributes: %w", d.Id(), err)
return fmt.Errorf("error updating Global Accelerator Accelerator (%s): %w", d.Id(), err)
}

if _, err := waiter.AcceleratorDeployed(conn, d.Id(), d.Timeout(schema.TimeoutUpdate)); err != nil {
Expand Down Expand Up @@ -287,8 +287,14 @@ func resourceAwsGlobalAcceleratorAcceleratorDelete(d *schema.ResourceData, meta
Enabled: aws.Bool(false),
}

log.Printf("[DEBUG] Updating Global Accelerator Accelerator attributes: %s", input)
if _, err := conn.UpdateAccelerator(input); err != nil {
log.Printf("[DEBUG] Updating Global Accelerator Accelerator: %s", input)
_, err := conn.UpdateAccelerator(input)

if tfawserr.ErrCodeEquals(err, globalaccelerator.ErrCodeAcceleratorNotFoundException) {
return nil
}

if err != nil {
return fmt.Errorf("error disabling Global Accelerator Accelerator (%s): %w", d.Id(), err)
}

Expand Down Expand Up @@ -317,90 +323,6 @@ func resourceAwsGlobalAcceleratorAcceleratorDelete(d *schema.ResourceData, meta
return nil
}

func resourceAwsGlobalAcceleratorAcceleratorStateRefreshFunc(conn *globalaccelerator.GlobalAccelerator, acceleratorArn string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
accelerator, err := resourceAwsGlobalAcceleratorAcceleratorRetrieve(conn, acceleratorArn)

if err != nil {
log.Printf("Error retrieving Global Accelerator accelerator when waiting: %s", err)
return nil, "", err
}

if accelerator == nil {
return nil, "", nil
}

if accelerator.Status != nil {
log.Printf("[DEBUG] Global Accelerator accelerator (%s) status : %s", acceleratorArn, aws.StringValue(accelerator.Status))
}

return accelerator, aws.StringValue(accelerator.Status), nil
}
}

func resourceAwsGlobalAcceleratorAcceleratorRetrieve(conn *globalaccelerator.GlobalAccelerator, acceleratorArn string) (*globalaccelerator.Accelerator, error) {
resp, err := conn.DescribeAccelerator(&globalaccelerator.DescribeAcceleratorInput{
AcceleratorArn: aws.String(acceleratorArn),
})

if err != nil {
if isAWSErr(err, globalaccelerator.ErrCodeAcceleratorNotFoundException, "") {
return nil, nil
}
return nil, err
}

return resp.Accelerator, nil
}

func resourceAwsGlobalAcceleratorAcceleratorWaitForDeployedState(conn *globalaccelerator.GlobalAccelerator, acceleratorArn string, timeout time.Duration) error {
stateConf := &resource.StateChangeConf{
Pending: []string{globalaccelerator.AcceleratorStatusInProgress},
Target: []string{globalaccelerator.AcceleratorStatusDeployed},
Refresh: resourceAwsGlobalAcceleratorAcceleratorStateRefreshFunc(conn, acceleratorArn),
Timeout: timeout,
}

log.Printf("[DEBUG] Waiting for Global Accelerator accelerator (%s) availability", acceleratorArn)
_, err := stateConf.WaitForState()
if err != nil {
return fmt.Errorf("Error waiting for Global Accelerator accelerator (%s) availability: %s", acceleratorArn, err)
}

return nil
}

func resourceAwsGlobalAcceleratorAcceleratorUpdateAttributes(conn *globalaccelerator.GlobalAccelerator, arn string, timeout time.Duration, tfMap map[string]interface{}) error {
input := &globalaccelerator.UpdateAcceleratorAttributesInput{
AcceleratorArn: aws.String(arn),
}

if v, ok := tfMap["flow_logs_enabled"].(bool); ok {
input.FlowLogsEnabled = aws.Bool(v)
}

if v, ok := tfMap["flow_logs_s3_bucket"].(string); ok && v != "" {
input.FlowLogsS3Bucket = aws.String(v)
}

if v, ok := tfMap["flow_logs_s3_prefix"].(string); ok && v != "" {
input.FlowLogsS3Prefix = aws.String(v)
}

log.Printf("[DEBUG] Update Global Accelerator accelerator attributes: %s", input)

_, err := conn.UpdateAcceleratorAttributes(input)
if err != nil {
return fmt.Errorf("Error updating Global Accelerator accelerator attributes: %s", err)
}
err = resourceAwsGlobalAcceleratorAcceleratorWaitForDeployedState(conn, arn, timeout)
if err != nil {
return err
}

return nil
}

func expandGlobalAcceleratorUpdateAcceleratorAttributesInput(tfMap map[string]interface{}) *globalaccelerator.UpdateAcceleratorAttributesInput {
if tfMap == nil {
return nil
Expand Down
73 changes: 25 additions & 48 deletions aws/resource_aws_globalaccelerator_accelerator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"log"
"regexp"
"testing"
"time"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/globalaccelerator"
Expand All @@ -17,6 +16,7 @@ import (
"github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource"
)

// TODO Use sweeper dependencies, not nested calls.
func init() {
resource.AddTestSweepers("aws_globalaccelerator_accelerator", &resource.Sweeper{
Name: "aws_globalaccelerator_accelerator",
Expand Down Expand Up @@ -49,44 +49,15 @@ func testSweepGlobalAcceleratorAccelerators(region string) error {
for _, accelerator := range output.Accelerators {
arn := aws.StringValue(accelerator.AcceleratorArn)

errs := sweepGlobalAcceleratorListeners(conn, accelerator.AcceleratorArn)
errs := sweepGlobalAcceleratorListeners(client, accelerator.AcceleratorArn)
if errs != nil {
sweeperErrs = multierror.Append(sweeperErrs, errs)
}

if aws.BoolValue(accelerator.Enabled) {
input := &globalaccelerator.UpdateAcceleratorInput{
AcceleratorArn: accelerator.AcceleratorArn,
Enabled: aws.Bool(false),
}

log.Printf("[INFO] Disabling Global Accelerator Accelerator: %s", arn)

_, err := conn.UpdateAccelerator(input)

if err != nil {
sweeperErr := fmt.Errorf("error disabling Global Accelerator Accelerator (%s): %s", arn, err)
log.Printf("[ERROR] %s", sweeperErr)
sweeperErrs = multierror.Append(sweeperErrs, sweeperErr)
continue
}
}

// Global Accelerator accelerators need to be in `DEPLOYED` state before they can be deleted.
// Removing listeners or disabling can both set the state to `IN_PROGRESS`.
if err := resourceAwsGlobalAcceleratorAcceleratorWaitForDeployedState(conn, arn, 60*time.Minute); err != nil {
sweeperErr := fmt.Errorf("error waiting for Global Accelerator Accelerator (%s): %s", arn, err)
log.Printf("[ERROR] %s", sweeperErr)
sweeperErrs = multierror.Append(sweeperErrs, sweeperErr)
continue
}

input := &globalaccelerator.DeleteAcceleratorInput{
AcceleratorArn: accelerator.AcceleratorArn,
}

log.Printf("[INFO] Deleting Global Accelerator Accelerator: %s", arn)
_, err := conn.DeleteAccelerator(input)
r := resourceAwsGlobalAcceleratorAccelerator()
d := r.Data(nil)
d.SetId(arn)
err = r.Delete(d, client)

if err != nil {
sweeperErr := fmt.Errorf("error deleting Global Accelerator Accelerator (%s): %s", arn, err)
Expand All @@ -106,7 +77,8 @@ func testSweepGlobalAcceleratorAccelerators(region string) error {
return sweeperErrs.ErrorOrNil()
}

func sweepGlobalAcceleratorListeners(conn *globalaccelerator.GlobalAccelerator, acceleratorArn *string) *multierror.Error {
func sweepGlobalAcceleratorListeners(client interface{}, acceleratorArn *string) *multierror.Error {
conn := client.(*AWSClient).globalacceleratorconn
var sweeperErrs *multierror.Error

log.Printf("[INFO] deleting Listeners for Accelerator %s", *acceleratorArn)
Expand All @@ -121,18 +93,20 @@ func sweepGlobalAcceleratorListeners(conn *globalaccelerator.GlobalAccelerator,
}

for _, listener := range listenersOutput.Listeners {
errs := sweepGlobalAcceleratorEndpointGroups(conn, listener.ListenerArn)
errs := sweepGlobalAcceleratorEndpointGroups(client, listener.ListenerArn)
if errs != nil {
sweeperErrs = multierror.Append(sweeperErrs, errs)
}

input := &globalaccelerator.DeleteListenerInput{
ListenerArn: listener.ListenerArn,
}
_, err := conn.DeleteListener(input)
arn := aws.StringValue(listener.ListenerArn)

r := resourceAwsGlobalAcceleratorListener()
d := r.Data(nil)
d.SetId(arn)
err = r.Delete(d, client)

if err != nil {
sweeperErr := fmt.Errorf("error deleting Global Accelerator listener (%s): %s", *listener.ListenerArn, err)
sweeperErr := fmt.Errorf("error deleting Global Accelerator listener (%s): %s", arn, err)
log.Printf("[ERROR] %s", sweeperErr)
sweeperErrs = multierror.Append(sweeperErrs, sweeperErr)
continue
Expand All @@ -142,7 +116,8 @@ func sweepGlobalAcceleratorListeners(conn *globalaccelerator.GlobalAccelerator,
return sweeperErrs
}

func sweepGlobalAcceleratorEndpointGroups(conn *globalaccelerator.GlobalAccelerator, listenerArn *string) *multierror.Error {
func sweepGlobalAcceleratorEndpointGroups(client interface{}, listenerArn *string) *multierror.Error {
conn := client.(*AWSClient).globalacceleratorconn
var sweeperErrs *multierror.Error

log.Printf("[INFO] deleting Endpoint Groups for Listener %s", *listenerArn)
Expand All @@ -157,13 +132,15 @@ func sweepGlobalAcceleratorEndpointGroups(conn *globalaccelerator.GlobalAccelera
}

for _, endpoint := range output.EndpointGroups {
input := &globalaccelerator.DeleteEndpointGroupInput{
EndpointGroupArn: endpoint.EndpointGroupArn,
}
_, err := conn.DeleteEndpointGroup(input)
arn := aws.StringValue(endpoint.EndpointGroupArn)

r := resourceAwsGlobalAcceleratorEndpointGroup()
d := r.Data(nil)
d.SetId(arn)
err = r.Delete(d, client)

if err != nil {
sweeperErr := fmt.Errorf("error deleting Global Accelerator endpoint group (%s): %s", *endpoint.EndpointGroupArn, err)
sweeperErr := fmt.Errorf("error deleting Global Accelerator endpoint group (%s): %s", arn, err)
log.Printf("[ERROR] %s", sweeperErr)
sweeperErrs = multierror.Append(sweeperErrs, sweeperErr)
continue
Expand Down
Loading

0 comments on commit 954c245

Please sign in to comment.