Skip to content

Commit

Permalink
Merge pull request #20578 from hashicorp/t-aws_glue_dev_endpoint-failure
Browse files Browse the repository at this point in the history
r/aws_glue_dev_endpoint: Correctly report failure reason
  • Loading branch information
ewbankkit authored Aug 17, 2021
2 parents d529527 + 89815c4 commit 1189a2b
Show file tree
Hide file tree
Showing 6 changed files with 124 additions and 111 deletions.
8 changes: 8 additions & 0 deletions aws/internal/service/glue/enum.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package glue

const (
DevEndpointStatusFailed = "FAILED"
DevEndpointStatusProvisioning = "PROVISIONING"
DevEndpointStatusReady = "READY"
DevEndpointStatusTerminating = "TERMINATING"
)
30 changes: 30 additions & 0 deletions aws/internal/service/glue/finder/finder.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,39 @@ package finder
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/glue"
"github.com/hashicorp/aws-sdk-go-base/tfawserr"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
tfglue "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/glue"
)

func DevEndpointByName(conn *glue.Glue, name string) (*glue.DevEndpoint, error) {
input := &glue.GetDevEndpointInput{
EndpointName: aws.String(name),
}

output, err := conn.GetDevEndpoint(input)

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

if err != nil {
return nil, err
}

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

return output.DevEndpoint, nil
}

// TableByName returns the Table corresponding to the specified name.
func TableByName(conn *glue.Glue, catalogID, dbName, name string) (*glue.GetTableOutput, error) {
input := &glue.GetTableInput{
Expand Down
24 changes: 6 additions & 18 deletions aws/internal/service/glue/waiter/status.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package waiter

import (
"fmt"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/glue"
"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/service/glue/finder"
"github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource"
)

const (
Expand Down Expand Up @@ -110,26 +108,16 @@ func TriggerStatus(conn *glue.Glue, triggerName string) resource.StateRefreshFun

func GlueDevEndpointStatus(conn *glue.Glue, name string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
getDevEndpointInput := &glue.GetDevEndpointInput{
EndpointName: aws.String(name),
}
endpoint, err := conn.GetDevEndpoint(getDevEndpointInput)
if err != nil {
if tfawserr.ErrCodeEquals(err, glue.ErrCodeEntityNotFoundException) {
return nil, "", nil
}
output, err := finder.DevEndpointByName(conn, name)

return nil, "", err
}

if endpoint == nil || endpoint.DevEndpoint == nil {
if tfresource.NotFound(err) {
return nil, "", nil
}

if aws.StringValue(endpoint.DevEndpoint.Status) == "FAILED" && endpoint.DevEndpoint.FailureReason != nil {
return endpoint, aws.StringValue(endpoint.DevEndpoint.Status), fmt.Errorf("%s", aws.StringValue(endpoint.DevEndpoint.FailureReason))
if err != nil {
return nil, "", err
}

return endpoint, aws.StringValue(endpoint.DevEndpoint.Status), nil
return output, aws.StringValue(output.Status), nil
}
}
34 changes: 21 additions & 13 deletions aws/internal/service/glue/waiter/waiter.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package waiter

import (
"errors"
"time"

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

const (
Expand Down Expand Up @@ -151,38 +155,42 @@ func TriggerDeleted(conn *glue.Glue, triggerName string) (*glue.GetTriggerOutput
return nil, err
}

// GlueDevEndpointCreated waits for a Glue Dev Endpoint to become available.
func GlueDevEndpointCreated(conn *glue.Glue, devEndpointId string) (*glue.GetDevEndpointOutput, error) {
func GlueDevEndpointCreated(conn *glue.Glue, name string) (*glue.DevEndpoint, error) {
stateConf := &resource.StateChangeConf{
Pending: []string{
"PROVISIONING",
},
Target: []string{"READY"},
Refresh: GlueDevEndpointStatus(conn, devEndpointId),
Pending: []string{tfglue.DevEndpointStatusProvisioning},
Target: []string{tfglue.DevEndpointStatusReady},
Refresh: GlueDevEndpointStatus(conn, name),
Timeout: 15 * time.Minute,
}

outputRaw, err := stateConf.WaitForState()

if output, ok := outputRaw.(*glue.GetDevEndpointOutput); ok {
if output, ok := outputRaw.(*glue.DevEndpoint); ok {
if status := aws.StringValue(output.Status); status == tfglue.DevEndpointStatusFailed {
tfresource.SetLastError(err, errors.New(aws.StringValue(output.FailureReason)))
}

return output, err
}

return nil, err
}

// GlueDevEndpointDeleted waits for a Glue Dev Endpoint to become terminated.
func GlueDevEndpointDeleted(conn *glue.Glue, devEndpointId string) (*glue.GetDevEndpointOutput, error) {
func GlueDevEndpointDeleted(conn *glue.Glue, name string) (*glue.DevEndpoint, error) {
stateConf := &resource.StateChangeConf{
Pending: []string{"TERMINATING"},
Pending: []string{tfglue.DevEndpointStatusTerminating},
Target: []string{},
Refresh: GlueDevEndpointStatus(conn, devEndpointId),
Refresh: GlueDevEndpointStatus(conn, name),
Timeout: 15 * time.Minute,
}

outputRaw, err := stateConf.WaitForState()

if output, ok := outputRaw.(*glue.GetDevEndpointOutput); ok {
if output, ok := outputRaw.(*glue.DevEndpoint); ok {
if status := aws.StringValue(output.Status); status == tfglue.DevEndpointStatusFailed {
tfresource.SetLastError(err, errors.New(aws.StringValue(output.FailureReason)))
}

return output, err
}

Expand Down
Loading

0 comments on commit 1189a2b

Please sign in to comment.