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

DynamoDB Replica - kms_key_arn support #18373

Merged
merged 35 commits into from
Apr 13, 2021
Merged
Show file tree
Hide file tree
Changes from 34 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
c25e6fb
DynamoDB Replica - kms_key_arn support
pmnathan Mar 24, 2021
0e49d0b
r/dynamodb_table: Sort args
YakDriver Apr 12, 2021
0fec060
add a test case for replica with cmk
hashitop Mar 19, 2021
a9b0c90
add a test case for replica with cmk
hashitop Mar 19, 2021
06f7304
r/dynamodb_table: Fix test formatting
YakDriver Apr 12, 2021
66b1f13
r/dynamodb_table: Lint
YakDriver Apr 12, 2021
e0df3d0
r/dynamodb_table: Lint
YakDriver Apr 12, 2021
fa6b5ec
structure: Remove dynamodb_table functions
YakDriver Apr 12, 2021
aa68479
r/dynamodb_table: Rename, organize
YakDriver Apr 12, 2021
345e905
ds/dynamodb_table: Change function name
YakDriver Apr 12, 2021
d6081b3
tests/r/dynamodb_table: Update function names
YakDriver Apr 12, 2021
2daee11
r/dynamodb_table: Fix replica flattener
YakDriver Apr 12, 2021
03c63a3
tests/r/dynamodb_table: Fix test names
YakDriver Apr 12, 2021
8aa6cca
tests/r/dynamodb_table: Add ErrorCheck
YakDriver Apr 12, 2021
7c5200e
r/dynamodb_table: Clean up replica creation
YakDriver Apr 12, 2021
3446cb1
r/dynamodb_table: Fix update error
YakDriver Apr 12, 2021
55a7db7
r/dynamodb_table: Use waiter consts
YakDriver Apr 12, 2021
b28761f
r/dynamodb_table: Start at tidying
YakDriver Apr 12, 2021
fffd794
tests/r/dynamodb_table: Fix expect error
YakDriver Apr 12, 2021
6f9c555
r/dynamodb_table: Use waiter, finder for delete
YakDriver Apr 12, 2021
fa4f0bc
r/dynamodb_table: Add replica to finder
YakDriver Apr 12, 2021
d7c2b3b
r/dynamodb_table: Use finder for replica
YakDriver Apr 12, 2021
7e33320
r/dynamodb_table: Move to finder, waiter
YakDriver Apr 12, 2021
05c424e
r/dynamodb_table: Replica status
YakDriver Apr 13, 2021
9db9e74
tests/r/dynamodb_table: Standardize tests
YakDriver Apr 13, 2021
94a86cc
r/dynamodb_table: Use waiters
YakDriver Apr 13, 2021
2bd676d
r/dynamodb_table: Move waiters to waiter package
YakDriver Apr 13, 2021
92729ac
r/dynamodb_table: Add finders
YakDriver Apr 13, 2021
8949a06
r/dynamodb_table: Add status checkers
YakDriver Apr 13, 2021
d54d7ee
r/dynamodb_table: Remove unused arg
YakDriver Apr 13, 2021
47c2289
r/dynamodb_table: Lint
YakDriver Apr 13, 2021
fa353ff
r/dynamodb_table: Adjust waiters
YakDriver Apr 13, 2021
17f913d
tests/r/dynamodb_table: Add sweeper concurrency
YakDriver Apr 13, 2021
500e31a
r/dynamodb_table: Concurrent replica delete
YakDriver Apr 13, 2021
bc707b9
r/dynamodb_table: Add changelog
YakDriver Apr 13, 2021
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
2 changes: 1 addition & 1 deletion aws/data_source_aws_dynamodb_table.go
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ func dataSourceAwsDynamoDbTableRead(d *schema.ResourceData, meta interface{}) er

d.SetId(aws.StringValue(result.Table.TableName))

err = flattenAwsDynamoDbTableResource(d, result.Table)
err = flattenDynamoDbTableResource(d, result.Table)
if err != nil {
return err
}
Expand Down
88 changes: 88 additions & 0 deletions aws/internal/service/dynamodb/finder/finder.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package finder

import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/dynamodb"
)

func DynamoDBTableByName(conn *dynamodb.DynamoDB, tableName string) (*dynamodb.TableDescription, error) {
input := &dynamodb.DescribeTableInput{
TableName: aws.String(tableName),
}

output, err := conn.DescribeTable(input)

if err != nil {
return nil, err
}

if output == nil || output.Table == nil {
return nil, nil
}

return output.Table, nil
}

func DynamoDBGSIByTableNameIndexName(conn *dynamodb.DynamoDB, tableName, indexName string) (*dynamodb.GlobalSecondaryIndexDescription, error) {
table, err := DynamoDBTableByName(conn, tableName)

if err != nil {
return nil, err
}

if table == nil {
return nil, nil
}

for _, gsi := range table.GlobalSecondaryIndexes {
if aws.StringValue(gsi.IndexName) == indexName {
return gsi, nil
}
}

return nil, nil
}

func DynamoDBPITRDescriptionByTableName(conn *dynamodb.DynamoDB, tableName string) (*dynamodb.PointInTimeRecoveryDescription, error) {
input := &dynamodb.DescribeContinuousBackupsInput{
TableName: aws.String(tableName),
}

output, err := conn.DescribeContinuousBackups(input)

if err != nil {
return nil, err
}

if output == nil {
return nil, nil
}

if output.ContinuousBackupsDescription == nil || output.ContinuousBackupsDescription.PointInTimeRecoveryDescription == nil {
return nil, nil
}

return output.ContinuousBackupsDescription.PointInTimeRecoveryDescription, nil
}

func DynamoDBTTLRDescriptionByTableName(conn *dynamodb.DynamoDB, tableName string) (*dynamodb.TimeToLiveDescription, error) {
input := &dynamodb.DescribeTimeToLiveInput{
TableName: aws.String(tableName),
}

output, err := conn.DescribeTimeToLive(input)

if err != nil {
return nil, err
}

if output == nil {
return nil, nil
}

if output.TimeToLiveDescription == nil {
return nil, nil
}

return output.TimeToLiveDescription, nil
}
170 changes: 170 additions & 0 deletions aws/internal/service/dynamodb/waiter/status.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
package waiter

import (
"log"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/dynamodb"
"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/dynamodb/finder"
)

func DynamoDBTableStatus(conn *dynamodb.DynamoDB, tableName string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
table, err := finder.DynamoDBTableByName(conn, tableName)

if tfawserr.ErrCodeEquals(err, dynamodb.ErrCodeResourceNotFoundException) {
return nil, "", nil
}

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

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

return table, aws.StringValue(table.TableStatus), nil
}
}

func DynamoDBReplicaUpdate(conn *dynamodb.DynamoDB, tableName, region string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
result, err := conn.DescribeTable(&dynamodb.DescribeTableInput{
TableName: aws.String(tableName),
})
if err != nil {
return 42, "", err
}
log.Printf("[DEBUG] DynamoDB replicas: %s", result.Table.Replicas)

var targetReplica *dynamodb.ReplicaDescription

for _, replica := range result.Table.Replicas {
if aws.StringValue(replica.RegionName) == region {
targetReplica = replica
break
}
}

if targetReplica == nil {
return result, dynamodb.ReplicaStatusCreating, nil
}

return result, aws.StringValue(targetReplica.ReplicaStatus), nil
}
}

func DynamoDBReplicaDelete(conn *dynamodb.DynamoDB, tableName, region string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
result, err := conn.DescribeTable(&dynamodb.DescribeTableInput{
TableName: aws.String(tableName),
})
if err != nil {
return 42, "", err
}

log.Printf("[DEBUG] all replicas for waiting: %s", result.Table.Replicas)
var targetReplica *dynamodb.ReplicaDescription

for _, replica := range result.Table.Replicas {
if aws.StringValue(replica.RegionName) == region {
targetReplica = replica
break
}
}

if targetReplica == nil {
return result, "", nil
}

return result, aws.StringValue(targetReplica.ReplicaStatus), nil
}
}

func DynamoDBGSIStatus(conn *dynamodb.DynamoDB, tableName, indexName string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
gsi, err := finder.DynamoDBGSIByTableNameIndexName(conn, tableName, indexName)

if tfawserr.ErrCodeEquals(err, dynamodb.ErrCodeResourceNotFoundException) {
return nil, "", nil
}

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

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

return gsi, aws.StringValue(gsi.IndexStatus), nil
}
}

func DynamoDBPITRStatus(conn *dynamodb.DynamoDB, tableName string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
pitr, err := finder.DynamoDBPITRDescriptionByTableName(conn, tableName)

if tfawserr.ErrCodeEquals(err, dynamodb.ErrCodeResourceNotFoundException) {
return nil, "", nil
}

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

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

return pitr, aws.StringValue(pitr.PointInTimeRecoveryStatus), nil
}
}

func DynamoDBTTLStatus(conn *dynamodb.DynamoDB, tableName string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
ttl, err := finder.DynamoDBTTLRDescriptionByTableName(conn, tableName)

if tfawserr.ErrCodeEquals(err, dynamodb.ErrCodeResourceNotFoundException) {
return nil, "", nil
}

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

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

return ttl, aws.StringValue(ttl.TimeToLiveStatus), nil
}
}

func DynamoDBTableSESStatus(conn *dynamodb.DynamoDB, tableName string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
table, err := finder.DynamoDBTableByName(conn, tableName)

if tfawserr.ErrCodeEquals(err, dynamodb.ErrCodeResourceNotFoundException) {
return nil, "", nil
}

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

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

// Disabling SSE returns null SSEDescription
if table.SSEDescription == nil {
return table, dynamodb.SSEStatusDisabled, nil
}

return table, aws.StringValue(table.SSEDescription.Status), nil
}
}
Loading