From a79bc88452acf222876bbec052092397c144c220 Mon Sep 17 00:00:00 2001 From: Conor Mongey Date: Mon, 12 Dec 2022 15:53:45 +0000 Subject: [PATCH 1/6] Add aws_db_instances data source --- internal/provider/provider.go | 1 + internal/service/rds/instances_data_source.go | 78 +++++++++++++++++ .../service/rds/instances_data_source_test.go | 83 +++++++++++++++++++ 3 files changed, 162 insertions(+) create mode 100644 internal/service/rds/instances_data_source.go create mode 100644 internal/service/rds/instances_data_source_test.go diff --git a/internal/provider/provider.go b/internal/provider/provider.go index c507389c1e4b..69f03968010b 100644 --- a/internal/provider/provider.go +++ b/internal/provider/provider.go @@ -837,6 +837,7 @@ func New(_ context.Context) (*schema.Provider, error) { "aws_db_cluster_snapshot": rds.DataSourceClusterSnapshot(), "aws_db_event_categories": rds.DataSourceEventCategories(), "aws_db_instance": rds.DataSourceInstance(), + "aws_db_instances": rds.DataSourceInstances(), "aws_db_proxy": rds.DataSourceProxy(), "aws_db_snapshot": rds.DataSourceSnapshot(), "aws_db_subnet_group": rds.DataSourceSubnetGroup(), diff --git a/internal/service/rds/instances_data_source.go b/internal/service/rds/instances_data_source.go new file mode 100644 index 000000000000..d308f5536cf7 --- /dev/null +++ b/internal/service/rds/instances_data_source.go @@ -0,0 +1,78 @@ +package rds + +import ( + "context" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/rds" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-provider-aws/internal/conns" + "github.com/hashicorp/terraform-provider-aws/internal/create" + "github.com/hashicorp/terraform-provider-aws/internal/generate/namevaluesfilters" + "github.com/hashicorp/terraform-provider-aws/names" +) + +func DataSourceInstances() *schema.Resource { + return &schema.Resource{ + ReadWithoutTimeout: dataSourceInstancesRead, + + Schema: map[string]*schema.Schema{ + "instance_arns": { + Type: schema.TypeSet, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + "instance_identifiers": { + Type: schema.TypeSet, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + "filter": namevaluesfilters.Schema(), + }, + } +} + +const ( + DSNameInstances = "Instances Data Source" +) + +func dataSourceInstancesRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + conn := meta.(*conns.AWSClient).RDSConn + + input := &rds.DescribeDBInstancesInput{} + + if v, ok := d.GetOk("filter"); ok { + input.Filters = namevaluesfilters.New(v.(*schema.Set)).RDSFilters() + } + + var instanceArns []string + var instanceIdentifiers []string + + err := conn.DescribeDBInstancesPagesWithContext(ctx, input, func(page *rds.DescribeDBInstancesOutput, lastPage bool) bool { + if page == nil { + return !lastPage + } + + for _, dbInstance := range page.DBInstances { + if dbInstance == nil { + continue + } + + instanceArns = append(instanceArns, aws.StringValue(dbInstance.DBInstanceArn)) + instanceIdentifiers = append(instanceIdentifiers, aws.StringValue(dbInstance.DBInstanceIdentifier)) + } + + return !lastPage + }) + + if err != nil { + return create.DiagError(names.RDS, create.ErrActionReading, DSNameInstances, "", err) + } + + d.SetId(meta.(*conns.AWSClient).Region) + d.Set("instance_arns", instanceArns) + d.Set("instance_identifiers", instanceIdentifiers) + + return nil +} diff --git a/internal/service/rds/instances_data_source_test.go b/internal/service/rds/instances_data_source_test.go new file mode 100644 index 000000000000..7fe1de5bbf9c --- /dev/null +++ b/internal/service/rds/instances_data_source_test.go @@ -0,0 +1,83 @@ +package rds_test + +import ( + "fmt" + "testing" + + "github.com/aws/aws-sdk-go/service/rds" + sdkacctest "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-provider-aws/internal/acctest" +) + +func TestAccRDSInstancesDataSource_filter(t *testing.T) { + var dbInstance rds.DBInstance + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + dataSourceName := "data.aws_db_instances.test" + resourceName := "aws_db_instance.test" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(t) }, + ErrorCheck: acctest.ErrorCheck(t, rds.EndpointsID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + CheckDestroy: testAccCheckInstanceDestroy, + Steps: []resource.TestStep{ + { + Config: testAccInstancesDataSourceConfig_filter(rName), + Check: resource.ComposeTestCheckFunc( + testAccCheckInstanceExists(resourceName, &dbInstance), + resource.TestCheckResourceAttr(dataSourceName, "instance_arns.#", "1"), + resource.TestCheckResourceAttrPair(dataSourceName, "instance_arns.0", resourceName, "arn"), + resource.TestCheckResourceAttr(dataSourceName, "instance_identifiers.#", "1"), + resource.TestCheckResourceAttrPair(dataSourceName, "instance_identifiers.0", resourceName, "identifier"), + ), + }, + }, + }) +} + +func testAccInstancesDataSourceConfig_filter(rName string) string { + return fmt.Sprintf(` +data "aws_rds_engine_version" "default" { + engine = "postgres" +} + +resource "aws_db_instance" "test" { + identifier = %[1]q + allocated_storage = 10 + engine = data.aws_rds_engine_version.default.engine + engine_version = data.aws_rds_engine_version.default.version + instance_class = "db.t4g.micro" + db_name = "test" + password = "avoid-plaintext-passwords" + username = "tfacctest" + parameter_group_name = "default.${data.aws_rds_engine_version.default.parameter_group_family}" + skip_final_snapshot = true + + apply_immediately = true +} + +resource "aws_db_instance" "wrong" { + identifier = "wrong-%[1]s" + allocated_storage = 10 + engine = data.aws_rds_engine_version.default.engine + engine_version = data.aws_rds_engine_version.default.version + instance_class = "db.t4g.micro" + db_name = "test" + password = "avoid-plaintext-passwords" + username = "tfacctest" + parameter_group_name = "default.${data.aws_rds_engine_version.default.parameter_group_family}" + skip_final_snapshot = true + + apply_immediately = true +} + + +data "aws_db_instances" "test" { + filter { + name = "db-instance-id" + values = [aws_db_instance.test.identifier] + } +} +`, rName) +} From c730194623c194586c963aaac4dc5221a51110e4 Mon Sep 17 00:00:00 2001 From: Conor Mongey Date: Mon, 12 Dec 2022 16:00:20 +0000 Subject: [PATCH 2/6] Add changelog entry --- .changelog/28303.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/28303.txt diff --git a/.changelog/28303.txt b/.changelog/28303.txt new file mode 100644 index 000000000000..ee1a65c426eb --- /dev/null +++ b/.changelog/28303.txt @@ -0,0 +1,3 @@ +```release-note:new-data-source +aws_db_instances +``` From b0a803b8e828fc6cbfefd13813e6582f7e723bad Mon Sep 17 00:00:00 2001 From: Conor Mongey Date: Mon, 12 Dec 2022 16:00:49 +0000 Subject: [PATCH 3/6] lint --- internal/service/rds/instances_data_source_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/service/rds/instances_data_source_test.go b/internal/service/rds/instances_data_source_test.go index 7fe1de5bbf9c..3615df40bbd3 100644 --- a/internal/service/rds/instances_data_source_test.go +++ b/internal/service/rds/instances_data_source_test.go @@ -58,7 +58,7 @@ resource "aws_db_instance" "test" { } resource "aws_db_instance" "wrong" { - identifier = "wrong-%[1]s" + identifier = "wrong-%[1]s" allocated_storage = 10 engine = data.aws_rds_engine_version.default.engine engine_version = data.aws_rds_engine_version.default.version From 7f8aa2493f54e94cb366c3bf859d2c0c389a0ac9 Mon Sep 17 00:00:00 2001 From: Conor Mongey Date: Mon, 12 Dec 2022 16:25:00 +0000 Subject: [PATCH 4/6] Add docs for d/aws_db_instances --- website/docs/d/db_instances.html.markdown | 44 +++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 website/docs/d/db_instances.html.markdown diff --git a/website/docs/d/db_instances.html.markdown b/website/docs/d/db_instances.html.markdown new file mode 100644 index 000000000000..5f7b650f8a78 --- /dev/null +++ b/website/docs/d/db_instances.html.markdown @@ -0,0 +1,44 @@ +--- +subcategory: "RDS (Relational Database)" +layout: "aws" +page_title: "AWS: aws_rds_instances" +description: |- + Terraform data source for managing an AWS RDS (Relational Database) Clusters. +--- + +# Data Source: aws_rds_instances + +Terraform data source for managing an AWS RDS (Relational Database) Clusters. + +## Example Usage + +### Basic Usage + +```terraform +data "aws_rds_instances" "example" { + filter { + name = "db-instance-id" + values = ["my-database-id"] + } +} +``` + +## Argument Reference + +The following arguments are optional: + +* `filter` - (Optional) Configuration block(s) for filtering. Detailed below. + +### filter Configuration block + +The following arguments are supported by the `filter` configuration block: + +* `name` - (Required) Name of the filter field. Valid values can be found in the [RDS DescribeDBClusters API Reference](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBClusters.html). +* `values` - (Required) Set of values that are accepted for the given filter field. Results will be selected if any given value matches. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `instance_arns` - Set of instance ARNs of the matched RDS instances. +* `instance_identifiers` - Set of ARNs of instance identifiers of the matched RDS instances. From a69e8cfdf4dde304c429411be6c2d578ffdc3e11 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Tue, 13 Dec 2022 08:52:35 -0500 Subject: [PATCH 5/6] d/aws_db_instances: Documentation corrections. --- website/docs/d/db_instances.html.markdown | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/website/docs/d/db_instances.html.markdown b/website/docs/d/db_instances.html.markdown index 5f7b650f8a78..4e947a8ebdeb 100644 --- a/website/docs/d/db_instances.html.markdown +++ b/website/docs/d/db_instances.html.markdown @@ -1,21 +1,21 @@ --- subcategory: "RDS (Relational Database)" layout: "aws" -page_title: "AWS: aws_rds_instances" +page_title: "AWS: aws_db_instances" description: |- - Terraform data source for managing an AWS RDS (Relational Database) Clusters. + Terraform data source for listing RDS Database Instances. --- -# Data Source: aws_rds_instances +# Data Source: aws_db_instances -Terraform data source for managing an AWS RDS (Relational Database) Clusters. +Terraform data source for listing RDS Database Instances. ## Example Usage ### Basic Usage ```terraform -data "aws_rds_instances" "example" { +data "aws_db_instances" "example" { filter { name = "db-instance-id" values = ["my-database-id"] @@ -40,5 +40,5 @@ The following arguments are supported by the `filter` configuration block: In addition to all arguments above, the following attributes are exported: -* `instance_arns` - Set of instance ARNs of the matched RDS instances. -* `instance_identifiers` - Set of ARNs of instance identifiers of the matched RDS instances. +* `instance_arns` - ARNs of the matched RDS instances. +* `instance_identifiers` - Identifiers of the matched RDS instances. From 2cf15ba17e87f8f71415d430ad3a99600e1440e6 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Tue, 13 Dec 2022 08:53:02 -0500 Subject: [PATCH 6/6] d/aws_db_instances: TypeSet -> TypeList. --- internal/service/rds/instances_data_source.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/internal/service/rds/instances_data_source.go b/internal/service/rds/instances_data_source.go index d308f5536cf7..f6c1118599df 100644 --- a/internal/service/rds/instances_data_source.go +++ b/internal/service/rds/instances_data_source.go @@ -19,12 +19,12 @@ func DataSourceInstances() *schema.Resource { Schema: map[string]*schema.Schema{ "instance_arns": { - Type: schema.TypeSet, + Type: schema.TypeList, Computed: true, Elem: &schema.Schema{Type: schema.TypeString}, }, "instance_identifiers": { - Type: schema.TypeSet, + Type: schema.TypeList, Computed: true, Elem: &schema.Schema{Type: schema.TypeString}, }, @@ -46,7 +46,7 @@ func dataSourceInstancesRead(ctx context.Context, d *schema.ResourceData, meta i input.Filters = namevaluesfilters.New(v.(*schema.Set)).RDSFilters() } - var instanceArns []string + var instanceARNS []string var instanceIdentifiers []string err := conn.DescribeDBInstancesPagesWithContext(ctx, input, func(page *rds.DescribeDBInstancesOutput, lastPage bool) bool { @@ -59,7 +59,7 @@ func dataSourceInstancesRead(ctx context.Context, d *schema.ResourceData, meta i continue } - instanceArns = append(instanceArns, aws.StringValue(dbInstance.DBInstanceArn)) + instanceARNS = append(instanceARNS, aws.StringValue(dbInstance.DBInstanceArn)) instanceIdentifiers = append(instanceIdentifiers, aws.StringValue(dbInstance.DBInstanceIdentifier)) } @@ -71,7 +71,7 @@ func dataSourceInstancesRead(ctx context.Context, d *schema.ResourceData, meta i } d.SetId(meta.(*conns.AWSClient).Region) - d.Set("instance_arns", instanceArns) + d.Set("instance_arns", instanceARNS) d.Set("instance_identifiers", instanceIdentifiers) return nil