Skip to content

Commit d605b97

Browse files
authored
Merge pull request #34848 from hsiam261/throw-error-if-import-failed
Wait for import to complete during dynamodb table creation
2 parents d17b3be + 13fc877 commit d605b97

File tree

4 files changed

+50
-1
lines changed

4 files changed

+50
-1
lines changed

.changelog/34848.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:bug
2+
resource/aws_dynamodb_table: Fix error when waiting for snapshot to be created
3+
```

internal/service/dynamodb/status.go

+19
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,25 @@ func statusTable(ctx context.Context, conn *dynamodb.DynamoDB, tableName string)
4949
}
5050
}
5151

52+
func statusImport(ctx context.Context, conn *dynamodb.DynamoDB, importArn string) retry.StateRefreshFunc {
53+
return func() (interface{}, string, error) {
54+
describeImportInput := &dynamodb.DescribeImportInput{
55+
ImportArn: &importArn,
56+
}
57+
output, err := conn.DescribeImportWithContext(ctx, describeImportInput)
58+
59+
if tfawserr.ErrCodeEquals(err, dynamodb.ErrCodeResourceNotFoundException) {
60+
return nil, "", nil
61+
}
62+
63+
if err != nil {
64+
return nil, "", err
65+
}
66+
67+
return output, aws.StringValue(output.ImportTableDescription.ImportStatus), nil
68+
}
69+
}
70+
5271
func statusReplicaUpdate(ctx context.Context, conn *dynamodb.DynamoDB, tableName, region string) retry.StateRefreshFunc {
5372
return func() (interface{}, string, error) {
5473
result, err := conn.DescribeTableWithContext(ctx, &dynamodb.DescribeTableInput{

internal/service/dynamodb/table.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,7 @@ func resourceTableCreate(ctx context.Context, d *schema.ResourceData, meta inter
602602

603603
input.TableCreationParameters = tcp
604604

605-
_, err := tfresource.RetryWhen(ctx, createTableTimeout, func() (interface{}, error) {
605+
importTableOutput, err := tfresource.RetryWhen(ctx, createTableTimeout, func() (interface{}, error) {
606606
return conn.ImportTableWithContext(ctx, input)
607607
}, func(err error) (bool, error) {
608608
if tfawserr.ErrCodeEquals(err, "ThrottlingException") {
@@ -621,6 +621,12 @@ func resourceTableCreate(ctx context.Context, d *schema.ResourceData, meta inter
621621
if err != nil {
622622
return create.AppendDiagError(diags, names.DynamoDB, create.ErrActionCreating, ResNameTable, tableName, err)
623623
}
624+
625+
importArn := importTableOutput.(*dynamodb.ImportTableOutput).ImportTableDescription.ImportArn
626+
if _, err = waitImportComplete(ctx, conn, aws.StringValue(importArn), d.Timeout(schema.TimeoutCreate)); err != nil {
627+
d.SetId(tableName)
628+
return create.AppendDiagError(diags, names.DynamoDB, create.ErrActionCreating, ResNameTable, tableName, err)
629+
}
624630
} else {
625631
input := &dynamodb.CreateTableInput{
626632
BillingMode: aws.String(d.Get("billing_mode").(string)),

internal/service/dynamodb/wait.go

+21
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,27 @@ func waitTableActive(ctx context.Context, conn *dynamodb.DynamoDB, tableName str
7777
return nil, err
7878
}
7979

80+
func waitImportComplete(ctx context.Context, conn *dynamodb.DynamoDB, importArn string, timeout time.Duration) (*dynamodb.DescribeImportOutput, error) {
81+
stateConf := &retry.StateChangeConf{
82+
Pending: []string{dynamodb.ImportStatusInProgress},
83+
Target: []string{dynamodb.ImportStatusCompleted},
84+
Timeout: maxDuration(createTableTimeout, timeout),
85+
Refresh: statusImport(ctx, conn, importArn),
86+
}
87+
88+
outputRaw, err := stateConf.WaitForStateContext(ctx)
89+
90+
if err != nil {
91+
err = fmt.Errorf("ImportArn %q : %w", importArn, err)
92+
}
93+
94+
if output, ok := outputRaw.(*dynamodb.DescribeImportOutput); ok {
95+
return output, err
96+
}
97+
98+
return nil, err
99+
}
100+
80101
func waitTableDeleted(ctx context.Context, conn *dynamodb.DynamoDB, tableName string, timeout time.Duration) (*dynamodb.TableDescription, error) {
81102
stateConf := &retry.StateChangeConf{
82103
Pending: []string{dynamodb.TableStatusActive, dynamodb.TableStatusDeleting},

0 commit comments

Comments
 (0)