From cd0dbf47f5b5e581115f8087c4a9727be1ee33e0 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Fri, 2 Jun 2023 13:41:50 -0400 Subject: [PATCH 1/9] r/aws_redshiftserverless_workgroup: Alphabetize attributes. --- internal/service/redshiftserverless/workgroup.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/internal/service/redshiftserverless/workgroup.go b/internal/service/redshiftserverless/workgroup.go index 33a6742ae0c7..385806051b76 100644 --- a/internal/service/redshiftserverless/workgroup.go +++ b/internal/service/redshiftserverless/workgroup.go @@ -85,14 +85,6 @@ func ResourceWorkgroup() *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, @@ -117,6 +109,14 @@ func ResourceWorkgroup() *schema.Resource { }, }, }, + "vpc_endpoint_id": { + Type: schema.TypeString, + Computed: true, + }, + "vpc_id": { + Type: schema.TypeString, + Computed: true, + }, }, }, }, From dcc53dd2b85a94bd2c127daffafa9d713cf31933 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Fri, 2 Jun 2023 13:46:28 -0400 Subject: [PATCH 2/9] r/aws_redshiftserverless_workgroup: Tidy up. --- .../service/redshiftserverless/workgroup.go | 50 +++++++++++-------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/internal/service/redshiftserverless/workgroup.go b/internal/service/redshiftserverless/workgroup.go index 385806051b76..758e9b514dfd 100644 --- a/internal/service/redshiftserverless/workgroup.go +++ b/internal/service/redshiftserverless/workgroup.go @@ -56,9 +56,15 @@ func ResourceWorkgroup() *schema.Resource { Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "parameter_key": { - Type: schema.TypeString, - ValidateFunc: validation.StringInSlice([]string{"datestyle", "enable_user_activity_logging", "query_group", "search_path", "max_query_execution_time"}, false), - Required: true, + Type: schema.TypeString, + ValidateFunc: validation.StringInSlice([]string{ + "datestyle", + "enable_user_activity_logging", + "query_group", + "search_path", + "max_query_execution_time", + }, false), + Required: true, }, "parameter_value": { Type: schema.TypeString, @@ -173,10 +179,11 @@ func resourceWorkgroupCreate(ctx context.Context, d *schema.ResourceData, meta i var diags diag.Diagnostics conn := meta.(*conns.AWSClient).RedshiftServerlessConn() + name := d.Get("workgroup_name").(string) input := redshiftserverless.CreateWorkgroupInput{ NamespaceName: aws.String(d.Get("namespace_name").(string)), Tags: GetTagsIn(ctx), - WorkgroupName: aws.String(d.Get("workgroup_name").(string)), + WorkgroupName: aws.String(name), } if v, ok := d.GetOk("base_capacity"); ok { @@ -203,16 +210,16 @@ func resourceWorkgroupCreate(ctx context.Context, d *schema.ResourceData, meta i input.SubnetIds = flex.ExpandStringSet(v.(*schema.Set)) } - out, err := conn.CreateWorkgroupWithContext(ctx, &input) + output, err := conn.CreateWorkgroupWithContext(ctx, &input) if err != nil { - return sdkdiag.AppendErrorf(diags, "creating Redshift Serverless Workgroup : %s", err) + return sdkdiag.AppendErrorf(diags, "creating Redshift Serverless Workgroup (%s): %s", name, err) } - d.SetId(aws.StringValue(out.Workgroup.WorkgroupName)) + d.SetId(aws.StringValue(output.Workgroup.WorkgroupName)) if _, err := waitWorkgroupAvailable(ctx, conn, d.Id(), d.Timeout(schema.TimeoutCreate)); err != nil { - return sdkdiag.AppendErrorf(diags, "waiting for Redshift Serverless Workgroup (%s) to be created: %s", d.Id(), err) + return sdkdiag.AppendErrorf(diags, "waiting for Redshift Serverless Workgroup (%s) create: %s", d.Id(), err) } return append(diags, resourceWorkgroupRead(ctx, d, meta)...) @@ -223,6 +230,7 @@ func resourceWorkgroupRead(ctx context.Context, d *schema.ResourceData, meta int conn := meta.(*conns.AWSClient).RedshiftServerlessConn() out, err := FindWorkgroupByName(ctx, conn, d.Id()) + if !d.IsNewResource() && tfresource.NotFound(err) { log.Printf("[WARN] Redshift Serverless Workgroup (%s) not found, removing from state", d.Id()) d.SetId("") @@ -236,6 +244,12 @@ func resourceWorkgroupRead(ctx context.Context, d *schema.ResourceData, meta int arn := aws.StringValue(out.WorkgroupArn) d.Set("arn", arn) d.Set("base_capacity", out.BaseCapacity) + if err := d.Set("config_parameter", flattenConfigParameters(out.ConfigParameters)); err != nil { + return sdkdiag.AppendErrorf(diags, "setting config_parameter: %s", err) + } + if err := d.Set("endpoint", []interface{}{flattenEndpoint(out.Endpoint)}); err != nil { + return sdkdiag.AppendErrorf(diags, "setting endpoint: %s", err) + } d.Set("enhanced_vpc_routing", out.EnhancedVpcRouting) d.Set("namespace_name", out.NamespaceName) d.Set("publicly_accessible", out.PubliclyAccessible) @@ -243,13 +257,6 @@ func resourceWorkgroupRead(ctx context.Context, d *schema.ResourceData, meta int d.Set("subnet_ids", flex.FlattenStringSet(out.SubnetIds)) d.Set("workgroup_id", out.WorkgroupId) d.Set("workgroup_name", out.WorkgroupName) - if err := d.Set("config_parameter", flattenConfigParameters(out.ConfigParameters)); err != nil { - return sdkdiag.AppendErrorf(diags, "setting config_parameter: %s", err) - } - - if err := d.Set("endpoint", []interface{}{flattenEndpoint(out.Endpoint)}); err != nil { - return sdkdiag.AppendErrorf(diags, "setting endpoint: %s", err) - } return diags } @@ -288,12 +295,13 @@ func resourceWorkgroupUpdate(ctx context.Context, d *schema.ResourceData, meta i } _, err := conn.UpdateWorkgroupWithContext(ctx, input) + if err != nil { return sdkdiag.AppendErrorf(diags, "updating Redshift Serverless Workgroup (%s): %s", d.Id(), err) } if _, err := waitWorkgroupAvailable(ctx, conn, d.Id(), d.Timeout(schema.TimeoutUpdate)); err != nil { - return sdkdiag.AppendErrorf(diags, "waiting for Redshift Serverless Workgroup (%s) to be updated: %s", d.Id(), err) + return sdkdiag.AppendErrorf(diags, "waiting for Redshift Serverless Workgroup (%s) update: %s", d.Id(), err) } } @@ -304,6 +312,7 @@ func resourceWorkgroupDelete(ctx context.Context, d *schema.ResourceData, meta i var diags diag.Diagnostics conn := meta.(*conns.AWSClient).RedshiftServerlessConn() + log.Printf("[DEBUG] Deleting Redshift Serverless Workgroup: %s", d.Id()) _, err := tfresource.RetryWhenAWSErrMessageContains(ctx, 10*time.Minute, func() (interface{}, error) { return conn.DeleteWorkgroupWithContext(ctx, &redshiftserverless.DeleteWorkgroupInput{ @@ -313,15 +322,16 @@ func resourceWorkgroupDelete(ctx context.Context, d *schema.ResourceData, meta i // "ConflictException: There is an operation running on the workgroup. Try deleting the workgroup again later." redshiftserverless.ErrCodeConflictException, "operation running") + if tfawserr.ErrCodeEquals(err, redshiftserverless.ErrCodeResourceNotFoundException) { + return diags + } + if err != nil { - if tfawserr.ErrCodeEquals(err, redshiftserverless.ErrCodeResourceNotFoundException) { - return diags - } return sdkdiag.AppendErrorf(diags, "deleting Redshift Serverless Workgroup (%s): %s", d.Id(), err) } if _, err := waitWorkgroupDeleted(ctx, conn, d.Id(), d.Timeout(schema.TimeoutDelete)); err != nil { - return sdkdiag.AppendErrorf(diags, "deleting Redshift Serverless Workgroup (%s): waiting for completion: %s", d.Id(), err) + return sdkdiag.AppendErrorf(diags, "waiting for Redshift Serverless Workgroup (%s) delete: %s", d.Id(), err) } return diags From 46f928d035e98506f41cfe935e4966ade91bcc80 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Fri, 2 Jun 2023 14:28:37 -0400 Subject: [PATCH 3/9] Add 'TestAccRedshiftServerlessWorkgroup_configParameters'. --- .../redshiftserverless/workgroup_test.go | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/internal/service/redshiftserverless/workgroup_test.go b/internal/service/redshiftserverless/workgroup_test.go index 51e12233c715..455a443d27d0 100644 --- a/internal/service/redshiftserverless/workgroup_test.go +++ b/internal/service/redshiftserverless/workgroup_test.go @@ -47,6 +47,49 @@ func TestAccRedshiftServerlessWorkgroup_basic(t *testing.T) { }) } +func TestAccRedshiftServerlessWorkgroup_configParameters(t *testing.T) { + ctx := acctest.Context(t) + resourceName := "aws_redshiftserverless_workgroup.test" + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(ctx, t) }, + ErrorCheck: acctest.ErrorCheck(t, redshiftserverless.EndpointsID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + CheckDestroy: testAccCheckWorkgroupDestroy(ctx), + Steps: []resource.TestStep{ + { + Config: testAccWorkgroupConfig_configParameters(rName), + Check: resource.ComposeTestCheckFunc( + testAccCheckWorkgroupExists(ctx, resourceName), + resource.TestCheckResourceAttr(resourceName, "config_parameter.#", "7"), + /* + resource.TestCheckResourceAttr(resourceName, "config_parameter.0.parameter_key", "datestyle"), + resource.TestCheckResourceAttr(resourceName, "config_parameter.0.parameter_value", "ISO, MDY"), + resource.TestCheckResourceAttr(resourceName, "config_parameter.1.parameter_key", "enable_user_activity_logging"), + resource.TestCheckResourceAttr(resourceName, "config_parameter.1.parameter_value", "true"), + resource.TestCheckResourceAttr(resourceName, "config_parameter.2.parameter_key", "query_group"), + resource.TestCheckResourceAttr(resourceName, "config_parameter.2.parameter_value", "default"), + resource.TestCheckResourceAttr(resourceName, "config_parameter.3.parameter_key", "search_path"), + resource.TestCheckResourceAttr(resourceName, "config_parameter.3.parameter_value", "$user, public"), + resource.TestCheckResourceAttr(resourceName, "config_parameter.4.parameter_key", "max_query_execution_time"), + resource.TestCheckResourceAttr(resourceName, "config_parameter.4.parameter_value", "14400"), + resource.TestCheckResourceAttr(resourceName, "config_parameter.5.parameter_key", "auto_mv"), + resource.TestCheckResourceAttr(resourceName, "config_parameter.5.parameter_value", "true"), + resource.TestCheckResourceAttr(resourceName, "config_parameter.6.parameter_key", "enable_case_sensitive_identifier"), + resource.TestCheckResourceAttr(resourceName, "config_parameter.6.parameter_value", "false"), + */ + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + func TestAccRedshiftServerlessWorkgroup_tags(t *testing.T) { ctx := acctest.Context(t) resourceName := "aws_redshiftserverless_workgroup.test" @@ -171,6 +214,48 @@ resource "aws_redshiftserverless_workgroup" "test" { `, rName) } +func testAccWorkgroupConfig_configParameters(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 + + config_parameter { + parameter_key = "datestyle" + parameter_value = "ISO, MDY" + } + config_parameter { + parameter_key = "enable_user_activity_logging" + parameter_value = "true" + } + config_parameter { + parameter_key = "query_group" + parameter_value = "default" + } + config_parameter { + parameter_key = "search_path" + parameter_value = "$user, public" + } + config_parameter { + parameter_key = "max_query_execution_time" + parameter_value = "14400" + } + config_parameter { + parameter_key = "auto_mv" + parameter_value = "true" + } + config_parameter { + parameter_key = "enable_case_sensitive_identifier" + parameter_value = "false" + } +} +`, rName) +} + func testAccWorkgroupConfig_tags1(rName, tagKey1, tagValue1 string) string { return fmt.Sprintf(` resource "aws_redshiftserverless_namespace" "test" { From e728193be61b43f8646efb24bef79eb379e1bcdc Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Fri, 2 Jun 2023 14:40:11 -0400 Subject: [PATCH 4/9] r//aws_redshiftserverless_workgroup: Additional supported values for 'config_parameter.parameter_key'. --- .changelog/#####.txt | 3 +++ internal/service/redshiftserverless/workgroup.go | 12 ++++++++++++ .../r/redshiftserverless_workgroup.html.markdown | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 .changelog/#####.txt diff --git a/.changelog/#####.txt b/.changelog/#####.txt new file mode 100644 index 000000000000..678e02c0ed51 --- /dev/null +++ b/.changelog/#####.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/aws_redshiftserverless_workgroup: Additional supported values for `config_parameter.parameter_key` +``` \ No newline at end of file diff --git a/internal/service/redshiftserverless/workgroup.go b/internal/service/redshiftserverless/workgroup.go index 758e9b514dfd..371ef0963818 100644 --- a/internal/service/redshiftserverless/workgroup.go +++ b/internal/service/redshiftserverless/workgroup.go @@ -58,11 +58,23 @@ func ResourceWorkgroup() *schema.Resource { "parameter_key": { Type: schema.TypeString, ValidateFunc: validation.StringInSlice([]string{ + // https://docs.aws.amazon.com/redshift-serverless/latest/APIReference/API_CreateWorkgroup.html#redshiftserverless-CreateWorkgroup-request-configParameters + "auto_mv", "datestyle", + "enable_case_sensitivity_identifier", "enable_user_activity_logging", "query_group", "search_path", + // https://docs.aws.amazon.com/redshift/latest/dg/cm-c-wlm-query-monitoring-rules.html#cm-c-wlm-query-monitoring-metrics-serverless + "max_query_cpu_time", + "max_query_blocks_read", + "max_scan_row_count", "max_query_execution_time", + "max_query_queue_time", + "max_query_cpu_usage_percent", + "max_query_temp_blocks_to_disk", + "max_join_row_count", + "max_nested_loop_join_row_count", }, false), Required: true, }, diff --git a/website/docs/r/redshiftserverless_workgroup.html.markdown b/website/docs/r/redshiftserverless_workgroup.html.markdown index ac53634235a8..76f7e2bce511 100644 --- a/website/docs/r/redshiftserverless_workgroup.html.markdown +++ b/website/docs/r/redshiftserverless_workgroup.html.markdown @@ -38,7 +38,7 @@ The following arguments are optional: ### Config Parameter -* `parameter_key` - (Required) The key of the parameter. The options are `datestyle`, `enable_user_activity_logging`, `query_group`, `search_path`, and `max_query_execution_time`. +* `parameter_key` - (Required) The key of the parameter. The options are `auto_mv`, `datestyle`, `enable_case_sensitivity_identifier`, `enable_user_activity_logging`, `query_group`, `search_path` and [query monitoring metrics](https://docs.aws.amazon.com/redshift/latest/dg/cm-c-wlm-query-monitoring-rules.html#cm-c-wlm-query-monitoring-metrics-serverless) that let you define performance boundaries: `max_query_cpu_time`, `max_query_blocks_read`, `max_scan_row_count`, `max_query_execution_time`, `max_query_queue_time`, `max_query_cpu_usage_percent`, `max_query_temp_blocks_to_disk`, `max_join_row_count` and `max_nested_loop_join_row_count`. * `parameter_value` - (Required) The value of the parameter to set. ## Attributes Reference From fb908dea8235c0a9ba6e398887fddbae61eff7f1 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Fri, 2 Jun 2023 14:49:34 -0400 Subject: [PATCH 5/9] 'enable_case_sensitivity_identifier' -> 'enable_case_sensitive_identifier'. --- internal/service/redshiftserverless/workgroup.go | 2 +- website/docs/r/redshiftserverless_workgroup.html.markdown | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/service/redshiftserverless/workgroup.go b/internal/service/redshiftserverless/workgroup.go index 371ef0963818..55e2beffa3c2 100644 --- a/internal/service/redshiftserverless/workgroup.go +++ b/internal/service/redshiftserverless/workgroup.go @@ -61,7 +61,7 @@ func ResourceWorkgroup() *schema.Resource { // https://docs.aws.amazon.com/redshift-serverless/latest/APIReference/API_CreateWorkgroup.html#redshiftserverless-CreateWorkgroup-request-configParameters "auto_mv", "datestyle", - "enable_case_sensitivity_identifier", + "enable_case_sensitive_identifier", // "ValidationException: The parameter key enable_case_sensitivity_identifier isn't supported. Supported values: [[max_query_cpu_usage_percent, max_join_row_count, auto_mv, max_query_execution_time, max_query_queue_time, max_query_blocks_read, max_return_row_count, search_path, datestyle, max_query_cpu_time, max_io_skew, max_scan_row_count, query_group, enable_user_activity_logging, enable_case_sensitive_identifier, max_nested_loop_join_row_count, max_query_temp_blocks_to_disk, max_cpu_skew]]" "enable_user_activity_logging", "query_group", "search_path", diff --git a/website/docs/r/redshiftserverless_workgroup.html.markdown b/website/docs/r/redshiftserverless_workgroup.html.markdown index 76f7e2bce511..b3d25d43a49a 100644 --- a/website/docs/r/redshiftserverless_workgroup.html.markdown +++ b/website/docs/r/redshiftserverless_workgroup.html.markdown @@ -38,7 +38,7 @@ The following arguments are optional: ### Config Parameter -* `parameter_key` - (Required) The key of the parameter. The options are `auto_mv`, `datestyle`, `enable_case_sensitivity_identifier`, `enable_user_activity_logging`, `query_group`, `search_path` and [query monitoring metrics](https://docs.aws.amazon.com/redshift/latest/dg/cm-c-wlm-query-monitoring-rules.html#cm-c-wlm-query-monitoring-metrics-serverless) that let you define performance boundaries: `max_query_cpu_time`, `max_query_blocks_read`, `max_scan_row_count`, `max_query_execution_time`, `max_query_queue_time`, `max_query_cpu_usage_percent`, `max_query_temp_blocks_to_disk`, `max_join_row_count` and `max_nested_loop_join_row_count`. +* `parameter_key` - (Required) The key of the parameter. The options are `auto_mv`, `datestyle`, `enable_case_sensitive_identifier`, `enable_user_activity_logging`, `query_group`, `search_path` and [query monitoring metrics](https://docs.aws.amazon.com/redshift/latest/dg/cm-c-wlm-query-monitoring-rules.html#cm-c-wlm-query-monitoring-metrics-serverless) that let you define performance boundaries: `max_query_cpu_time`, `max_query_blocks_read`, `max_scan_row_count`, `max_query_execution_time`, `max_query_queue_time`, `max_query_cpu_usage_percent`, `max_query_temp_blocks_to_disk`, `max_join_row_count` and `max_nested_loop_join_row_count`. * `parameter_value` - (Required) The value of the parameter to set. ## Attributes Reference From 351edc13019f08d7685661ab7726473cd0b26e4c Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Fri, 2 Jun 2023 15:06:50 -0400 Subject: [PATCH 6/9] r/aws_redshiftserverless_workgroup: Change 'config_parameter' from 'TypeList' to 'TypeSet' as order is not significant. --- .changelog/#####.txt | 4 ++ .../service/redshiftserverless/workgroup.go | 10 ++--- .../redshiftserverless/workgroup_test.go | 44 ++++++++++++------- 3 files changed, 37 insertions(+), 21 deletions(-) diff --git a/.changelog/#####.txt b/.changelog/#####.txt index 678e02c0ed51..c5dfecafee99 100644 --- a/.changelog/#####.txt +++ b/.changelog/#####.txt @@ -1,3 +1,7 @@ ```release-note:enhancement resource/aws_redshiftserverless_workgroup: Additional supported values for `config_parameter.parameter_key` +``` + +```release-note:enhancement +resource/aws_redshiftserverless_workgroup: Change `config_parameter` from `TypeList` to `TypeSet` as order is not significant ``` \ No newline at end of file diff --git a/internal/service/redshiftserverless/workgroup.go b/internal/service/redshiftserverless/workgroup.go index 55e2beffa3c2..a17fb5263e6a 100644 --- a/internal/service/redshiftserverless/workgroup.go +++ b/internal/service/redshiftserverless/workgroup.go @@ -50,7 +50,7 @@ func ResourceWorkgroup() *schema.Resource { Computed: true, }, "config_parameter": { - Type: schema.TypeList, + Type: schema.TypeSet, Optional: true, Computed: true, Elem: &schema.Resource{ @@ -202,8 +202,8 @@ func resourceWorkgroupCreate(ctx context.Context, d *schema.ResourceData, meta i input.BaseCapacity = aws.Int64(int64(v.(int))) } - if v, ok := d.GetOk("config_parameter"); ok && len(v.([]interface{})) > 0 { - input.ConfigParameters = expandConfigParameters(v.([]interface{})) + if v, ok := d.GetOk("config_parameter"); ok && v.(*schema.Set).Len() > 0 { + input.ConfigParameters = expandConfigParameters(v.(*schema.Set).List()) } if v, ok := d.GetOk("enhanced_vpc_routing"); ok { @@ -286,8 +286,8 @@ func resourceWorkgroupUpdate(ctx context.Context, d *schema.ResourceData, meta i input.BaseCapacity = aws.Int64(int64(v.(int))) } - if v, ok := d.GetOk("config_parameter"); ok && len(v.([]interface{})) > 0 { - input.ConfigParameters = expandConfigParameters(v.([]interface{})) + if v, ok := d.GetOk("config_parameter"); ok && v.(*schema.Set).Len() > 0 { + input.ConfigParameters = expandConfigParameters(v.(*schema.Set).List()) } if v, ok := d.GetOk("enhanced_vpc_routing"); ok { diff --git a/internal/service/redshiftserverless/workgroup_test.go b/internal/service/redshiftserverless/workgroup_test.go index 455a443d27d0..26bec4114193 100644 --- a/internal/service/redshiftserverless/workgroup_test.go +++ b/internal/service/redshiftserverless/workgroup_test.go @@ -63,22 +63,34 @@ func TestAccRedshiftServerlessWorkgroup_configParameters(t *testing.T) { Check: resource.ComposeTestCheckFunc( testAccCheckWorkgroupExists(ctx, resourceName), resource.TestCheckResourceAttr(resourceName, "config_parameter.#", "7"), - /* - resource.TestCheckResourceAttr(resourceName, "config_parameter.0.parameter_key", "datestyle"), - resource.TestCheckResourceAttr(resourceName, "config_parameter.0.parameter_value", "ISO, MDY"), - resource.TestCheckResourceAttr(resourceName, "config_parameter.1.parameter_key", "enable_user_activity_logging"), - resource.TestCheckResourceAttr(resourceName, "config_parameter.1.parameter_value", "true"), - resource.TestCheckResourceAttr(resourceName, "config_parameter.2.parameter_key", "query_group"), - resource.TestCheckResourceAttr(resourceName, "config_parameter.2.parameter_value", "default"), - resource.TestCheckResourceAttr(resourceName, "config_parameter.3.parameter_key", "search_path"), - resource.TestCheckResourceAttr(resourceName, "config_parameter.3.parameter_value", "$user, public"), - resource.TestCheckResourceAttr(resourceName, "config_parameter.4.parameter_key", "max_query_execution_time"), - resource.TestCheckResourceAttr(resourceName, "config_parameter.4.parameter_value", "14400"), - resource.TestCheckResourceAttr(resourceName, "config_parameter.5.parameter_key", "auto_mv"), - resource.TestCheckResourceAttr(resourceName, "config_parameter.5.parameter_value", "true"), - resource.TestCheckResourceAttr(resourceName, "config_parameter.6.parameter_key", "enable_case_sensitive_identifier"), - resource.TestCheckResourceAttr(resourceName, "config_parameter.6.parameter_value", "false"), - */ + resource.TestCheckTypeSetElemNestedAttrs(resourceName, "config_parameter.*", map[string]string{ + "parameter_key": "datestyle", + "parameter_value": "ISO, MDY", + }), + resource.TestCheckTypeSetElemNestedAttrs(resourceName, "config_parameter.*", map[string]string{ + "parameter_key": "enable_user_activity_logging", + "parameter_value": "true", + }), + resource.TestCheckTypeSetElemNestedAttrs(resourceName, "config_parameter.*", map[string]string{ + "parameter_key": "query_group", + "parameter_value": "default", + }), + resource.TestCheckTypeSetElemNestedAttrs(resourceName, "config_parameter.*", map[string]string{ + "parameter_key": "search_path", + "parameter_value": "$user, public", + }), + resource.TestCheckTypeSetElemNestedAttrs(resourceName, "config_parameter.*", map[string]string{ + "parameter_key": "max_query_execution_time", + "parameter_value": "14400", + }), + resource.TestCheckTypeSetElemNestedAttrs(resourceName, "config_parameter.*", map[string]string{ + "parameter_key": "auto_mv", + "parameter_value": "true", + }), + resource.TestCheckTypeSetElemNestedAttrs(resourceName, "config_parameter.*", map[string]string{ + "parameter_key": "enable_case_sensitive_identifier", + "parameter_value": "false", + }), ), }, { From 001cf86be1f86dd67d0b6f0ac1fce6cfdc0a5daa Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Fri, 2 Jun 2023 15:14:25 -0400 Subject: [PATCH 7/9] Add 'TestAccRedshiftServerlessWorkgroup_baseCapacityAndPubliclyAccessible'. --- .../redshiftserverless/workgroup_test.go | 94 ++++++++++++++++++- 1 file changed, 90 insertions(+), 4 deletions(-) diff --git a/internal/service/redshiftserverless/workgroup_test.go b/internal/service/redshiftserverless/workgroup_test.go index 26bec4114193..05067216ff70 100644 --- a/internal/service/redshiftserverless/workgroup_test.go +++ b/internal/service/redshiftserverless/workgroup_test.go @@ -47,6 +47,42 @@ func TestAccRedshiftServerlessWorkgroup_basic(t *testing.T) { }) } +func TestAccRedshiftServerlessWorkgroup_baseCapacityAndPubliclyAccessible(t *testing.T) { + ctx := acctest.Context(t) + resourceName := "aws_redshiftserverless_workgroup.test" + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(ctx, t) }, + ErrorCheck: acctest.ErrorCheck(t, redshiftserverless.EndpointsID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + CheckDestroy: testAccCheckWorkgroupDestroy(ctx), + Steps: []resource.TestStep{ + { + Config: testAccWorkgroupConfig_baseCapacityAndPubliclyAccessible(rName, 64, true), + Check: resource.ComposeTestCheckFunc( + testAccCheckWorkgroupExists(ctx, resourceName), + resource.TestCheckResourceAttr(resourceName, "base_capacity", "64"), + resource.TestCheckResourceAttr(resourceName, "publicly_accessible", "true"), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + { + Config: testAccWorkgroupConfig_baseCapacityAndPubliclyAccessible(rName, 128, false), + Check: resource.ComposeTestCheckFunc( + testAccCheckWorkgroupExists(ctx, resourceName), + resource.TestCheckResourceAttr(resourceName, "base_capacity", "128"), + resource.TestCheckResourceAttr(resourceName, "publicly_accessible", "false"), + ), + }, + }, + }) +} + func TestAccRedshiftServerlessWorkgroup_configParameters(t *testing.T) { ctx := acctest.Context(t) resourceName := "aws_redshiftserverless_workgroup.test" @@ -59,7 +95,7 @@ func TestAccRedshiftServerlessWorkgroup_configParameters(t *testing.T) { CheckDestroy: testAccCheckWorkgroupDestroy(ctx), Steps: []resource.TestStep{ { - Config: testAccWorkgroupConfig_configParameters(rName), + Config: testAccWorkgroupConfig_configParameters(rName, "14400"), Check: resource.ComposeTestCheckFunc( testAccCheckWorkgroupExists(ctx, resourceName), resource.TestCheckResourceAttr(resourceName, "config_parameter.#", "7"), @@ -98,6 +134,41 @@ func TestAccRedshiftServerlessWorkgroup_configParameters(t *testing.T) { ImportState: true, ImportStateVerify: true, }, + { + Config: testAccWorkgroupConfig_configParameters(rName, "28800"), + Check: resource.ComposeTestCheckFunc( + testAccCheckWorkgroupExists(ctx, resourceName), + resource.TestCheckResourceAttr(resourceName, "config_parameter.#", "7"), + resource.TestCheckTypeSetElemNestedAttrs(resourceName, "config_parameter.*", map[string]string{ + "parameter_key": "datestyle", + "parameter_value": "ISO, MDY", + }), + resource.TestCheckTypeSetElemNestedAttrs(resourceName, "config_parameter.*", map[string]string{ + "parameter_key": "enable_user_activity_logging", + "parameter_value": "true", + }), + resource.TestCheckTypeSetElemNestedAttrs(resourceName, "config_parameter.*", map[string]string{ + "parameter_key": "query_group", + "parameter_value": "default", + }), + resource.TestCheckTypeSetElemNestedAttrs(resourceName, "config_parameter.*", map[string]string{ + "parameter_key": "search_path", + "parameter_value": "$user, public", + }), + resource.TestCheckTypeSetElemNestedAttrs(resourceName, "config_parameter.*", map[string]string{ + "parameter_key": "max_query_execution_time", + "parameter_value": "28800", + }), + resource.TestCheckTypeSetElemNestedAttrs(resourceName, "config_parameter.*", map[string]string{ + "parameter_key": "auto_mv", + "parameter_value": "true", + }), + resource.TestCheckTypeSetElemNestedAttrs(resourceName, "config_parameter.*", map[string]string{ + "parameter_key": "enable_case_sensitive_identifier", + "parameter_value": "false", + }), + ), + }, }, }) } @@ -226,7 +297,22 @@ resource "aws_redshiftserverless_workgroup" "test" { `, rName) } -func testAccWorkgroupConfig_configParameters(rName string) string { +func testAccWorkgroupConfig_baseCapacityAndPubliclyAccessible(rName string, baseCapacity int, publiclyAccessible bool) 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 + base_capacity = %[2]d + publicly_accessible = %[3]t +} +`, rName, baseCapacity, publiclyAccessible) +} + +func testAccWorkgroupConfig_configParameters(rName, maxQueryExecutionTime string) string { return fmt.Sprintf(` resource "aws_redshiftserverless_namespace" "test" { namespace_name = %[1]q @@ -254,7 +340,7 @@ resource "aws_redshiftserverless_workgroup" "test" { } config_parameter { parameter_key = "max_query_execution_time" - parameter_value = "14400" + parameter_value = %[2]q } config_parameter { parameter_key = "auto_mv" @@ -265,7 +351,7 @@ resource "aws_redshiftserverless_workgroup" "test" { parameter_value = "false" } } -`, rName) +`, rName, maxQueryExecutionTime) } func testAccWorkgroupConfig_tags1(rName, tagKey1, tagValue1 string) string { From 11b764eecfff125e8d462f6bd59157876c4742a3 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Fri, 2 Jun 2023 15:32:17 -0400 Subject: [PATCH 8/9] r/aws_redshiftserverless_workgroup: Fix 'ValidationException: Can't update multiple configurations at the same time' errors. --- .changelog/#####.txt | 6 +- .../service/redshiftserverless/workgroup.go | 80 ++++++++++++++----- 2 files changed, 67 insertions(+), 19 deletions(-) diff --git a/.changelog/#####.txt b/.changelog/#####.txt index c5dfecafee99..1dc0421ecf8a 100644 --- a/.changelog/#####.txt +++ b/.changelog/#####.txt @@ -2,6 +2,10 @@ resource/aws_redshiftserverless_workgroup: Additional supported values for `config_parameter.parameter_key` ``` -```release-note:enhancement +```release-note:bug resource/aws_redshiftserverless_workgroup: Change `config_parameter` from `TypeList` to `TypeSet` as order is not significant +``` + +```release-note:bug +resource/aws_redshiftserverless_workgroup: Fix `ValidationException: Can't update multiple configurations at the same time` errors ``` \ No newline at end of file diff --git a/internal/service/redshiftserverless/workgroup.go b/internal/service/redshiftserverless/workgroup.go index a17fb5263e6a..f7a2d214826c 100644 --- a/internal/service/redshiftserverless/workgroup.go +++ b/internal/service/redshiftserverless/workgroup.go @@ -2,6 +2,7 @@ package redshiftserverless import ( "context" + "fmt" "log" "time" @@ -277,43 +278,71 @@ func resourceWorkgroupUpdate(ctx context.Context, d *schema.ResourceData, meta i var diags diag.Diagnostics conn := meta.(*conns.AWSClient).RedshiftServerlessConn() - if d.HasChangesExcept("tags", "tags_all") { + // You can't update multiple parameters in one request. + + if d.HasChange("base_capacity") { input := &redshiftserverless.UpdateWorkgroupInput{ + BaseCapacity: aws.Int64(int64(d.Get("base_capacity").(int))), WorkgroupName: aws.String(d.Id()), } - if v, ok := d.GetOk("base_capacity"); ok { - input.BaseCapacity = aws.Int64(int64(v.(int))) + if err := updateWorkgroup(ctx, conn, input, d.Timeout(schema.TimeoutUpdate)); err != nil { + return sdkdiag.AppendFromErr(diags, err) } + } - if v, ok := d.GetOk("config_parameter"); ok && v.(*schema.Set).Len() > 0 { - input.ConfigParameters = expandConfigParameters(v.(*schema.Set).List()) + if d.HasChange("config_parameter") { + input := &redshiftserverless.UpdateWorkgroupInput{ + ConfigParameters: expandConfigParameters(d.Get("config_parameter").(*schema.Set).List()), + WorkgroupName: aws.String(d.Id()), } - if v, ok := d.GetOk("enhanced_vpc_routing"); ok { - input.EnhancedVpcRouting = aws.Bool(v.(bool)) + if err := updateWorkgroup(ctx, conn, input, d.Timeout(schema.TimeoutUpdate)); err != nil { + return sdkdiag.AppendFromErr(diags, err) } + } - if v, ok := d.GetOk("publicly_accessible"); ok { - input.PubliclyAccessible = aws.Bool(v.(bool)) + if d.HasChange("enhanced_vpc_routing") { + input := &redshiftserverless.UpdateWorkgroupInput{ + EnhancedVpcRouting: aws.Bool(d.Get("enhanced_vpc_routing").(bool)), + WorkgroupName: aws.String(d.Id()), } - if v, ok := d.GetOk("security_group_ids"); ok && v.(*schema.Set).Len() > 0 { - input.SecurityGroupIds = flex.ExpandStringSet(v.(*schema.Set)) + if err := updateWorkgroup(ctx, conn, input, d.Timeout(schema.TimeoutUpdate)); err != nil { + return sdkdiag.AppendFromErr(diags, err) } + } - if v, ok := d.GetOk("subnet_ids"); ok && v.(*schema.Set).Len() > 0 { - input.SubnetIds = flex.ExpandStringSet(v.(*schema.Set)) + if d.HasChange("publicly_accessible") { + input := &redshiftserverless.UpdateWorkgroupInput{ + PubliclyAccessible: aws.Bool(d.Get("publicly_accessible").(bool)), + WorkgroupName: aws.String(d.Id()), } - _, err := conn.UpdateWorkgroupWithContext(ctx, input) + if err := updateWorkgroup(ctx, conn, input, d.Timeout(schema.TimeoutUpdate)); err != nil { + return sdkdiag.AppendFromErr(diags, err) + } + } - if err != nil { - return sdkdiag.AppendErrorf(diags, "updating Redshift Serverless Workgroup (%s): %s", d.Id(), err) + if d.HasChange("security_group_ids") { + input := &redshiftserverless.UpdateWorkgroupInput{ + SecurityGroupIds: flex.ExpandStringSet(d.Get("security_group_ids").(*schema.Set)), + WorkgroupName: aws.String(d.Id()), } - if _, err := waitWorkgroupAvailable(ctx, conn, d.Id(), d.Timeout(schema.TimeoutUpdate)); err != nil { - return sdkdiag.AppendErrorf(diags, "waiting for Redshift Serverless Workgroup (%s) update: %s", d.Id(), err) + if err := updateWorkgroup(ctx, conn, input, d.Timeout(schema.TimeoutUpdate)); err != nil { + return sdkdiag.AppendFromErr(diags, err) + } + } + + if d.HasChange("subnet_ids") { + input := &redshiftserverless.UpdateWorkgroupInput{ + SubnetIds: flex.ExpandStringSet(d.Get("subnet_ids").(*schema.Set)), + WorkgroupName: aws.String(d.Id()), + } + + if err := updateWorkgroup(ctx, conn, input, d.Timeout(schema.TimeoutUpdate)); err != nil { + return sdkdiag.AppendFromErr(diags, err) } } @@ -349,6 +378,21 @@ func resourceWorkgroupDelete(ctx context.Context, d *schema.ResourceData, meta i return diags } +func updateWorkgroup(ctx context.Context, conn *redshiftserverless.RedshiftServerless, input *redshiftserverless.UpdateWorkgroupInput, timeout time.Duration) error { + name := aws.StringValue(input.WorkgroupName) + _, err := conn.UpdateWorkgroupWithContext(ctx, input) + + if err != nil { + return fmt.Errorf("updating Redshift Serverless Workgroup (%s): %w", name, err) + } + + if _, err := waitWorkgroupAvailable(ctx, conn, name, timeout); err != nil { + return fmt.Errorf("waiting for Redshift Serverless Workgroup (%s) update: %w", name, err) + } + + return nil +} + func expandConfigParameter(tfMap map[string]interface{}) *redshiftserverless.ConfigParameter { if tfMap == nil { return nil From faf58aac1981717f135c21977e61cbbb30fb7d67 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Fri, 2 Jun 2023 15:56:58 -0400 Subject: [PATCH 9/9] Correct CHANGELOG entry file name. --- .changelog/{#####.txt => 31747.txt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .changelog/{#####.txt => 31747.txt} (100%) diff --git a/.changelog/#####.txt b/.changelog/31747.txt similarity index 100% rename from .changelog/#####.txt rename to .changelog/31747.txt