From dcd1ca3244837d2273d4f15a0593af36e2faad9c Mon Sep 17 00:00:00 2001 From: Bruce Harrison Date: Mon, 12 Feb 2024 14:20:28 -0600 Subject: [PATCH 1/5] apply consistently works, but changes are flagged --- internal/service/datasync/task.go | 82 ++++++++++++++++++++++++------- 1 file changed, 63 insertions(+), 19 deletions(-) diff --git a/internal/service/datasync/task.go b/internal/service/datasync/task.go index 54742ada705..6b7c6087a8d 100644 --- a/internal/service/datasync/task.go +++ b/internal/service/datasync/task.go @@ -294,6 +294,7 @@ func ResourceTask() *schema.Resource { Type: schema.TypeString, Optional: true, ValidateFunc: validation.StringInSlice(datasync.ReportLevel_Values(), false), + Default: datasync.ReportLevelErrorsOnly, }, }, }, @@ -557,22 +558,40 @@ func flattenTaskReportConfig(options *datasync.TaskReportConfig) []interface{} { "output_type": aws.StringValue(options.OutputType), "report_level": aws.StringValue(options.ReportLevel), "s3_destination": flattenTaskReportConfigS3Destination(options.Destination.S3), - "report_overrides": flattenTaskReportConfigReportOverrides(options.Overrides), + "report_overrides": flattenTaskReportConfigReportOverrides(options.Overrides, options.ReportLevel), } return []interface{}{m} } -func flattenTaskReportConfigReportOverrides(options *datasync.ReportOverrides) []interface{} { +func flattenTaskReportConfigReportOverrides(options *datasync.ReportOverrides, defaultReportLevel *string) []interface{} { + // the API does not return the value of this unless it differs from the parent report_level, + // we set it purposefully otherwise changes are flagged + m := map[string]interface{}{ + "deleted_override": defaultReportLevel, + "skipped_override": defaultReportLevel, + "transferred_override": defaultReportLevel, + "verified_override": defaultReportLevel, + } + if options == nil { - return []interface{}{} + return []interface{}{m} } - m := map[string]interface{}{ - "deleted_override": aws.StringValue(options.Deleted.ReportLevel), - "skipped_override": aws.StringValue(options.Skipped.ReportLevel), - "transferred_override": aws.StringValue(options.Transferred.ReportLevel), - "verified_override": aws.StringValue(options.Verified.ReportLevel), + if options.Deleted != nil && options.Deleted.ReportLevel != nil { + m["deleted_override"] = aws.StringValue(options.Deleted.ReportLevel) + } + + if options.Skipped != nil && options.Skipped.ReportLevel != nil { + m["skipped_override"] = aws.StringValue(options.Skipped.ReportLevel) + } + + if options.Transferred != nil && options.Transferred.ReportLevel != nil { + m["transferred_override"] = aws.StringValue(options.Transferred.ReportLevel) + } + + if options.Verified != nil && options.Verified.ReportLevel != nil { + m["verified_override"] = aws.StringValue(options.Verified.ReportLevel) } return []interface{}{m} @@ -666,7 +685,7 @@ func expandTaskReportConfig(l []interface{}) *datasync.TaskReportConfig { reportConfig = reportConfig.SetOutputType(m["output_type"].(string)) reportConfig = reportConfig.SetReportLevel(m["report_level"].(string)) o := m["report_overrides"].([]interface{}) - reportConfig = reportConfig.SetOverrides(expandTaskReportOverrides(o)) + reportConfig = reportConfig.SetOverrides(expandTaskReportOverrides(o, m["report_level"].(string))) return reportConfig } @@ -685,25 +704,50 @@ func expandTaskReportDestination(l []interface{}) *datasync.ReportDestination { } } -func expandTaskReportOverrides(l []interface{}) *datasync.ReportOverrides { - if len(l) == 0 || l[0] == nil { - return nil - } - m := l[0].(map[string]interface{}) - return &datasync.ReportOverrides{ +func expandTaskReportOverrides(l []interface{}, defaultReportLevel string) *datasync.ReportOverrides { + + var overrides = &datasync.ReportOverrides{ Deleted: &datasync.ReportOverride{ - ReportLevel: aws.String(m["deleted_override"].(string)), + ReportLevel: aws.String(defaultReportLevel), }, Skipped: &datasync.ReportOverride{ - ReportLevel: aws.String(m["skipped_override"].(string)), + ReportLevel: aws.String(defaultReportLevel), }, Transferred: &datasync.ReportOverride{ - ReportLevel: aws.String(m["transferred_override"].(string)), + ReportLevel: aws.String(defaultReportLevel), }, Verified: &datasync.ReportOverride{ - ReportLevel: aws.String(m["verified_override"].(string)), + ReportLevel: aws.String(defaultReportLevel), }, } + + if len(l) == 0 || l[0] == nil { + return overrides + } + + m := l[0].(map[string]interface{}) + + deleteOverride := m["deleted_override"].(string) + if deleteOverride != "" { + overrides.Deleted.ReportLevel = aws.String(deleteOverride) + } + + skippedOverride := m["skipped_override"].(string) + if skippedOverride != "" { + overrides.Skipped.ReportLevel = aws.String(skippedOverride) + } + + transferredOverride := m["transferred_override"].(string) + if transferredOverride != "" { + overrides.Transferred.ReportLevel = aws.String(transferredOverride) + } + + verifiedOverride := m["verified_override"].(string) + if verifiedOverride != "" { + overrides.Verified.ReportLevel = aws.String(verifiedOverride) + } + + return overrides } func expandFilterRules(l []interface{}) []*datasync.FilterRule { From 284e3a18caf2229885c59f4f079eec86fd721182 Mon Sep 17 00:00:00 2001 From: Bruce Harrison Date: Mon, 12 Feb 2024 16:42:09 -0600 Subject: [PATCH 2/5] behavior is acceptable --- internal/service/datasync/task.go | 49 ++++++++++++------------------- 1 file changed, 18 insertions(+), 31 deletions(-) diff --git a/internal/service/datasync/task.go b/internal/service/datasync/task.go index 6b7c6087a8d..9fd49392e23 100644 --- a/internal/service/datasync/task.go +++ b/internal/service/datasync/task.go @@ -294,7 +294,6 @@ func ResourceTask() *schema.Resource { Type: schema.TypeString, Optional: true, ValidateFunc: validation.StringInSlice(datasync.ReportLevel_Values(), false), - Default: datasync.ReportLevelErrorsOnly, }, }, }, @@ -558,21 +557,14 @@ func flattenTaskReportConfig(options *datasync.TaskReportConfig) []interface{} { "output_type": aws.StringValue(options.OutputType), "report_level": aws.StringValue(options.ReportLevel), "s3_destination": flattenTaskReportConfigS3Destination(options.Destination.S3), - "report_overrides": flattenTaskReportConfigReportOverrides(options.Overrides, options.ReportLevel), + "report_overrides": flattenTaskReportConfigReportOverrides(options.Overrides), } return []interface{}{m} } -func flattenTaskReportConfigReportOverrides(options *datasync.ReportOverrides, defaultReportLevel *string) []interface{} { - // the API does not return the value of this unless it differs from the parent report_level, - // we set it purposefully otherwise changes are flagged - m := map[string]interface{}{ - "deleted_override": defaultReportLevel, - "skipped_override": defaultReportLevel, - "transferred_override": defaultReportLevel, - "verified_override": defaultReportLevel, - } +func flattenTaskReportConfigReportOverrides(options *datasync.ReportOverrides) []interface{} { + m := make(map[string]interface{}) if options == nil { return []interface{}{m} @@ -685,7 +677,7 @@ func expandTaskReportConfig(l []interface{}) *datasync.TaskReportConfig { reportConfig = reportConfig.SetOutputType(m["output_type"].(string)) reportConfig = reportConfig.SetReportLevel(m["report_level"].(string)) o := m["report_overrides"].([]interface{}) - reportConfig = reportConfig.SetOverrides(expandTaskReportOverrides(o, m["report_level"].(string))) + reportConfig = reportConfig.SetOverrides(expandTaskReportOverrides(o)) return reportConfig } @@ -704,22 +696,9 @@ func expandTaskReportDestination(l []interface{}) *datasync.ReportDestination { } } -func expandTaskReportOverrides(l []interface{}, defaultReportLevel string) *datasync.ReportOverrides { +func expandTaskReportOverrides(l []interface{}) *datasync.ReportOverrides { - var overrides = &datasync.ReportOverrides{ - Deleted: &datasync.ReportOverride{ - ReportLevel: aws.String(defaultReportLevel), - }, - Skipped: &datasync.ReportOverride{ - ReportLevel: aws.String(defaultReportLevel), - }, - Transferred: &datasync.ReportOverride{ - ReportLevel: aws.String(defaultReportLevel), - }, - Verified: &datasync.ReportOverride{ - ReportLevel: aws.String(defaultReportLevel), - }, - } + var overrides = &datasync.ReportOverrides{} if len(l) == 0 || l[0] == nil { return overrides @@ -729,22 +708,30 @@ func expandTaskReportOverrides(l []interface{}, defaultReportLevel string) *data deleteOverride := m["deleted_override"].(string) if deleteOverride != "" { - overrides.Deleted.ReportLevel = aws.String(deleteOverride) + overrides.SetDeleted(&datasync.ReportOverride{ + ReportLevel: aws.String(deleteOverride), + }) } skippedOverride := m["skipped_override"].(string) if skippedOverride != "" { - overrides.Skipped.ReportLevel = aws.String(skippedOverride) + overrides.SetSkipped(&datasync.ReportOverride{ + ReportLevel: aws.String(skippedOverride), + }) } transferredOverride := m["transferred_override"].(string) if transferredOverride != "" { - overrides.Transferred.ReportLevel = aws.String(transferredOverride) + overrides.SetTransferred(&datasync.ReportOverride{ + ReportLevel: aws.String(transferredOverride), + }) } verifiedOverride := m["verified_override"].(string) if verifiedOverride != "" { - overrides.Verified.ReportLevel = aws.String(verifiedOverride) + overrides.SetVerified(&datasync.ReportOverride{ + ReportLevel: aws.String(verifiedOverride), + }) } return overrides From 4149160fc9313783c2bbe50ead5a58e4c8cf8e02 Mon Sep 17 00:00:00 2001 From: Bruce Harrison Date: Mon, 12 Feb 2024 16:45:23 -0600 Subject: [PATCH 3/5] add note to report overrides docs --- website/docs/r/datasync_task.html.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/website/docs/r/datasync_task.html.markdown b/website/docs/r/datasync_task.html.markdown index 08915caa1e4..ae81fb32a9b 100644 --- a/website/docs/r/datasync_task.html.markdown +++ b/website/docs/r/datasync_task.html.markdown @@ -122,6 +122,8 @@ The following arguments are supported inside the `report_overrides` configuratio * `transferred_override` - (Optional) Specifies the level of reporting for the files, objects, and directories that DataSync attempted to transfer. Valid values: `ERRORS_ONLY` and `SUCCESSES_AND_ERRORS`. * `verified_override` - (Optional) Specifies the level of reporting for the files, objects, and directories that DataSync attempted to verify at the end of your transfer. Valid values: `ERRORS_ONLY` and `SUCCESSES_AND_ERRORS`. +~> **NOTE:** If any `report_overrides` are set to the same value as `task_report_config.report_level`, they will always be flagged as changed. Only set overrides to a value that differs from `task_report_config.report_level`. + ### Schedule * `schedule_expression` - (Required) Specifies the schedule you want your task to use for repeated executions. For more information, see [Schedule Expressions for Rules](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html). From 1e7cedcec6aa8c56ff544e9e71ebef7faff53ac3 Mon Sep 17 00:00:00 2001 From: Bruce Harrison Date: Mon, 12 Feb 2024 22:29:51 -0600 Subject: [PATCH 4/5] remove leading newline --- internal/service/datasync/task.go | 1 - 1 file changed, 1 deletion(-) diff --git a/internal/service/datasync/task.go b/internal/service/datasync/task.go index 9fd49392e23..767e40a0af6 100644 --- a/internal/service/datasync/task.go +++ b/internal/service/datasync/task.go @@ -697,7 +697,6 @@ func expandTaskReportDestination(l []interface{}) *datasync.ReportDestination { } func expandTaskReportOverrides(l []interface{}) *datasync.ReportOverrides { - var overrides = &datasync.ReportOverrides{} if len(l) == 0 || l[0] == nil { From 6248752ec85b629cfcd35b616f13dd8bdeb44746 Mon Sep 17 00:00:00 2001 From: Jared Baker Date: Wed, 14 Feb 2024 11:38:19 -0500 Subject: [PATCH 5/5] chore: changelog --- .changelog/35778.txt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changelog/35778.txt diff --git a/.changelog/35778.txt b/.changelog/35778.txt new file mode 100644 index 00000000000..b696ba4dde3 --- /dev/null +++ b/.changelog/35778.txt @@ -0,0 +1,6 @@ +```release-note:bug +resource/aws_datasync_task: Prevent ValidationErrors when empty values are sent with `report_override` arguments +``` +```release-note:bug +resource/aws_datasync_task: Fix crash when reading empty `report_override` values +```