From 576ed2142411faf0befb0cd289dda1e4bbbf2893 Mon Sep 17 00:00:00 2001 From: drfaust92 Date: Fri, 4 Feb 2022 16:54:25 +0200 Subject: [PATCH 1/2] events list + validations --- internal/service/events/target.go | 77 +++++++++++++++++++++++-------- 1 file changed, 58 insertions(+), 19 deletions(-) diff --git a/internal/service/events/target.go b/internal/service/events/target.go index 80536b0014f..2d4f6e8ef84 100644 --- a/internal/service/events/target.go +++ b/internal/service/events/target.go @@ -9,6 +9,8 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/eventbridge" "github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr" + "github.com/hashicorp/go-cty/cty" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" @@ -69,8 +71,12 @@ func ResourceTarget() *schema.Resource { }, "input": { - Type: schema.TypeString, - Optional: true, + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.All( + validation.StringIsJSON, + validation.StringLenBetween(0, 8192), + ), ConflictsWith: []string{"input_path", "input_transformer"}, // We could be normalizing the JSON here, // but for built-in targets input may not be JSON @@ -79,6 +85,7 @@ func ResourceTarget() *schema.Resource { "input_path": { Type: schema.TypeString, Optional: true, + ValidateFunc: validation.StringLenBetween(0, 256), ConflictsWith: []string{"input", "input_transformer"}, }, @@ -102,7 +109,11 @@ func ResourceTarget() *schema.Resource { "values": { Type: schema.TypeList, Required: true, - Elem: &schema.Schema{Type: schema.TypeString}, + MaxItems: 50, + Elem: &schema.Schema{ + Type: schema.TypeString, + ValidateFunc: validation.StringLenBetween(1, 256), + }, }, }, }, @@ -117,15 +128,27 @@ func ResourceTarget() *schema.Resource { "header_parameters": { Type: schema.TypeMap, Optional: true, - Elem: &schema.Schema{Type: schema.TypeString}, + ValidateDiagFunc: allDiagFunc( + validation.MapKeyLenBetween(0, 512), + validation.MapKeyMatch(regexp.MustCompile(`^[!#$%&'*+-.^_|~0-9a-zA-Z]+$`), ""), + validation.MapValueLenBetween(0, 512), + validation.MapValueMatch(regexp.MustCompile(`^[ \t]*[\x20-\x7E]+([ \t]+[\x20-\x7E]+)*[ \t]*$`), ""), + ), + Elem: &schema.Schema{Type: schema.TypeString}, }, "query_string_parameters": { Type: schema.TypeMap, Optional: true, - Elem: &schema.Schema{Type: schema.TypeString}, + ValidateDiagFunc: allDiagFunc( + validation.MapKeyLenBetween(0, 512), + validation.MapKeyMatch(regexp.MustCompile(`[^\x00-\x1F\x7F]+`), ""), + validation.MapValueLenBetween(0, 512), + validation.MapValueMatch(regexp.MustCompile(`[^\x00-\x09\x0B\x0C\x0E-\x1F\x7F]+`), ""), + ), + Elem: &schema.Schema{Type: schema.TypeString}, }, "path_parameter_values": { - Type: schema.TypeSet, + Type: schema.TypeList, Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, }, @@ -281,24 +304,29 @@ func ResourceTarget() *schema.Resource { Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "database": { - Type: schema.TypeString, - Required: true, + Type: schema.TypeString, + Required: true, + ValidateFunc: validation.StringLenBetween(1, 64), }, "db_user": { - Type: schema.TypeString, - Optional: true, + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringLenBetween(1, 128), }, "secrets_manager_arn": { - Type: schema.TypeString, - Optional: true, + Type: schema.TypeString, + Optional: true, + ValidateFunc: verify.ValidARN, }, "sql": { - Type: schema.TypeString, - Optional: true, + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringLenBetween(1, 100000), }, "statement_name": { - Type: schema.TypeString, - Optional: true, + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringLenBetween(1, 500), }, "with_event": { Type: schema.TypeBool, @@ -356,11 +384,12 @@ func ResourceTarget() *schema.Resource { "maximum_event_age_in_seconds": { Type: schema.TypeInt, Optional: true, - ValidateFunc: validation.IntAtLeast(60), + ValidateFunc: validation.IntBetween(0, 86400), }, "maximum_retry_attempts": { - Type: schema.TypeInt, - Optional: true, + Type: schema.TypeInt, + Optional: true, + ValidateFunc: validation.IntBetween(0, 185), }, }, }, @@ -1072,3 +1101,13 @@ func resourceTargetImport(d *schema.ResourceData, meta interface{}) ([]*schema.R return []*schema.ResourceData{d}, nil } + +func allDiagFunc(validators ...schema.SchemaValidateDiagFunc) schema.SchemaValidateDiagFunc { + return func(i interface{}, k cty.Path) diag.Diagnostics { + var diags diag.Diagnostics + for _, validator := range validators { + diags = append(diags, validator(i, k)...) + } + return diags + } +} From 786811fef6bff1f42ab7ac9a8c3e639117d7349f Mon Sep 17 00:00:00 2001 From: drfaust92 Date: Fri, 4 Feb 2022 16:59:58 +0200 Subject: [PATCH 2/2] changelog --- .changelog/22946.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changelog/22946.txt diff --git a/.changelog/22946.txt b/.changelog/22946.txt new file mode 100644 index 00000000000..d9f07d78ce1 --- /dev/null +++ b/.changelog/22946.txt @@ -0,0 +1,7 @@ +```release-note:bug +resource/aws_cloudwatch_event_target: Preserve order of `http_target.path_parameter_values`. +``` + +```release-note:enhancement +resource/aws_cloudwatch_event_target: Add plan time validation for `input`, `input_path`, `run_command_targets.values`, `http_target.header_parameters`, `http_target.query_string_parameters`, `redshift_target.database`, `redshift_target.db_user`, `redshift_target.secrets_manager_arn`, `redshift_target.sql`, `redshift_target.statement_name`, `retry_policy.maximum_event_age_in_seconds`, `retry_policy.maximum_retry_attempts`. +``` \ No newline at end of file