Skip to content

Commit 6ff1f0b

Browse files
committed
Add RDS Aurora Global Cluster Data Source
Unfortunately, I created this before seeing that #37286 existed. However it is currently out of sync, so perhaps this is still warranted. I did start with the latest framework type coming from skaff, but had some issues with tagging, and thought it would be better to keep consistent with the matching resource anyway, so the sdk type is used here. References: - #13289 - #20171
1 parent 03b9e41 commit 6ff1f0b

File tree

5 files changed

+293
-0
lines changed

5 files changed

+293
-0
lines changed

.changelog/41668.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:new-data-source
2+
aws_rds_global_cluster
3+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
4+
package rds
5+
6+
import (
7+
"context"
8+
"strings"
9+
10+
"github.com/aws/aws-sdk-go-v2/aws"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
12+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
13+
"github.com/hashicorp/terraform-provider-aws/internal/conns"
14+
"github.com/hashicorp/terraform-provider-aws/internal/errs/sdkdiag"
15+
tftags "github.com/hashicorp/terraform-provider-aws/internal/tags"
16+
"github.com/hashicorp/terraform-provider-aws/names"
17+
)
18+
19+
// @SDKDataSource("aws_rds_global_cluster", name="Global Cluster")
20+
func DataSourceGlobalCluster() *schema.Resource {
21+
return &schema.Resource{
22+
ReadWithoutTimeout: dataSourceGlobalClusterRead,
23+
24+
Schema: map[string]*schema.Schema{
25+
names.AttrARN: {
26+
Type: schema.TypeString,
27+
Computed: true,
28+
},
29+
names.AttrDatabaseName: {
30+
Type: schema.TypeString,
31+
Computed: true,
32+
},
33+
names.AttrDeletionProtection: {
34+
Type: schema.TypeBool,
35+
Computed: true,
36+
},
37+
names.AttrEndpoint: {
38+
Type: schema.TypeString,
39+
Computed: true,
40+
},
41+
names.AttrEngine: {
42+
Type: schema.TypeString,
43+
Computed: true,
44+
},
45+
"engine_lifecycle_support": {
46+
Type: schema.TypeString,
47+
Computed: true,
48+
},
49+
names.AttrEngineVersion: {
50+
Type: schema.TypeString,
51+
Computed: true,
52+
},
53+
"engine_version_actual": {
54+
Type: schema.TypeString,
55+
Computed: true,
56+
},
57+
"global_cluster_identifier": {
58+
Type: schema.TypeString,
59+
Required: true,
60+
},
61+
"global_cluster_members": {
62+
Type: schema.TypeSet,
63+
Computed: true,
64+
Elem: &schema.Resource{
65+
Schema: map[string]*schema.Schema{
66+
"db_cluster_arn": {
67+
Type: schema.TypeString,
68+
Computed: true,
69+
},
70+
"is_writer": {
71+
Type: schema.TypeBool,
72+
Computed: true,
73+
},
74+
},
75+
},
76+
},
77+
"global_cluster_resource_id": {
78+
Type: schema.TypeString,
79+
Computed: true,
80+
},
81+
names.AttrStorageEncrypted: {
82+
Type: schema.TypeBool,
83+
Computed: true,
84+
},
85+
names.AttrTags: tftags.TagsSchemaComputed(),
86+
},
87+
}
88+
}
89+
90+
func dataSourceGlobalClusterRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
91+
var diags diag.Diagnostics
92+
conn := meta.(*conns.AWSClient).RDSClient(ctx)
93+
94+
globalClusterID := d.Get("global_cluster_identifier").(string)
95+
globalCluster, err := findGlobalClusterByID(ctx, conn, globalClusterID)
96+
97+
if err != nil {
98+
return sdkdiag.AppendErrorf(diags, "reading RDS Global Cluster (%s): %s", globalClusterID, err)
99+
}
100+
101+
d.SetId(aws.ToString(globalCluster.GlobalClusterIdentifier))
102+
d.Set(names.AttrARN, globalCluster.GlobalClusterArn)
103+
d.Set(names.AttrDatabaseName, globalCluster.DatabaseName)
104+
d.Set(names.AttrDeletionProtection, globalCluster.DeletionProtection)
105+
d.Set(names.AttrEndpoint, globalCluster.Endpoint)
106+
d.Set(names.AttrEngine, globalCluster.Engine)
107+
d.Set("engine_lifecycle_support", globalCluster.EngineLifecycleSupport)
108+
d.Set("global_cluster_identifier", globalCluster.GlobalClusterIdentifier)
109+
if err := d.Set("global_cluster_members", flattenGlobalClusterMembers(globalCluster.GlobalClusterMembers)); err != nil {
110+
return sdkdiag.AppendErrorf(diags, "setting global_cluster_members: %s", err)
111+
}
112+
d.Set("global_cluster_resource_id", globalCluster.GlobalClusterResourceId)
113+
d.Set(names.AttrStorageEncrypted, globalCluster.StorageEncrypted)
114+
115+
oldEngineVersion, newEngineVersion := d.Get(names.AttrEngineVersion).(string), aws.ToString(globalCluster.EngineVersion)
116+
117+
// For example a configured engine_version of "5.6.10a" and a returned engine_version of "5.6.global_10a".
118+
if oldParts, newParts := strings.Split(oldEngineVersion, "."), strings.Split(newEngineVersion, "."); len(oldParts) == 3 &&
119+
len(newParts) == 3 &&
120+
oldParts[0] == newParts[0] &&
121+
oldParts[1] == newParts[1] &&
122+
strings.HasSuffix(newParts[2], oldParts[2]) {
123+
d.Set(names.AttrEngineVersion, oldEngineVersion)
124+
d.Set("engine_version_actual", newEngineVersion)
125+
} else {
126+
d.Set(names.AttrEngineVersion, newEngineVersion)
127+
d.Set("engine_version_actual", newEngineVersion)
128+
}
129+
130+
// Use the same approach as the resource for setting tags
131+
setTagsOut(ctx, globalCluster.TagList)
132+
133+
return diags
134+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
4+
package rds_test
5+
6+
import (
7+
"fmt"
8+
"testing"
9+
10+
sdkacctest "github.com/hashicorp/terraform-plugin-testing/helper/acctest"
11+
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
12+
"github.com/hashicorp/terraform-provider-aws/internal/acctest"
13+
"github.com/hashicorp/terraform-provider-aws/names"
14+
)
15+
16+
func TestAccRDSGlobalClusterDataSource_basic(t *testing.T) {
17+
ctx := acctest.Context(t)
18+
dataSourceName := "data.aws_rds_global_cluster.test"
19+
resourceName := "aws_rds_global_cluster.test"
20+
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
21+
22+
resource.ParallelTest(t, resource.TestCase{
23+
PreCheck: func() { acctest.PreCheck(ctx, t); testAccPreCheckGlobalCluster(ctx, t) },
24+
ErrorCheck: acctest.ErrorCheck(t, names.RDSServiceID),
25+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
26+
Steps: []resource.TestStep{
27+
{
28+
Config: testAccGlobalClusterDataSourceConfig_basic(rName),
29+
Check: resource.ComposeAggregateTestCheckFunc(
30+
resource.TestCheckResourceAttrPair(dataSourceName, names.AttrARN, resourceName, names.AttrARN),
31+
resource.TestCheckResourceAttrPair(dataSourceName, names.AttrDatabaseName, resourceName, names.AttrDatabaseName),
32+
resource.TestCheckResourceAttrPair(dataSourceName, names.AttrDeletionProtection, resourceName, names.AttrDeletionProtection),
33+
resource.TestCheckResourceAttrPair(dataSourceName, names.AttrEndpoint, resourceName, names.AttrEndpoint),
34+
resource.TestCheckResourceAttrPair(dataSourceName, names.AttrEngine, resourceName, names.AttrEngine),
35+
resource.TestCheckResourceAttrPair(dataSourceName, "engine_lifecycle_support", resourceName, "engine_lifecycle_support"),
36+
resource.TestCheckResourceAttrPair(dataSourceName, names.AttrEngineVersion, resourceName, names.AttrEngineVersion),
37+
resource.TestCheckResourceAttrPair(dataSourceName, "engine_version_actual", resourceName, "engine_version_actual"),
38+
resource.TestCheckResourceAttrPair(dataSourceName, "global_cluster_identifier", resourceName, "global_cluster_identifier"),
39+
resource.TestCheckResourceAttrPair(dataSourceName, "global_cluster_members.#", resourceName, "global_cluster_members.#"),
40+
resource.TestCheckResourceAttrPair(dataSourceName, "global_cluster_resource_id", resourceName, "global_cluster_resource_id"),
41+
resource.TestCheckResourceAttrPair(dataSourceName, names.AttrStorageEncrypted, resourceName, names.AttrStorageEncrypted),
42+
),
43+
},
44+
},
45+
})
46+
}
47+
48+
func TestAccRDSGlobalClusterDataSource_withTags(t *testing.T) {
49+
ctx := acctest.Context(t)
50+
dataSourceName := "data.aws_rds_global_cluster.test"
51+
resourceName := "aws_rds_global_cluster.test"
52+
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
53+
54+
resource.ParallelTest(t, resource.TestCase{
55+
PreCheck: func() { acctest.PreCheck(ctx, t); testAccPreCheckGlobalCluster(ctx, t) },
56+
ErrorCheck: acctest.ErrorCheck(t, names.RDSServiceID),
57+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
58+
Steps: []resource.TestStep{
59+
{
60+
Config: testAccGlobalClusterDataSourceConfig_tags(rName),
61+
Check: resource.ComposeAggregateTestCheckFunc(
62+
resource.TestCheckResourceAttrPair(dataSourceName, names.AttrARN, resourceName, names.AttrARN),
63+
resource.TestCheckResourceAttrPair(dataSourceName, "global_cluster_identifier", resourceName, "global_cluster_identifier"),
64+
resource.TestCheckResourceAttrPair(dataSourceName, names.AttrTags, resourceName, names.AttrTags),
65+
),
66+
},
67+
},
68+
})
69+
}
70+
71+
func testAccGlobalClusterDataSourceConfig_basic(rName string) string {
72+
return fmt.Sprintf(`
73+
resource "aws_rds_global_cluster" "test" {
74+
global_cluster_identifier = %[1]q
75+
engine = "aurora-postgresql"
76+
}
77+
78+
data "aws_rds_global_cluster" "test" {
79+
global_cluster_identifier = aws_rds_global_cluster.test.global_cluster_identifier
80+
}
81+
`, rName)
82+
}
83+
84+
func testAccGlobalClusterDataSourceConfig_tags(rName string) string {
85+
return fmt.Sprintf(`
86+
resource "aws_rds_global_cluster" "test" {
87+
global_cluster_identifier = %[1]q
88+
engine = "aurora-postgresql"
89+
90+
tags = {
91+
Name = %[1]q
92+
Key1 = "Value1"
93+
Key2 = "Value2"
94+
}
95+
}
96+
97+
data "aws_rds_global_cluster" "test" {
98+
global_cluster_identifier = aws_rds_global_cluster.test.global_cluster_identifier
99+
}
100+
`, rName)
101+
}

internal/service/rds/service_package_gen.go

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
---
2+
subcategory: "RDS (Relational Database)"
3+
layout: "aws"
4+
page_title: "AWS: aws_rds_global_cluster"
5+
description: |-
6+
Terraform data source for retrieving information about an AWS RDS Global Cluster.
7+
---
8+
9+
# Data Source: aws_rds_global_cluster
10+
11+
Terraform data source for retrieving information about an AWS RDS Global Cluster.
12+
13+
## Example Usage
14+
15+
```terraform
16+
data "aws_rds_global_cluster" "example" {
17+
global_cluster_identifier = "example-global-cluster"
18+
}
19+
```
20+
21+
## Argument Reference
22+
23+
The following arguments are required:
24+
25+
* `global_cluster_identifier` - (Required) Identifier of the RDS Global Cluster.
26+
27+
## Attribute Reference
28+
29+
This data source exports the following attributes in addition to the arguments above:
30+
31+
* `arn` - ARN of the RDS Global Cluster.
32+
* `database_name` - Name of the database.
33+
* `deletion_protection` - Whether the Global Cluster has deletion protection enabled.
34+
* `endpoint` - Writer endpoint for the RDS Global Cluster.
35+
* `engine` - Database engine used by the Global Cluster (e.g., `aurora`, `aurora-mysql`, `aurora-postgresql`).
36+
* `engine_lifecycle_support` - Lifecycle support state for the cluster's engine.
37+
* `engine_version` - Engine version of the Aurora global database.
38+
* `engine_version_actual` - Full engine version information, containing version number and additional details.
39+
* `global_cluster_members` - Set of global cluster members (RDS Clusters) that are part of this global cluster. Detailed below.
40+
* `global_cluster_resource_id` - Immutable identifier assigned by AWS for the global cluster.
41+
* `id` - Identifier of the RDS Global Cluster.
42+
* `storage_encrypted` - Whether the Global Cluster is encrypted.
43+
* `tags` - Map of tags assigned to the Global Cluster.
44+
45+
### global_cluster_members
46+
47+
The `global_cluster_members` attribute has these exported attributes:
48+
49+
* `db_cluster_arn` - ARN of the RDS Cluster.
50+
* `is_writer` - Whether the RDS Cluster is the primary/writer cluster.

0 commit comments

Comments
 (0)