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

Tech debt: Migrateqldb resources to AWS SDK for Go v2 #32345

Merged
merged 12 commits into from
Jul 3, 2023
Merged
3 changes: 3 additions & 0 deletions .changelog/32345.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:enhancement
resource/aws_qldb_stream: Add configurable Create and Delete timeouts
```
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ require (
github.com/aws/aws-sdk-go-v2/service/opensearchserverless v1.2.6
github.com/aws/aws-sdk-go-v2/service/pipes v1.2.8
github.com/aws/aws-sdk-go-v2/service/pricing v1.20.0
github.com/aws/aws-sdk-go-v2/service/qldb v1.15.13
github.com/aws/aws-sdk-go-v2/service/rbin v1.8.14
github.com/aws/aws-sdk-go-v2/service/rds v1.46.0
github.com/aws/aws-sdk-go-v2/service/resourceexplorer2 v1.2.15
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,8 @@ github.com/aws/aws-sdk-go-v2/service/pipes v1.2.8 h1:TPr7uAucpAvgE0ac9zMs/LTx9O0
github.com/aws/aws-sdk-go-v2/service/pipes v1.2.8/go.mod h1:T8pM2eiirH5Ld58Ek+t7tK3SqQNUwp9zkqkslW1v8sM=
github.com/aws/aws-sdk-go-v2/service/pricing v1.20.0 h1:x5gKeerbKIQ/tdhmaAGNpivSfmb+p2rdt0wyjCGz+4Q=
github.com/aws/aws-sdk-go-v2/service/pricing v1.20.0/go.mod h1:JjpnqJdEW/5An429Ou+5Kb3UkwjXv16gRD2ZdGA2Gw8=
github.com/aws/aws-sdk-go-v2/service/qldb v1.15.13 h1:iwKtlmYoS0wXm8VaCMnEpLjLrnyW3rT7YBsr9VlACCA=
github.com/aws/aws-sdk-go-v2/service/qldb v1.15.13/go.mod h1:AVsFo7PSMNr+/LvWa3YjXnP3poj5UJHDFVbCWkz6rJw=
github.com/aws/aws-sdk-go-v2/service/rbin v1.8.14 h1:oEeNqSze4JYbhsDg7udtz+AtLwrIXlvjItAd09Z2zTw=
github.com/aws/aws-sdk-go-v2/service/rbin v1.8.14/go.mod h1:JehbzDgwXYQi1wqKKFLstaNqsRPgPu9Kd6DiwhtFxoA=
github.com/aws/aws-sdk-go-v2/service/rds v1.46.0 h1:uv2LAciZRd5lEXzJo2u92tdZh/JxcVL7YLC51D4NLG4=
Expand Down
6 changes: 3 additions & 3 deletions internal/conns/awsclient_gen.go

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

10 changes: 10 additions & 0 deletions internal/service/qldb/exports_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package qldb

// Exports for use in tests only.
var (
FindLedgerByName = findLedgerByName
FindStreamByTwoPartKey = findStreamByTwoPartKey

ResourceLedger = resourceLedger
ResourceStream = resourceStream
)
2 changes: 1 addition & 1 deletion internal/service/qldb/generate.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//go:generate go run ../../generate/tags/main.go -ListTags -ServiceTagsMap -UpdateTags
//go:generate go run ../../generate/tags/main.go -AWSSDKVersion=2 -ListTags -ServiceTagsMap -UpdateTags -SkipTypesImp
//go:generate go run ../../generate/servicepackage/main.go
// ONLY generate directives and package declaration! Do not add anything else to this file.

Expand Down
80 changes: 39 additions & 41 deletions internal/service/qldb/ledger.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,17 @@ import (
"regexp"
"time"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/qldb"
"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/qldb"
"github.com/aws/aws-sdk-go-v2/service/qldb/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/create"
"github.com/hashicorp/terraform-provider-aws/internal/enum"
"github.com/hashicorp/terraform-provider-aws/internal/errs"
tftags "github.com/hashicorp/terraform-provider-aws/internal/tags"
"github.com/hashicorp/terraform-provider-aws/internal/tfresource"
"github.com/hashicorp/terraform-provider-aws/internal/verify"
Expand All @@ -23,7 +25,7 @@ import (

// @SDKResource("aws_qldb_ledger", name="Ledger")
// @Tags(identifierAttribute="arn")
func ResourceLedger() *schema.Resource {
func resourceLedger() *schema.Resource {
return &schema.Resource{
CreateWithoutTimeout: resourceLedgerCreate,
ReadWithoutTimeout: resourceLedgerRead,
Expand Down Expand Up @@ -69,9 +71,9 @@ func ResourceLedger() *schema.Resource {
),
},
"permissions_mode": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringInSlice(qldb.PermissionsMode_Values(), false),
Type: schema.TypeString,
Required: true,
ValidateDiagFunc: enum.Validate[types.PermissionsMode](),
},
names.AttrTags: tftags.TagsSchema(),
names.AttrTagsAll: tftags.TagsSchemaComputed(),
Expand All @@ -82,40 +84,39 @@ func ResourceLedger() *schema.Resource {
}

func resourceLedgerCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*conns.AWSClient).QLDBConn(ctx)
conn := meta.(*conns.AWSClient).QLDBClient(ctx)

name := create.Name(d.Get("name").(string), "tf")
input := &qldb.CreateLedgerInput{
DeletionProtection: aws.Bool(d.Get("deletion_protection").(bool)),
Name: aws.String(name),
PermissionsMode: aws.String(d.Get("permissions_mode").(string)),
PermissionsMode: types.PermissionsMode(d.Get("permissions_mode").(string)),
Tags: getTagsIn(ctx),
}

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

log.Printf("[DEBUG] Creating QLDB Ledger: %s", input)
output, err := conn.CreateLedgerWithContext(ctx, input)
output, err := conn.CreateLedger(ctx, input)

if err != nil {
return diag.Errorf("creating QLDB Ledger (%s): %s", name, err)
}

d.SetId(aws.StringValue(output.Name))
d.SetId(aws.ToString(output.Name))

if _, err := waitLedgerCreated(ctx, conn, d.Timeout(schema.TimeoutCreate), d.Id()); err != nil {
if _, err := waitLedgerCreated(ctx, conn, d.Id(), d.Timeout(schema.TimeoutCreate)); err != nil {
return diag.Errorf("waiting for QLDB Ledger (%s) create: %s", d.Id(), err)
}

return resourceLedgerRead(ctx, d, meta)
}

func resourceLedgerRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*conns.AWSClient).QLDBConn(ctx)
conn := meta.(*conns.AWSClient).QLDBClient(ctx)

ledger, err := FindLedgerByName(ctx, conn, d.Id())
ledger, err := findLedgerByName(ctx, conn, d.Id())

if !d.IsNewResource() && tfresource.NotFound(err) {
log.Printf("[WARN] QLDB Ledger %s not found, removing from state", d.Id())
Expand All @@ -141,16 +142,15 @@ func resourceLedgerRead(ctx context.Context, d *schema.ResourceData, meta interf
}

func resourceLedgerUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*conns.AWSClient).QLDBConn(ctx)
conn := meta.(*conns.AWSClient).QLDBClient(ctx)

if d.HasChange("permissions_mode") {
input := &qldb.UpdateLedgerPermissionsModeInput{
Name: aws.String(d.Id()),
PermissionsMode: aws.String(d.Get("permissions_mode").(string)),
PermissionsMode: types.PermissionsMode(d.Get("permissions_mode").(string)),
}

log.Printf("[INFO] Updating QLDB Ledger permissions mode: %s", input)
if _, err := conn.UpdateLedgerPermissionsModeWithContext(ctx, input); err != nil {
if _, err := conn.UpdateLedgerPermissionsMode(ctx, input); err != nil {
return diag.Errorf("updating QLDB Ledger (%s) permissions mode: %s", d.Id(), err)
}
}
Expand All @@ -165,8 +165,7 @@ func resourceLedgerUpdate(ctx context.Context, d *schema.ResourceData, meta inte
input.KmsKey = aws.String(d.Get("kms_key").(string))
}

log.Printf("[INFO] Updating QLDB Ledger: %s", input)
if _, err := conn.UpdateLedgerWithContext(ctx, input); err != nil {
if _, err := conn.UpdateLedger(ctx, input); err != nil {
return diag.Errorf("updating QLDB Ledger (%s): %s", d.Id(), err)
}
}
Expand All @@ -175,41 +174,40 @@ func resourceLedgerUpdate(ctx context.Context, d *schema.ResourceData, meta inte
}

func resourceLedgerDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*conns.AWSClient).QLDBConn(ctx)
conn := meta.(*conns.AWSClient).QLDBClient(ctx)

input := &qldb.DeleteLedgerInput{
Name: aws.String(d.Id()),
}

log.Printf("[INFO] Deleting QLDB Ledger: %s", d.Id())
_, err := tfresource.RetryWhenAWSErrCodeEquals(ctx, 5*time.Minute,
func() (interface{}, error) {
return conn.DeleteLedgerWithContext(ctx, input)
}, qldb.ErrCodeResourceInUseException)
_, err := tfresource.RetryWhenIsA[*types.ResourceInUseException](ctx, d.Timeout(schema.TimeoutDelete), func() (interface{}, error) {
return conn.DeleteLedger(ctx, input)
})

if tfawserr.ErrCodeEquals(err, qldb.ErrCodeResourceNotFoundException) {
if errs.IsA[*types.ResourceNotFoundException](err) {
return nil
}

if err != nil {
return diag.Errorf("deleting QLDB Ledger (%s): %s", d.Id(), err)
}

if _, err := waitLedgerDeleted(ctx, conn, d.Timeout(schema.TimeoutDelete), d.Id()); err != nil {
if _, err := waitLedgerDeleted(ctx, conn, d.Id(), d.Timeout(schema.TimeoutDelete)); err != nil {
return diag.Errorf("waiting for QLDB Ledger (%s) delete: %s", d.Id(), err)
}

return nil
}

func FindLedgerByName(ctx context.Context, conn *qldb.QLDB, name string) (*qldb.DescribeLedgerOutput, error) {
func findLedgerByName(ctx context.Context, conn *qldb.Client, name string) (*qldb.DescribeLedgerOutput, error) {
input := &qldb.DescribeLedgerInput{
Name: aws.String(name),
}

output, err := conn.DescribeLedgerWithContext(ctx, input)
output, err := conn.DescribeLedger(ctx, input)

if tfawserr.ErrCodeEquals(err, qldb.ErrCodeResourceNotFoundException) {
if errs.IsA[*types.ResourceNotFoundException](err) {
return nil, &retry.NotFoundError{
LastError: err,
LastRequest: input,
Expand All @@ -224,19 +222,19 @@ func FindLedgerByName(ctx context.Context, conn *qldb.QLDB, name string) (*qldb.
return nil, tfresource.NewEmptyResultError(input)
}

if state := aws.StringValue(output.State); state == qldb.LedgerStateDeleted {
if state := output.State; state == types.LedgerStateDeleted {
return nil, &retry.NotFoundError{
Message: state,
Message: string(state),
LastRequest: input,
}
}

return output, nil
}

func statusLedgerState(ctx context.Context, conn *qldb.QLDB, name string) retry.StateRefreshFunc {
func statusLedgerState(ctx context.Context, conn *qldb.Client, name string) retry.StateRefreshFunc {
return func() (interface{}, string, error) {
output, err := FindLedgerByName(ctx, conn, name)
output, err := findLedgerByName(ctx, conn, name)

if tfresource.NotFound(err) {
return nil, "", nil
Expand All @@ -246,14 +244,14 @@ func statusLedgerState(ctx context.Context, conn *qldb.QLDB, name string) retry.
return nil, "", err
}

return output, aws.StringValue(output.State), nil
return output, string(output.State), nil
}
}

func waitLedgerCreated(ctx context.Context, conn *qldb.QLDB, timeout time.Duration, name string) (*qldb.DescribeLedgerOutput, error) {
func waitLedgerCreated(ctx context.Context, conn *qldb.Client, name string, timeout time.Duration) (*qldb.DescribeLedgerOutput, error) {
stateConf := &retry.StateChangeConf{
Pending: []string{qldb.LedgerStateCreating},
Target: []string{qldb.LedgerStateActive},
Pending: enum.Slice(types.LedgerStateCreating),
Target: enum.Slice(types.LedgerStateActive),
Refresh: statusLedgerState(ctx, conn, name),
Timeout: timeout,
MinTimeout: 3 * time.Second,
Expand All @@ -268,9 +266,9 @@ func waitLedgerCreated(ctx context.Context, conn *qldb.QLDB, timeout time.Durati
return nil, err
}

func waitLedgerDeleted(ctx context.Context, conn *qldb.QLDB, timeout time.Duration, name string) (*qldb.DescribeLedgerOutput, error) {
func waitLedgerDeleted(ctx context.Context, conn *qldb.Client, name string, timeout time.Duration) (*qldb.DescribeLedgerOutput, error) {
stateConf := &retry.StateChangeConf{
Pending: []string{qldb.LedgerStateActive, qldb.LedgerStateDeleting},
Pending: enum.Slice(types.LedgerStateActive, types.LedgerStateDeleting),
Target: []string{},
Refresh: statusLedgerState(ctx, conn, name),
Timeout: timeout,
Expand Down
10 changes: 5 additions & 5 deletions internal/service/qldb/ledger_data_source.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"context"
"regexp"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go-v2/aws"
"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 All @@ -13,7 +13,7 @@ import (
)

// @SDKDataSource("aws_qldb_ledger")
func DataSourceLedger() *schema.Resource {
func dataSourceLedger() *schema.Resource {
return &schema.Resource{
ReadWithoutTimeout: dataSourceLedgerRead,

Expand Down Expand Up @@ -48,17 +48,17 @@ func DataSourceLedger() *schema.Resource {
}

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

name := d.Get("name").(string)
ledger, err := FindLedgerByName(ctx, conn, name)
ledger, err := findLedgerByName(ctx, conn, name)

if err != nil {
return diag.Errorf("reading QLDB Ledger (%s): %s", name, err)
}

d.SetId(aws.StringValue(ledger.Name))
d.SetId(aws.ToString(ledger.Name))
d.Set("arn", ledger.Arn)
d.Set("deletion_protection", ledger.DeletionProtection)
if ledger.EncryptionDescription != nil {
Expand Down
8 changes: 4 additions & 4 deletions internal/service/qldb/ledger_data_source_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import (
"fmt"
"testing"

"github.com/aws/aws-sdk-go/service/qldb"
sdkacctest "github.com/hashicorp/terraform-plugin-testing/helper/acctest"
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
"github.com/hashicorp/terraform-provider-aws/internal/acctest"
"github.com/hashicorp/terraform-provider-aws/names"
)

func TestAccQLDBLedgerDataSource_basic(t *testing.T) {
Expand All @@ -17,8 +17,8 @@ func TestAccQLDBLedgerDataSource_basic(t *testing.T) {
datasourceName := "data.aws_qldb_ledger.test"

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { acctest.PreCheck(ctx, t); acctest.PreCheckPartitionHasService(t, qldb.EndpointsID) },
ErrorCheck: acctest.ErrorCheck(t, qldb.EndpointsID),
PreCheck: func() { acctest.PreCheck(ctx, t); acctest.PreCheckPartitionHasService(t, names.QLDBEndpointID) },
ErrorCheck: acctest.ErrorCheck(t, names.QLDBEndpointID),
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
Steps: []resource.TestStep{
{
Expand All @@ -44,7 +44,7 @@ resource "aws_qldb_ledger" "test" {
deletion_protection = false

tags = {
Env = "test"
Name = %[1]q
}
}

Expand Down
Loading