From 3b0a2008d32042e62b8a23d980c4cbd4382d9e21 Mon Sep 17 00:00:00 2001 From: Kyle Wintaur Date: Fri, 1 Dec 2023 16:42:09 +1100 Subject: [PATCH 1/6] Add log class attribute --- internal/service/logs/group.go | 11 ++++++-- internal/service/logs/group_test.go | 40 +++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/internal/service/logs/group.go b/internal/service/logs/group.go index cbf3e9504ba5..a07464ecbaae 100644 --- a/internal/service/logs/group.go +++ b/internal/service/logs/group.go @@ -61,6 +61,12 @@ func resourceGroup() *schema.Resource { ConflictsWith: []string{"name"}, ValidateFunc: validLogGroupNamePrefix, }, + "log_group_class": { + Type: schema.TypeString, + Optional: true, + Default: "STANDARD", + ValidateFunc: validation.StringInSlice([]string{"STANDARD", "INFREQUENT_ACCESS"}, false), + }, "retention_in_days": { Type: schema.TypeInt, Optional: true, @@ -85,8 +91,9 @@ func resourceGroupCreate(ctx context.Context, d *schema.ResourceData, meta inter name := create.Name(d.Get("name").(string), d.Get("name_prefix").(string)) input := &cloudwatchlogs.CreateLogGroupInput{ - LogGroupName: aws.String(name), - Tags: getTagsIn(ctx), + LogGroupName: aws.String(name), + Tags: getTagsIn(ctx), + LogGroupClass: types.LogGroupClass(d.Get("log_group_class").(string)), } if v, ok := d.GetOk("kms_key_id"); ok { diff --git a/internal/service/logs/group_test.go b/internal/service/logs/group_test.go index 6b5e4ad4a173..ffef25d9ba28 100644 --- a/internal/service/logs/group_test.go +++ b/internal/service/logs/group_test.go @@ -40,6 +40,7 @@ func TestAccLogsGroup_basic(t *testing.T) { resource.TestCheckResourceAttr(resourceName, "name_prefix", ""), resource.TestCheckResourceAttr(resourceName, "retention_in_days", "0"), resource.TestCheckResourceAttr(resourceName, "skip_destroy", "false"), + resource.TestCheckResourceAttr(resourceName, "log_group_class", "STANDARD"), resource.TestCheckResourceAttr(resourceName, "tags.%", "0"), ), }, @@ -227,6 +228,36 @@ func TestAccLogsGroup_kmsKey(t *testing.T) { }) } +func TestAccLogsGroup_logClass(t *testing.T) { + ctx := acctest.Context(t) + var v types.LogGroup + rName := acctest.RandomWithPrefix(t, acctest.ResourcePrefix) + resourceName := "aws_cloudwatch_log_group.test" + + acctest.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(ctx, t) }, + ErrorCheck: acctest.ErrorCheck(t, names.CloudWatchLogsEndpointID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + CheckDestroy: testAccCheckGroupDestroy(ctx, t), + Steps: []resource.TestStep{ + { + Config: testAccGroupConfig_logClass(rName, "STANDARD"), + Check: resource.ComposeTestCheckFunc( + testAccCheckGroupExists(ctx, t, resourceName, &v), + resource.TestCheckResourceAttr(resourceName, "log_group_class", "STANDARD"), + ), + }, + { + Config: testAccGroupConfig_logClass(rName, "INFREQUENT_ACCESS"), + Check: resource.ComposeTestCheckFunc( + testAccCheckGroupExists(ctx, t, resourceName, &v), + resource.TestCheckResourceAttr(resourceName, "log_group_class", "INFREQUENT_ACCESS"), + ), + }, + }, + }) +} + func TestAccLogsGroup_retentionPolicy(t *testing.T) { ctx := acctest.Context(t) var v types.LogGroup @@ -460,6 +491,15 @@ resource "aws_cloudwatch_log_group" "test" { `, rName, idx) } +func testAccGroupConfig_logClass(rName string, val string) string { + return fmt.Sprintf(` +resource "aws_cloudwatch_log_group" "test" { + name = %[1]q + log_group_class = %[2]q +} +`, rName, val) +} + func testAccGroupConfig_retentionPolicy(rName string, val int) string { return fmt.Sprintf(` resource "aws_cloudwatch_log_group" "test" { From 121a53c283ff3bf0dc4c5ca4223f46516a5dbca1 Mon Sep 17 00:00:00 2001 From: Kyle Wintaur Date: Fri, 1 Dec 2023 16:42:22 +1100 Subject: [PATCH 2/6] Update documentation with Cloudwatch Log Group classes --- website/docs/r/cloudwatch_log_group.html.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/website/docs/r/cloudwatch_log_group.html.markdown b/website/docs/r/cloudwatch_log_group.html.markdown index 9a0ef0e52727..127be0a1ae42 100644 --- a/website/docs/r/cloudwatch_log_group.html.markdown +++ b/website/docs/r/cloudwatch_log_group.html.markdown @@ -30,6 +30,7 @@ This resource supports the following arguments: * `name` - (Optional, Forces new resource) The name of the log group. If omitted, Terraform will assign a random, unique name. * `name_prefix` - (Optional, Forces new resource) Creates a unique name beginning with the specified prefix. Conflicts with `name`. * `skip_destroy` - (Optional) Set to true if you do not wish the log group (and any logs it may contain) to be deleted at destroy time, and instead just remove the log group from the Terraform state. +* `log_group_class` - (Optional) Specified the log class of the log group. Possible values are: `STANDARD` or `INFREQUENT_ACCESS`. * `retention_in_days` - (Optional) Specifies the number of days you want to retain log events in the specified log group. Possible values are: 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1096, 1827, 2192, 2557, 2922, 3288, 3653, and 0. If you select 0, the events in the log group are always retained and never expire. From c9b61f8c05377f272026c51edacedd97566c92b8 Mon Sep 17 00:00:00 2001 From: Kyle Wintaur Date: Fri, 1 Dec 2023 16:50:26 +1100 Subject: [PATCH 3/6] Add changelog --- .changelog/34679.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/34679.txt diff --git a/.changelog/34679.txt b/.changelog/34679.txt new file mode 100644 index 000000000000..190efe3c301f --- /dev/null +++ b/.changelog/34679.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/cloudwatch_log_group: Add ability to specify the log class (standard or IA) +``` \ No newline at end of file From 2e895c3345b8b3f06ce7328c134c56586c0d3e62 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Fri, 1 Dec 2023 08:52:10 -0500 Subject: [PATCH 4/6] Tweak CHANGELOG entry. --- .changelog/34679.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changelog/34679.txt b/.changelog/34679.txt index 190efe3c301f..7f364a9e5faf 100644 --- a/.changelog/34679.txt +++ b/.changelog/34679.txt @@ -1,3 +1,3 @@ ```release-note:enhancement -resource/cloudwatch_log_group: Add ability to specify the log class (standard or IA) +resource/aws_cloudwatch_log_group: Add `log_group_class` argument ``` \ No newline at end of file From 1fcba140676c5443ee6aee627fb94e0dbd1b5ce9 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Fri, 1 Dec 2023 08:59:30 -0500 Subject: [PATCH 5/6] r/aws_cloudwatch_log_group: 'log_group_class' is ForceNew. --- internal/service/logs/group.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/internal/service/logs/group.go b/internal/service/logs/group.go index a07464ecbaae..5888f54552cf 100644 --- a/internal/service/logs/group.go +++ b/internal/service/logs/group.go @@ -16,6 +16,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/hashicorp/terraform-provider-aws/internal/conns" "github.com/hashicorp/terraform-provider-aws/internal/create" + "github.com/hashicorp/terraform-provider-aws/internal/enum" "github.com/hashicorp/terraform-provider-aws/internal/errs" tftags "github.com/hashicorp/terraform-provider-aws/internal/tags" "github.com/hashicorp/terraform-provider-aws/internal/tfresource" @@ -45,6 +46,13 @@ func resourceGroup() *schema.Resource { Type: schema.TypeString, Optional: true, }, + "log_group_class": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Default: types.LogGroupClassStandard, + ValidateDiagFunc: enum.Validate[types.LogGroupClass](), + }, "name": { Type: schema.TypeString, Optional: true, @@ -61,12 +69,6 @@ func resourceGroup() *schema.Resource { ConflictsWith: []string{"name"}, ValidateFunc: validLogGroupNamePrefix, }, - "log_group_class": { - Type: schema.TypeString, - Optional: true, - Default: "STANDARD", - ValidateFunc: validation.StringInSlice([]string{"STANDARD", "INFREQUENT_ACCESS"}, false), - }, "retention_in_days": { Type: schema.TypeInt, Optional: true, @@ -91,9 +93,9 @@ func resourceGroupCreate(ctx context.Context, d *schema.ResourceData, meta inter name := create.Name(d.Get("name").(string), d.Get("name_prefix").(string)) input := &cloudwatchlogs.CreateLogGroupInput{ + LogGroupClass: types.LogGroupClass(d.Get("log_group_class").(string)), LogGroupName: aws.String(name), Tags: getTagsIn(ctx), - LogGroupClass: types.LogGroupClass(d.Get("log_group_class").(string)), } if v, ok := d.GetOk("kms_key_id"); ok { @@ -143,6 +145,7 @@ func resourceGroupRead(ctx context.Context, d *schema.ResourceData, meta interfa d.Set("arn", TrimLogGroupARNWildcardSuffix(aws.ToString(lg.Arn))) d.Set("kms_key_id", lg.KmsKeyId) + d.Set("log_group_class", lg.LogGroupClass) d.Set("name", lg.LogGroupName) d.Set("name_prefix", create.NamePrefixFromName(aws.ToString(lg.LogGroupName))) d.Set("retention_in_days", lg.RetentionInDays) From 33cfdc8d3890a1426747cf1e7686ae2a59d38eb1 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Fri, 1 Dec 2023 09:01:39 -0500 Subject: [PATCH 6/6] r/aws_cloudwatch_log_group: Tweak acceptance tests. --- internal/service/logs/group_test.go | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/internal/service/logs/group_test.go b/internal/service/logs/group_test.go index ffef25d9ba28..178fe540e4c8 100644 --- a/internal/service/logs/group_test.go +++ b/internal/service/logs/group_test.go @@ -36,11 +36,11 @@ func TestAccLogsGroup_basic(t *testing.T) { testAccCheckGroupExists(ctx, t, resourceName, &v), acctest.CheckResourceAttrRegionalARN(resourceName, "arn", "logs", fmt.Sprintf("log-group:%s", rName)), resource.TestCheckResourceAttr(resourceName, "kms_key_id", ""), + resource.TestCheckResourceAttr(resourceName, "log_group_class", "STANDARD"), resource.TestCheckResourceAttr(resourceName, "name", rName), resource.TestCheckResourceAttr(resourceName, "name_prefix", ""), resource.TestCheckResourceAttr(resourceName, "retention_in_days", "0"), resource.TestCheckResourceAttr(resourceName, "skip_destroy", "false"), - resource.TestCheckResourceAttr(resourceName, "log_group_class", "STANDARD"), resource.TestCheckResourceAttr(resourceName, "tags.%", "0"), ), }, @@ -228,7 +228,7 @@ func TestAccLogsGroup_kmsKey(t *testing.T) { }) } -func TestAccLogsGroup_logClass(t *testing.T) { +func TestAccLogsGroup_logGroupClass(t *testing.T) { ctx := acctest.Context(t) var v types.LogGroup rName := acctest.RandomWithPrefix(t, acctest.ResourcePrefix) @@ -241,14 +241,7 @@ func TestAccLogsGroup_logClass(t *testing.T) { CheckDestroy: testAccCheckGroupDestroy(ctx, t), Steps: []resource.TestStep{ { - Config: testAccGroupConfig_logClass(rName, "STANDARD"), - Check: resource.ComposeTestCheckFunc( - testAccCheckGroupExists(ctx, t, resourceName, &v), - resource.TestCheckResourceAttr(resourceName, "log_group_class", "STANDARD"), - ), - }, - { - Config: testAccGroupConfig_logClass(rName, "INFREQUENT_ACCESS"), + Config: testAccGroupConfig_logGroupClass(rName, "INFREQUENT_ACCESS"), Check: resource.ComposeTestCheckFunc( testAccCheckGroupExists(ctx, t, resourceName, &v), resource.TestCheckResourceAttr(resourceName, "log_group_class", "INFREQUENT_ACCESS"), @@ -491,7 +484,7 @@ resource "aws_cloudwatch_log_group" "test" { `, rName, idx) } -func testAccGroupConfig_logClass(rName string, val string) string { +func testAccGroupConfig_logGroupClass(rName string, val string) string { return fmt.Sprintf(` resource "aws_cloudwatch_log_group" "test" { name = %[1]q