Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate Redshift Serverless resources to AWS SDK v2 #38851

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions internal/conns/awsclient_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 6 additions & 6 deletions internal/service/redshiftserverless/credentials_data_source.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import (
"context"
"time"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/redshiftserverless"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/redshiftserverless"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
Expand Down Expand Up @@ -55,19 +55,19 @@ func dataSourceCredentials() *schema.Resource {

func dataSourceCredentialsRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var diags diag.Diagnostics
conn := meta.(*conns.AWSClient).RedshiftServerlessConn(ctx)
conn := meta.(*conns.AWSClient).RedshiftServerlessClient(ctx)

workgroupName := d.Get("workgroup_name").(string)
input := &redshiftserverless.GetCredentialsInput{
WorkgroupName: aws.String(workgroupName),
DurationSeconds: aws.Int64(int64(d.Get("duration_seconds").(int))),
DurationSeconds: aws.Int32(int32(d.Get("duration_seconds").(int))),
}

if v, ok := d.GetOk("db_name"); ok {
input.DbName = aws.String(v.(string))
}

creds, err := conn.GetCredentialsWithContext(ctx, input)
creds, err := conn.GetCredentials(ctx, input)

if err != nil {
return sdkdiag.AppendErrorf(diags, "reading Redshift Serverless Credentials for Workgroup (%s): %s", workgroupName, err)
Expand All @@ -77,7 +77,7 @@ func dataSourceCredentialsRead(ctx context.Context, d *schema.ResourceData, meta

d.Set("db_password", creds.DbPassword)
d.Set("db_user", creds.DbUser)
d.Set("expiration", aws.TimeValue(creds.Expiration).Format(time.RFC3339))
d.Set("expiration", aws.ToTime(creds.Expiration).Format(time.RFC3339))

return diags
}
121 changes: 103 additions & 18 deletions internal/service/redshiftserverless/endpoint_access.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,17 @@ package redshiftserverless
import (
"context"
"log"
"time"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/redshiftserverless"
"github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/redshiftserverless"
awstypes "github.com/aws/aws-sdk-go-v2/service/redshiftserverless/types"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
"github.com/hashicorp/terraform-provider-aws/internal/conns"
"github.com/hashicorp/terraform-provider-aws/internal/errs"
"github.com/hashicorp/terraform-provider-aws/internal/errs/sdkdiag"
"github.com/hashicorp/terraform-provider-aws/internal/flex"
tfslices "github.com/hashicorp/terraform-provider-aws/internal/slices"
Expand Down Expand Up @@ -126,7 +129,7 @@ func resourceEndpointAccess() *schema.Resource {

func resourceEndpointAccessCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var diags diag.Diagnostics
conn := meta.(*conns.AWSClient).RedshiftServerlessConn(ctx)
conn := meta.(*conns.AWSClient).RedshiftServerlessClient(ctx)

endpointName := d.Get("endpoint_name").(string)
input := &redshiftserverless.CreateEndpointAccessInput{
Expand All @@ -139,20 +142,20 @@ func resourceEndpointAccessCreate(ctx context.Context, d *schema.ResourceData, m
}

if v, ok := d.GetOk(names.AttrSubnetIDs); ok && v.(*schema.Set).Len() > 0 {
input.SubnetIds = flex.ExpandStringSet(v.(*schema.Set))
input.SubnetIds = flex.ExpandStringValueSet(v.(*schema.Set))
}

if v, ok := d.GetOk(names.AttrVPCSecurityGroupIDs); ok && v.(*schema.Set).Len() > 0 {
input.VpcSecurityGroupIds = flex.ExpandStringSet(v.(*schema.Set))
input.VpcSecurityGroupIds = flex.ExpandStringValueSet(v.(*schema.Set))
}

output, err := conn.CreateEndpointAccessWithContext(ctx, input)
output, err := conn.CreateEndpointAccess(ctx, input)

if err != nil {
return sdkdiag.AppendErrorf(diags, "creating Redshift Serverless Endpoint Access (%s): %s", endpointName, err)
}

d.SetId(aws.StringValue(output.Endpoint.EndpointName))
d.SetId(aws.ToString(output.Endpoint.EndpointName))

if _, err := waitEndpointAccessActive(ctx, conn, d.Id()); err != nil {
return sdkdiag.AppendErrorf(diags, "waiting for Redshift Serverless Endpoint Access (%s) create: %s", d.Id(), err)
Expand All @@ -163,7 +166,7 @@ func resourceEndpointAccessCreate(ctx context.Context, d *schema.ResourceData, m

func resourceEndpointAccessRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var diags diag.Diagnostics
conn := meta.(*conns.AWSClient).RedshiftServerlessConn(ctx)
conn := meta.(*conns.AWSClient).RedshiftServerlessClient(ctx)

endpointAccess, err := findEndpointAccessByName(ctx, conn, d.Id())

Expand All @@ -182,12 +185,12 @@ func resourceEndpointAccessRead(ctx context.Context, d *schema.ResourceData, met
d.Set("endpoint_name", endpointAccess.EndpointName)
d.Set("owner_account", d.Get("owner_account"))
d.Set(names.AttrPort, endpointAccess.Port)
d.Set(names.AttrSubnetIDs, aws.StringValueSlice(endpointAccess.SubnetIds))
d.Set(names.AttrSubnetIDs, endpointAccess.SubnetIds)
if err := d.Set("vpc_endpoint", []interface{}{flattenVPCEndpoint(endpointAccess.VpcEndpoint)}); err != nil {
return sdkdiag.AppendErrorf(diags, "setting vpc_endpoint: %s", err)
}
d.Set(names.AttrVPCSecurityGroupIDs, tfslices.ApplyToAll(endpointAccess.VpcSecurityGroups, func(v *redshiftserverless.VpcSecurityGroupMembership) string {
return aws.StringValue(v.VpcSecurityGroupId)
d.Set(names.AttrVPCSecurityGroupIDs, tfslices.ApplyToAll(endpointAccess.VpcSecurityGroups, func(v awstypes.VpcSecurityGroupMembership) string {
return aws.ToString(v.VpcSecurityGroupId)
}))
d.Set("workgroup_name", endpointAccess.WorkgroupName)

Expand All @@ -196,17 +199,17 @@ func resourceEndpointAccessRead(ctx context.Context, d *schema.ResourceData, met

func resourceEndpointAccessUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var diags diag.Diagnostics
conn := meta.(*conns.AWSClient).RedshiftServerlessConn(ctx)
conn := meta.(*conns.AWSClient).RedshiftServerlessClient(ctx)

input := &redshiftserverless.UpdateEndpointAccessInput{
EndpointName: aws.String(d.Id()),
}

if v, ok := d.GetOk(names.AttrVPCSecurityGroupIDs); ok && v.(*schema.Set).Len() > 0 {
input.VpcSecurityGroupIds = flex.ExpandStringSet(v.(*schema.Set))
input.VpcSecurityGroupIds = flex.ExpandStringValueSet(v.(*schema.Set))
}

_, err := conn.UpdateEndpointAccessWithContext(ctx, input)
_, err := conn.UpdateEndpointAccess(ctx, input)

if err != nil {
return sdkdiag.AppendErrorf(diags, "updating Redshift Serverless Endpoint Access (%s): %s", d.Id(), err)
Expand All @@ -221,14 +224,14 @@ func resourceEndpointAccessUpdate(ctx context.Context, d *schema.ResourceData, m

func resourceEndpointAccessDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var diags diag.Diagnostics
conn := meta.(*conns.AWSClient).RedshiftServerlessConn(ctx)
conn := meta.(*conns.AWSClient).RedshiftServerlessClient(ctx)

log.Printf("[DEBUG] Deleting Redshift Serverless Endpoint Access: %s", d.Id())
_, err := conn.DeleteEndpointAccessWithContext(ctx, &redshiftserverless.DeleteEndpointAccessInput{
_, err := conn.DeleteEndpointAccess(ctx, &redshiftserverless.DeleteEndpointAccessInput{
EndpointName: aws.String(d.Id()),
})

if tfawserr.ErrCodeEquals(err, redshiftserverless.ErrCodeResourceNotFoundException) {
if errs.IsA[*awstypes.ResourceNotFoundException](err) {
return diags
}

Expand All @@ -242,3 +245,85 @@ func resourceEndpointAccessDelete(ctx context.Context, d *schema.ResourceData, m

return diags
}

func findEndpointAccessByName(ctx context.Context, conn *redshiftserverless.Client, name string) (*awstypes.EndpointAccess, error) {
input := &redshiftserverless.GetEndpointAccessInput{
EndpointName: aws.String(name),
}

output, err := conn.GetEndpointAccess(ctx, input)

if errs.IsA[*awstypes.ResourceNotFoundException](err) {
return nil, &retry.NotFoundError{
LastError: err,
LastRequest: input,
}
}

if err != nil {
return nil, err
}

if output == nil {
return nil, tfresource.NewEmptyResultError(input)
}

return output.Endpoint, nil
}

func statusEndpointAccess(ctx context.Context, conn *redshiftserverless.Client, name string) retry.StateRefreshFunc {
return func() (interface{}, string, error) {
output, err := findEndpointAccessByName(ctx, conn, name)

if tfresource.NotFound(err) {
return nil, "", nil
}

if err != nil {
return nil, "", err
}

return output, aws.ToString(output.EndpointStatus), nil
}
}

func waitEndpointAccessActive(ctx context.Context, conn *redshiftserverless.Client, name string) (*awstypes.EndpointAccess, error) { //nolint:unparam
stateConf := &retry.StateChangeConf{
Pending: []string{
"CREATING",
"MODIFYING",
},
Target: []string{
"ACTIVE",
},
Refresh: statusEndpointAccess(ctx, conn, name),
Timeout: 10 * time.Minute,
}

outputRaw, err := stateConf.WaitForStateContext(ctx)

if output, ok := outputRaw.(*awstypes.EndpointAccess); ok {
return output, err
}

return nil, err
}

func waitEndpointAccessDeleted(ctx context.Context, conn *redshiftserverless.Client, name string) (*awstypes.EndpointAccess, error) {
stateConf := &retry.StateChangeConf{
Pending: []string{
"DELETING",
},
Target: []string{},
Refresh: statusEndpointAccess(ctx, conn, name),
Timeout: 10 * time.Minute,
}

outputRaw, err := stateConf.WaitForStateContext(ctx)

if output, ok := outputRaw.(*awstypes.EndpointAccess); ok {
return output, err
}

return nil, err
}
4 changes: 2 additions & 2 deletions internal/service/redshiftserverless/endpoint_access_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ func TestAccRedshiftServerlessEndpointAccess_disappears(t *testing.T) {

func testAccCheckEndpointAccessDestroy(ctx context.Context) resource.TestCheckFunc {
return func(s *terraform.State) error {
conn := acctest.Provider.Meta().(*conns.AWSClient).RedshiftServerlessConn(ctx)
conn := acctest.Provider.Meta().(*conns.AWSClient).RedshiftServerlessClient(ctx)

for _, rs := range s.RootModule().Resources {
if rs.Type != "aws_redshiftserverless_endpoint_access" {
Expand Down Expand Up @@ -142,7 +142,7 @@ func testAccCheckEndpointAccessExists(ctx context.Context, n string) resource.Te
return fmt.Errorf("Not found: %s", n)
}

conn := acctest.Provider.Meta().(*conns.AWSClient).RedshiftServerlessConn(ctx)
conn := acctest.Provider.Meta().(*conns.AWSClient).RedshiftServerlessClient(ctx)

_, err := tfredshiftserverless.FindEndpointAccessByName(ctx, conn, rs.Primary.ID)

Expand Down
1 change: 1 addition & 0 deletions internal/service/redshiftserverless/exports_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,5 @@ var (
FindResourcePolicyByARN = findResourcePolicyByARN
FindSnapshotByName = findSnapshotByName
FindUsageLimitByName = findUsageLimitByName
FindWorkgroupByName = findWorkgroupByName
)
Loading
Loading