From 04580df8ab246c488eae3fce189c82f0d33a001e Mon Sep 17 00:00:00 2001 From: Brad Sheppard Date: Wed, 1 Feb 2023 22:14:46 -0330 Subject: [PATCH 1/5] Add aws_redshiftserverless_workgroup data source --- internal/provider/provider.go | 1 + .../workgroup_data_source.go | 147 ++++++++++++++++++ .../workgroup_data_source_test.go | 69 ++++++++ ...redshiftserverless_workgroup.html.markdown | 59 +++++++ 4 files changed, 276 insertions(+) create mode 100644 internal/service/redshiftserverless/workgroup_data_source.go create mode 100644 internal/service/redshiftserverless/workgroup_data_source_test.go create mode 100644 website/docs/d/redshiftserverless_workgroup.html.markdown diff --git a/internal/provider/provider.go b/internal/provider/provider.go index 36579b551d54..62ab042d8991 100644 --- a/internal/provider/provider.go +++ b/internal/provider/provider.go @@ -846,6 +846,7 @@ func New(ctx context.Context) (*schema.Provider, error) { "aws_redshift_subnet_group": redshift.DataSourceSubnetGroup(), "aws_redshiftserverless_credentials": redshiftserverless.DataSourceCredentials(), + "aws_redshiftserverless_workgroup": redshiftserverless.DataSourceWorkgroup(), "aws_resourcegroupstaggingapi_resources": resourcegroupstaggingapi.DataSourceResources(), diff --git a/internal/service/redshiftserverless/workgroup_data_source.go b/internal/service/redshiftserverless/workgroup_data_source.go new file mode 100644 index 000000000000..ad7298aa8d90 --- /dev/null +++ b/internal/service/redshiftserverless/workgroup_data_source.go @@ -0,0 +1,147 @@ +package redshiftserverless + +import ( + "context" + + "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/errs/sdkdiag" +) + +func DataSourceWorkgroup() *schema.Resource { + return &schema.Resource{ + ReadWithoutTimeout: dataSourceWorkgroupRead, + + Schema: map[string]*schema.Schema{ + "arn": { + Type: schema.TypeString, + Computed: true, + }, + "endpoint": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "address": { + Type: schema.TypeString, + Computed: true, + }, + "port": { + Type: schema.TypeInt, + Computed: true, + }, + "vpc_endpoint": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "vpc_endpoint_id": { + Type: schema.TypeString, + Computed: true, + }, + "vpc_id": { + Type: schema.TypeString, + Computed: true, + }, + "network_interface": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "availability_zone": { + Type: schema.TypeString, + Computed: true, + }, + "network_interface_id": { + Type: schema.TypeString, + Computed: true, + }, + "private_ip_address": { + Type: schema.TypeString, + Computed: true, + }, + "subnet_id": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + "enhanced_vpc_routing": { + Type: schema.TypeBool, + Optional: true, + }, + "id": { + Type: schema.TypeString, + Computed: true, + }, + "namespace_name": { + Type: schema.TypeString, + Computed: true, + }, + "publicly_accessible": { + Type: schema.TypeBool, + Computed: true, + }, + "security_group_ids": { + Type: schema.TypeSet, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + "subnet_ids": { + Type: schema.TypeSet, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + "workgroup_id": { + Type: schema.TypeString, + Computed: true, + }, + "workgroup_name": { + Type: schema.TypeString, + Required: true, + }, + }, + } +} + +func dataSourceWorkgroupRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + var diags diag.Diagnostics + conn := meta.(*conns.AWSClient).RedshiftServerlessConn() + + workgroupName := d.Get("workgroup_name").(string) + + resource, err := FindWorkgroupByName(ctx, conn, workgroupName) + + if err != nil { + return sdkdiag.AppendErrorf(diags, "reading Redshift Serverless Workgroup (%s): %s", workgroupName, err) + } + + d.SetId(workgroupName) + + d.Set("arn", resource.WorkgroupArn) + d.Set("enhanced_vpc_routing", resource.EnhancedVpcRouting) + d.Set("namespace_name", resource.NamespaceName) + d.Set("publicly_accessible", resource.PubliclyAccessible) + d.Set("security_group_ids", resource.SecurityGroupIds) + d.Set("subnet_ids", resource.SubnetIds) + + d.Set("workgroup_id", resource.WorkgroupId) + + if err := d.Set("endpoint", []interface{}{flattenEndpoint(resource.Endpoint)}); err != nil { + return sdkdiag.AppendErrorf(diags, "setting endpoint: %s", err) + } + + return diags +} diff --git a/internal/service/redshiftserverless/workgroup_data_source_test.go b/internal/service/redshiftserverless/workgroup_data_source_test.go new file mode 100644 index 000000000000..f28424cb36ad --- /dev/null +++ b/internal/service/redshiftserverless/workgroup_data_source_test.go @@ -0,0 +1,69 @@ +package redshiftserverless_test + +import ( + "fmt" + "testing" + + "github.com/aws/aws-sdk-go/service/redshiftserverless" + 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 TestAccRedshiftServerlessWorkgroupDataSource_basic(t *testing.T) { + dataSourceName := "data.aws_redshiftserverless_workgroup.test" + resourceName := "aws_redshiftserverless_workgroup.test" + + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(t) }, + ErrorCheck: acctest.ErrorCheck(t, redshiftserverless.EndpointsID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + Steps: []resource.TestStep{ + { + Config: testAccWorkgroupDataSourceConfig_basic(rName), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttrPair(dataSourceName, "arn", resourceName, "arn"), + resource.TestCheckResourceAttrPair(dataSourceName, "endpoint.#", resourceName, "endpoint.#"), + resource.TestCheckResourceAttrPair(dataSourceName, "endpoint.0.address", resourceName, "endpoint.0.address"), + resource.TestCheckResourceAttrPair(dataSourceName, "endpoint.0.port", resourceName, "endpoint.0.port"), + resource.TestCheckResourceAttrPair(dataSourceName, "endpoint.0.port", resourceName, "endpoint.0.port"), + resource.TestCheckResourceAttrPair(dataSourceName, "endpoint.0.vpc_endpoint.#", resourceName, "endpoint.0.vpc_endpoint.#"), + resource.TestCheckResourceAttrPair(dataSourceName, "endpoint.0.vpc_endpoint.0.vpc_endpoint_id", resourceName, "endpoint.0.vpc_endpoint.0.vpc_endpoint_id"), + resource.TestCheckResourceAttrPair(dataSourceName, "endpoint.0.vpc_endpoint.0.vpc_id", resourceName, "endpoint.0.vpc_endpoint.0.vpc_id"), + resource.TestCheckResourceAttrPair(dataSourceName, "endpoint.0.vpc_endpoint.0.network_interface.#", resourceName, "endpoint.0.vpc_endpoint.0.network_interface.#"), + resource.TestCheckResourceAttrPair(dataSourceName, "endpoint.0.vpc_endpoint.0.network_interface.availability_zone", resourceName, "endpoint.0.vpc_endpoint.0.network_interface.availability_zone"), + resource.TestCheckResourceAttrPair(dataSourceName, "endpoint.0.vpc_endpoint.0.network_interface.network_interface_id", resourceName, "endpoint.0.vpc_endpoint.0.network_interface.network_interface_id"), + resource.TestCheckResourceAttrPair(dataSourceName, "endpoint.0.vpc_endpoint.0.network_interface.private_ip_address", resourceName, "endpoint.0.vpc_endpoint.0.network_interface.private_ip_address"), + resource.TestCheckResourceAttrPair(dataSourceName, "endpoint.0.vpc_endpoint.0.network_interface.subnet_id", resourceName, "endpoint.0.vpc_endpoint.0.network_interface.subnet_id"), + resource.TestCheckResourceAttrPair(dataSourceName, "enhanced_vpc_routing", resourceName, "enhanced_vpc_routing"), + resource.TestCheckResourceAttrPair(dataSourceName, "id", resourceName, "id"), + resource.TestCheckResourceAttrPair(dataSourceName, "namespace_name", resourceName, "namespace_name"), + resource.TestCheckResourceAttrPair(dataSourceName, "publicly_accessible", resourceName, "publicly_accessible"), + resource.TestCheckResourceAttrPair(dataSourceName, "security_group_ids", resourceName, "security_group_ids"), + resource.TestCheckResourceAttrPair(dataSourceName, "subnet_ids", resourceName, "subnet_ids"), + resource.TestCheckResourceAttrPair(dataSourceName, "workgroup_id", resourceName, "workgroup_id"), + resource.TestCheckResourceAttrPair(dataSourceName, "workgroup_name", resourceName, "workgroup_name"), + ), + }, + }, + }) +} + +func testAccWorkgroupDataSourceConfig_basic(rName string) string { + return fmt.Sprintf(` +resource "aws_redshiftserverless_namespace" "test" { + namespace_name = %[1]q +} + +resource "aws_redshiftserverless_workgroup" "test" { + namespace_name = aws_redshiftserverless_namespace.test.namespace_name + workgroup_name = %[1]q +} + +data "aws_redshiftserverless_workgroup" "test" { + workgroup_name = aws_redshiftserverless_workgroup.test.workgroup_name +} +`, rName) +} diff --git a/website/docs/d/redshiftserverless_workgroup.html.markdown b/website/docs/d/redshiftserverless_workgroup.html.markdown new file mode 100644 index 000000000000..c323f40e4dfa --- /dev/null +++ b/website/docs/d/redshiftserverless_workgroup.html.markdown @@ -0,0 +1,59 @@ +--- +subcategory: "Redshift Serverless" +layout: "aws" +page_title: "AWS: aws_redshiftserverless_workgroup" +description: |- + Terraform data source for managing an AWS Redshift Serverless Workgroup. +--- + +# Data Source: aws_redshiftserverless_workgroup + +Terraform data source for managing an AWS Redshift Serverless Workgroup. + +## Example Usage + +### Basic Usage + +```terraform +data "aws_redshiftserverless_workgroup" "example" { + workgroup_name = aws_redshiftserverless_workgroup.example.workgroup_name +} +``` + +## Argument Reference + +The following arguments are required: + +* `workgroup_name` - (Required) The name of the workgroup associated with the database. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `arn` - Amazon Resource Name (ARN) of the Redshift Serverless Workgroup. +* `id` - The Redshift Workgroup Name. +* `endpoint` - The endpoint that is created from the workgroup. See `Endpoint` below. +* `enhanced_vpc_routing` - The value that specifies whether to turn on enhanced virtual private cloud (VPC) routing, which forces Amazon Redshift Serverless to route traffic through your VPC instead of over the internet. +* `publicly_accessible` - A value that specifies whether the workgroup can be accessed from a public network. +* `security_group_ids` - An array of security group IDs to associate with the workgroup. +* `subnet_ids` - An array of VPC subnet IDs to associate with the workgroup. When set, must contain at least three subnets spanning three Availability Zones. A minimum number of IP addresses is required and scales with the Base Capacity. For more information, see the following [AWS document](https://docs.aws.amazon.com/redshift/latest/mgmt/serverless-known-issues.html). +* `workgroup_id` - The Redshift Workgroup ID. + +### Endpoint + +* `address` - The DNS address of the VPC endpoint. +* `port` - The port that Amazon Redshift Serverless listens on. +* `vpc_endpoint` - The VPC endpoint or the Redshift Serverless workgroup. See `VPC Endpoint` below. + +#### VPC Endpoint + +* `vpc_endpoint_id` - The DNS address of the VPC endpoint. +* `vpc_id` - The port that Amazon Redshift Serverless listens on. +* `network_interface` - The network interfaces of the endpoint.. See `Network Interface` below. + +##### Network Interface + +* `availability_zone` - The availability Zone. +* `network_interface_id` - The unique identifier of the network interface. +* `private_ip_address` - The IPv4 address of the network interface within the subnet. +* `subnet_id` - The unique identifier of the subnet. From 6cd85b97f000ab9ed456c87d90abd01a158f7489 Mon Sep 17 00:00:00 2001 From: Brad Sheppard Date: Wed, 1 Feb 2023 23:10:09 -0330 Subject: [PATCH 2/5] Added changelog entry --- .changelog/29208.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/29208.txt diff --git a/.changelog/29208.txt b/.changelog/29208.txt new file mode 100644 index 000000000000..03f11e9f6ac3 --- /dev/null +++ b/.changelog/29208.txt @@ -0,0 +1,3 @@ +```release-note:new-data-source +aws_redshiftserverless_workgroup +``` From e008db4818e8fb5081807b3a9f3b6f1b4376b978 Mon Sep 17 00:00:00 2001 From: Brad Sheppard Date: Thu, 16 Mar 2023 21:42:04 -0230 Subject: [PATCH 3/5] Utilize SDK annotation --- internal/service/redshiftserverless/service_package_gen.go | 4 ++++ internal/service/redshiftserverless/workgroup_data_source.go | 1 + .../service/redshiftserverless/workgroup_data_source_test.go | 3 ++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/internal/service/redshiftserverless/service_package_gen.go b/internal/service/redshiftserverless/service_package_gen.go index 374bae3d859c..3b686d374fbe 100644 --- a/internal/service/redshiftserverless/service_package_gen.go +++ b/internal/service/redshiftserverless/service_package_gen.go @@ -25,6 +25,10 @@ func (p *servicePackage) SDKDataSources(ctx context.Context) []*types.ServicePac Factory: DataSourceCredentials, TypeName: "aws_redshiftserverless_credentials", }, + { + Factory: DataSourceWorkgroup, + TypeName: "aws_redshiftserverless_workgroup", + }, } } diff --git a/internal/service/redshiftserverless/workgroup_data_source.go b/internal/service/redshiftserverless/workgroup_data_source.go index ad7298aa8d90..de8bd1dd587d 100644 --- a/internal/service/redshiftserverless/workgroup_data_source.go +++ b/internal/service/redshiftserverless/workgroup_data_source.go @@ -9,6 +9,7 @@ import ( "github.com/hashicorp/terraform-provider-aws/internal/errs/sdkdiag" ) +// @SDKDataSource("aws_redshiftserverless_workgroup") func DataSourceWorkgroup() *schema.Resource { return &schema.Resource{ ReadWithoutTimeout: dataSourceWorkgroupRead, diff --git a/internal/service/redshiftserverless/workgroup_data_source_test.go b/internal/service/redshiftserverless/workgroup_data_source_test.go index f28424cb36ad..cf20570668b3 100644 --- a/internal/service/redshiftserverless/workgroup_data_source_test.go +++ b/internal/service/redshiftserverless/workgroup_data_source_test.go @@ -11,13 +11,14 @@ import ( ) func TestAccRedshiftServerlessWorkgroupDataSource_basic(t *testing.T) { + ctx := acctest.Context(t) dataSourceName := "data.aws_redshiftserverless_workgroup.test" resourceName := "aws_redshiftserverless_workgroup.test" rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { acctest.PreCheck(t) }, + PreCheck: func() { acctest.PreCheck(ctx, t) }, ErrorCheck: acctest.ErrorCheck(t, redshiftserverless.EndpointsID), ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, Steps: []resource.TestStep{ From 6c1bc6fa2776d02f9d1787477ebd6f8e1eb93e2a Mon Sep 17 00:00:00 2001 From: Brad Sheppard Date: Thu, 16 Mar 2023 22:01:51 -0230 Subject: [PATCH 4/5] Switch enhanced_vpc_routing to computed --- internal/service/redshiftserverless/workgroup_data_source.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/service/redshiftserverless/workgroup_data_source.go b/internal/service/redshiftserverless/workgroup_data_source.go index de8bd1dd587d..1cddba6a6d27 100644 --- a/internal/service/redshiftserverless/workgroup_data_source.go +++ b/internal/service/redshiftserverless/workgroup_data_source.go @@ -77,7 +77,7 @@ func DataSourceWorkgroup() *schema.Resource { }, "enhanced_vpc_routing": { Type: schema.TypeBool, - Optional: true, + Computed: true, }, "id": { Type: schema.TypeString, From 659211904c765eeaa3fe9aa570c8ecf677e594f2 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 19 Apr 2023 08:07:24 -0400 Subject: [PATCH 5/5] d/aws_redshiftserverless_workgroup: Alphabetize attributes. --- .../workgroup_data_source.go | 29 +++++++------------ .../workgroup_data_source_test.go | 4 +-- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/internal/service/redshiftserverless/workgroup_data_source.go b/internal/service/redshiftserverless/workgroup_data_source.go index 1cddba6a6d27..31fe743bc2e1 100644 --- a/internal/service/redshiftserverless/workgroup_data_source.go +++ b/internal/service/redshiftserverless/workgroup_data_source.go @@ -37,14 +37,6 @@ func DataSourceWorkgroup() *schema.Resource { Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ - "vpc_endpoint_id": { - Type: schema.TypeString, - Computed: true, - }, - "vpc_id": { - Type: schema.TypeString, - Computed: true, - }, "network_interface": { Type: schema.TypeList, Computed: true, @@ -69,6 +61,14 @@ func DataSourceWorkgroup() *schema.Resource { }, }, }, + "vpc_endpoint_id": { + Type: schema.TypeString, + Computed: true, + }, + "vpc_id": { + Type: schema.TypeString, + Computed: true, + }, }, }, }, @@ -79,10 +79,6 @@ func DataSourceWorkgroup() *schema.Resource { Type: schema.TypeBool, Computed: true, }, - "id": { - Type: schema.TypeString, - Computed: true, - }, "namespace_name": { Type: schema.TypeString, Computed: true, @@ -130,19 +126,16 @@ func dataSourceWorkgroupRead(ctx context.Context, d *schema.ResourceData, meta i } d.SetId(workgroupName) - d.Set("arn", resource.WorkgroupArn) + if err := d.Set("endpoint", []interface{}{flattenEndpoint(resource.Endpoint)}); err != nil { + return sdkdiag.AppendErrorf(diags, "setting endpoint: %s", err) + } d.Set("enhanced_vpc_routing", resource.EnhancedVpcRouting) d.Set("namespace_name", resource.NamespaceName) d.Set("publicly_accessible", resource.PubliclyAccessible) d.Set("security_group_ids", resource.SecurityGroupIds) d.Set("subnet_ids", resource.SubnetIds) - d.Set("workgroup_id", resource.WorkgroupId) - if err := d.Set("endpoint", []interface{}{flattenEndpoint(resource.Endpoint)}); err != nil { - return sdkdiag.AppendErrorf(diags, "setting endpoint: %s", err) - } - return diags } diff --git a/internal/service/redshiftserverless/workgroup_data_source_test.go b/internal/service/redshiftserverless/workgroup_data_source_test.go index cf20570668b3..566c07709e81 100644 --- a/internal/service/redshiftserverless/workgroup_data_source_test.go +++ b/internal/service/redshiftserverless/workgroup_data_source_test.go @@ -42,8 +42,8 @@ func TestAccRedshiftServerlessWorkgroupDataSource_basic(t *testing.T) { resource.TestCheckResourceAttrPair(dataSourceName, "id", resourceName, "id"), resource.TestCheckResourceAttrPair(dataSourceName, "namespace_name", resourceName, "namespace_name"), resource.TestCheckResourceAttrPair(dataSourceName, "publicly_accessible", resourceName, "publicly_accessible"), - resource.TestCheckResourceAttrPair(dataSourceName, "security_group_ids", resourceName, "security_group_ids"), - resource.TestCheckResourceAttrPair(dataSourceName, "subnet_ids", resourceName, "subnet_ids"), + resource.TestCheckResourceAttrPair(dataSourceName, "security_group_ids.#", resourceName, "security_group_ids.#"), + resource.TestCheckResourceAttrPair(dataSourceName, "subnet_ids.#", resourceName, "subnet_ids.#"), resource.TestCheckResourceAttrPair(dataSourceName, "workgroup_id", resourceName, "workgroup_id"), resource.TestCheckResourceAttrPair(dataSourceName, "workgroup_name", resourceName, "workgroup_name"), ),