Skip to content

Commit

Permalink
Merge pull request #40376 from bschaatsbergen/f/memorydb-multi-region
Browse files Browse the repository at this point in the history
memorydb: add new `multi_region_cluster` resource
  • Loading branch information
jar-b authored Dec 18, 2024
2 parents 3d299e2 + 27715d2 commit 75ebf25
Show file tree
Hide file tree
Showing 9 changed files with 1,350 additions and 15 deletions.
7 changes: 7 additions & 0 deletions .changelog/40376.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
```release-note:new-resource
aws_memorydb_multi_region_cluster
```

```release-note:enhancement
resource/aws_memorydb_cluster: Add `multi_region_cluster_name` argument
```
23 changes: 23 additions & 0 deletions internal/service/memorydb/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,11 @@ func resourceCluster() *schema.Resource {
Type: schema.TypeString,
Computed: true,
},
"multi_region_cluster_name": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
},
names.AttrEngine: {
Type: schema.TypeString,
Optional: true,
Expand Down Expand Up @@ -324,6 +329,10 @@ func resourceClusterCreate(ctx context.Context, d *schema.ResourceData, meta int
input.MaintenanceWindow = aws.String(v.(string))
}

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

if v, ok := d.GetOk(names.AttrParameterGroupName); ok {
input.ParameterGroupName = aws.String(v.(string))
}
Expand Down Expand Up @@ -368,6 +377,15 @@ func resourceClusterCreate(ctx context.Context, d *schema.ResourceData, meta int

d.SetId(name)

// If a multi-region cluster name is set, ensure the `aws_memorydb_multi_region_cluster`
// is created and available before proceeding with cluster creation.
// Otherwise, the cluster creation will fail.
if v, ok := d.GetOk("multi_region_cluster_name"); ok {
if _, err := waitMultiRegionClusterAvailable(ctx, conn, v.(string), d.Timeout(schema.TimeoutCreate)); err != nil {
return sdkdiag.AppendErrorf(diags, "waiting for MemoryDB Multi-Region Cluster (%s) create: %s", v.(string), err)
}
}

if _, err := waitClusterAvailable(ctx, conn, d.Id(), d.Timeout(schema.TimeoutCreate)); err != nil {
return sdkdiag.AppendErrorf(diags, "waiting for MemoryDB Cluster (%s) create: %s", d.Id(), err)
}
Expand Down Expand Up @@ -408,6 +426,7 @@ func resourceClusterRead(ctx context.Context, d *schema.ResourceData, meta inter
}
d.Set(names.AttrDescription, cluster.Description)
d.Set("engine_patch_version", cluster.EnginePatchVersion)
d.Set("multi_region_cluster_name", cluster.MultiRegionClusterName)
d.Set(names.AttrEngine, cluster.Engine)
d.Set(names.AttrEngineVersion, cluster.EngineVersion)
d.Set(names.AttrKMSKeyARN, cluster.KmsKeyId) // KmsKeyId is actually an ARN here.
Expand Down Expand Up @@ -561,6 +580,10 @@ func resourceClusterDelete(ctx context.Context, d *schema.ResourceData, meta int
ClusterName: aws.String(d.Id()),
}

if v := d.Get("multi_region_cluster_name"); v != nil && len(v.(string)) > 0 {
input.MultiRegionClusterName = aws.String(v.(string))
}

if v := d.Get("final_snapshot_name"); v != nil && len(v.(string)) > 0 {
input.FinalSnapshotName = aws.String(v.(string))
}
Expand Down
64 changes: 64 additions & 0 deletions internal/service/memorydb/cluster_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,34 @@ func TestAccMemoryDBCluster_create_withDataTiering(t *testing.T) {
})
}

func TestAccMemoryDBCluster_multiRegionClusterName(t *testing.T) {
ctx := acctest.Context(t)
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
resourceName := "aws_memorydb_cluster.test"
multiRegionClusterResourceName := "aws_memorydb_multi_region_cluster.test"

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { acctest.PreCheck(ctx, t); testAccPreCheck(t) },
ErrorCheck: acctest.ErrorCheck(t, names.MemoryDBServiceID),
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
CheckDestroy: testAccCheckClusterDestroy(ctx),
Steps: []resource.TestStep{
{
Config: testAccClusterConfig_multiRegionClusterName(rName),
Check: resource.ComposeTestCheckFunc(
testAccCheckClusterExists(ctx, resourceName),
resource.TestCheckResourceAttrPair(resourceName, "multi_region_cluster_name", multiRegionClusterResourceName, "multi_region_cluster_name"),
),
},
{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
}

func TestAccMemoryDBCluster_create_withKMS(t *testing.T) {
ctx := acctest.Context(t)
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
Expand Down Expand Up @@ -1371,6 +1399,42 @@ resource "aws_memorydb_cluster" "test" {
)
}

func testAccClusterConfig_multiRegionClusterName(rName string) string {
return acctest.ConfigCompose(
testAccClusterConfig_baseNetwork(rName),
testAccClusterConfig_baseUserAndACL(rName),
fmt.Sprintf(`
resource "aws_security_group" "test" {
name = %[1]q
vpc_id = aws_vpc.test.id
tags = {
Name = %[1]q
}
}
resource "aws_memorydb_multi_region_cluster" "test" {
multi_region_cluster_name_suffix = %[1]q
node_type = "db.r7g.xlarge"
num_shards = 2
}
resource "aws_memorydb_cluster" "test" {
acl_name = aws_memorydb_acl.test.id
auto_minor_version_upgrade = false
name = %[1]q
node_type = "db.r7g.xlarge"
num_shards = 2
security_group_ids = [aws_security_group.test.id]
snapshot_retention_limit = 7
subnet_group_name = aws_memorydb_subnet_group.test.id
multi_region_cluster_name = aws_memorydb_multi_region_cluster.test.multi_region_cluster_name
}
`, rName),
)
}

func testAccClusterConfig_kms(rName string) string {
return acctest.ConfigCompose(
testAccClusterConfig_baseNetwork(rName),
Expand Down
30 changes: 16 additions & 14 deletions internal/service/memorydb/exports_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,21 @@ package memorydb

// Exports for use in tests only.
var (
ResourceACL = resourceACL
ResourceCluster = resourceCluster
ResourceParameterGroup = resourceParameterGroup
ResourceSnapshot = resourceSnapshot
ResourceSubnetGroup = resourceSubnetGroup
ResourceUser = resourceUser
ResourceACL = resourceACL
ResourceCluster = resourceCluster
ResourceMultiRegionCluster = newMultiRegionClusterResource
ResourceParameterGroup = resourceParameterGroup
ResourceSnapshot = resourceSnapshot
ResourceSubnetGroup = resourceSubnetGroup
ResourceUser = resourceUser

FindACLByName = findACLByName
FindClusterByName = findClusterByName
FindParameterGroupByName = findParameterGroupByName
FindSnapshotByName = findSnapshotByName
FindSubnetGroupByName = findSubnetGroupByName
FindUserByName = findUserByName
ParameterChanges = parameterChanges
ParameterHash = parameterHash
FindACLByName = findACLByName
FindClusterByName = findClusterByName
FindMultiRegionClusterByName = findMultiRegionClusterByName
FindParameterGroupByName = findParameterGroupByName
FindSnapshotByName = findSnapshotByName
FindSubnetGroupByName = findSubnetGroupByName
FindUserByName = findUserByName
ParameterChanges = parameterChanges
ParameterHash = parameterHash
)
Loading

0 comments on commit 75ebf25

Please sign in to comment.