From bb12c32e9783449786c201185eeb8a63790126a3 Mon Sep 17 00:00:00 2001 From: Yves Vogl Date: Tue, 10 Mar 2020 16:48:27 +0100 Subject: [PATCH 1/5] Adding validation function routing table name and route name (see #6053) --- .../services/network/resource_arm_route.go | 5 +-- .../network/resource_arm_route_table.go | 35 +++++++++++++++++-- azurerm/internal/services/network/validate.go | 30 ++++++++++++++++ 3 files changed, 66 insertions(+), 4 deletions(-) diff --git a/azurerm/internal/services/network/resource_arm_route.go b/azurerm/internal/services/network/resource_arm_route.go index 7cc9d5352056..3f40177ab152 100644 --- a/azurerm/internal/services/network/resource_arm_route.go +++ b/azurerm/internal/services/network/resource_arm_route.go @@ -2,6 +2,7 @@ package network import ( "fmt" + "regexp" "time" "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-09-01/network" @@ -40,7 +41,7 @@ func resourceArmRoute() *schema.Resource { Type: schema.TypeString, Required: true, ForceNew: true, - ValidateFunc: validation.StringIsNotEmpty, + ValidateFunc: validate.ValidateRouteName, }, "resource_group_name": azure.SchemaResourceGroupName(), @@ -49,7 +50,7 @@ func resourceArmRoute() *schema.Resource { Type: schema.TypeString, Required: true, ForceNew: true, - ValidateFunc: validation.StringIsNotEmpty, + ValidateFunc: ValidateName, }, "address_prefix": { diff --git a/azurerm/internal/services/network/resource_arm_route_table.go b/azurerm/internal/services/network/resource_arm_route_table.go index 1929af641129..67dff7bb0cbd 100644 --- a/azurerm/internal/services/network/resource_arm_route_table.go +++ b/azurerm/internal/services/network/resource_arm_route_table.go @@ -3,6 +3,7 @@ package network import ( "fmt" "log" + "regexp" "time" "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-09-01/network" @@ -46,7 +47,7 @@ func resourceArmRouteTable() *schema.Resource { Type: schema.TypeString, Required: true, ForceNew: true, - ValidateFunc: validation.StringIsNotEmpty, + ValidateFunc: ValidateRouteTableName, }, "location": azure.SchemaLocation(), @@ -63,7 +64,7 @@ func resourceArmRouteTable() *schema.Resource { "name": { Type: schema.TypeString, Required: true, - ValidateFunc: validation.StringIsNotEmpty, + ValidateFunc: validate.ValidateRouteName, }, "address_prefix": { @@ -293,3 +294,33 @@ func flattenRouteTableSubnets(subnets *[]network.Subnet) []string { return output } + +func ValidateRouteTableName(v interface{}, k string) (warnings []string, errors []error) { + value := v.(string) + if !regexp.MustCompile(`^[a-zA-Z_0-9.-]+$`).MatchString(value) { + errors = append(errors, fmt.Errorf( + "only word characters, numbers, underscores, periods, and hyphens allowed in %q: %q", + k, value)) + } + + if len(value) > 80 { + errors = append(errors, fmt.Errorf( + "%q cannot be longer than 80 characters: %q", k, value)) + } + + if len(value) == 0 { + errors = append(errors, fmt.Errorf( + "%q cannot be an empty string: %q", k, value)) + } + if !regexp.MustCompile(`[a-zA-Z0-9_]$`).MatchString(value) { + errors = append(errors, fmt.Errorf( + "%q must end with a word character, number, or underscore: %q", k, value)) + } + + if !regexp.MustCompile(`^[a-zA-Z0-9]`).MatchString(value) { + errors = append(errors, fmt.Errorf( + "%q must start with a word character or number: %q", k, value)) + } + + return warnings, errors +} diff --git a/azurerm/internal/services/network/validate.go b/azurerm/internal/services/network/validate.go index 0373e9c4b4a5..5ceb8c4289b4 100644 --- a/azurerm/internal/services/network/validate.go +++ b/azurerm/internal/services/network/validate.go @@ -141,3 +141,33 @@ func ValidatePrivateLinkSubResourceName(i interface{}, k string) (_ []string, er return nil, errors } + +func ValidateRouteName(v interface{}, k string) (warnings []string, errors []error) { + value := v.(string) + if !regexp.MustCompile(`^[a-zA-Z_0-9.-]+$`).MatchString(value) { + errors = append(errors, fmt.Errorf( + "only word characters, numbers, underscores, periods, and hyphens allowed in %q: %q", + k, value)) + } + + if len(value) > 80 { + errors = append(errors, fmt.Errorf( + "%q cannot be longer than 80 characters: %q", k, value)) + } + + if len(value) == 0 { + errors = append(errors, fmt.Errorf( + "%q cannot be an empty string: %q", k, value)) + } + if !regexp.MustCompile(`[a-zA-Z0-9_]$`).MatchString(value) { + errors = append(errors, fmt.Errorf( + "%q must end with a word character, number, or underscore: %q", k, value)) + } + + if !regexp.MustCompile(`^[a-zA-Z0-9]`).MatchString(value) { + errors = append(errors, fmt.Errorf( + "%q must start with a word character or number: %q", k, value)) + } + + return warnings, errors +} From b1f6e7b983628ed5cf8aaf8b69f098480f6a5e3f Mon Sep 17 00:00:00 2001 From: Yves Vogl Date: Fri, 13 Mar 2020 16:02:22 +0100 Subject: [PATCH 2/5] Fixing test failures --- azurerm/internal/services/network/resource_arm_route.go | 5 ++--- .../internal/services/network/resource_arm_route_table.go | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/azurerm/internal/services/network/resource_arm_route.go b/azurerm/internal/services/network/resource_arm_route.go index 3f40177ab152..c85f222e5986 100644 --- a/azurerm/internal/services/network/resource_arm_route.go +++ b/azurerm/internal/services/network/resource_arm_route.go @@ -2,7 +2,6 @@ package network import ( "fmt" - "regexp" "time" "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-09-01/network" @@ -41,7 +40,7 @@ func resourceArmRoute() *schema.Resource { Type: schema.TypeString, Required: true, ForceNew: true, - ValidateFunc: validate.ValidateRouteName, + ValidateFunc: validation.ValidateRouteName, }, "resource_group_name": azure.SchemaResourceGroupName(), @@ -50,7 +49,7 @@ func resourceArmRoute() *schema.Resource { Type: schema.TypeString, Required: true, ForceNew: true, - ValidateFunc: ValidateName, + ValidateFunc: validation.ValidateRouteName, }, "address_prefix": { diff --git a/azurerm/internal/services/network/resource_arm_route_table.go b/azurerm/internal/services/network/resource_arm_route_table.go index 67dff7bb0cbd..426a7292bba5 100644 --- a/azurerm/internal/services/network/resource_arm_route_table.go +++ b/azurerm/internal/services/network/resource_arm_route_table.go @@ -64,7 +64,7 @@ func resourceArmRouteTable() *schema.Resource { "name": { Type: schema.TypeString, Required: true, - ValidateFunc: validate.ValidateRouteName, + ValidateFunc: validation.ValidateRouteName, }, "address_prefix": { From 1171852a49fd85285fde34fa5abf5e9d1bda39b4 Mon Sep 17 00:00:00 2001 From: Yves Vogl Date: Fri, 13 Mar 2020 16:19:22 +0100 Subject: [PATCH 3/5] I hope nobody sees how I'm fiddling around here /o\ --- .../services/network/resource_arm_route.go | 4 +-- .../network/resource_arm_route_table.go | 33 +------------------ azurerm/internal/services/network/validate.go | 30 +++++++++++++++++ 3 files changed, 33 insertions(+), 34 deletions(-) diff --git a/azurerm/internal/services/network/resource_arm_route.go b/azurerm/internal/services/network/resource_arm_route.go index c85f222e5986..08d7aaf88da3 100644 --- a/azurerm/internal/services/network/resource_arm_route.go +++ b/azurerm/internal/services/network/resource_arm_route.go @@ -40,7 +40,7 @@ func resourceArmRoute() *schema.Resource { Type: schema.TypeString, Required: true, ForceNew: true, - ValidateFunc: validation.ValidateRouteName, + ValidateFunc: ValidateRouteName, }, "resource_group_name": azure.SchemaResourceGroupName(), @@ -49,7 +49,7 @@ func resourceArmRoute() *schema.Resource { Type: schema.TypeString, Required: true, ForceNew: true, - ValidateFunc: validation.ValidateRouteName, + ValidateFunc: ValidateRouteTableName, }, "address_prefix": { diff --git a/azurerm/internal/services/network/resource_arm_route_table.go b/azurerm/internal/services/network/resource_arm_route_table.go index 426a7292bba5..356e7729e5dd 100644 --- a/azurerm/internal/services/network/resource_arm_route_table.go +++ b/azurerm/internal/services/network/resource_arm_route_table.go @@ -3,7 +3,6 @@ package network import ( "fmt" "log" - "regexp" "time" "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-09-01/network" @@ -64,7 +63,7 @@ func resourceArmRouteTable() *schema.Resource { "name": { Type: schema.TypeString, Required: true, - ValidateFunc: validation.ValidateRouteName, + ValidateFunc: ValidateRouteName, }, "address_prefix": { @@ -294,33 +293,3 @@ func flattenRouteTableSubnets(subnets *[]network.Subnet) []string { return output } - -func ValidateRouteTableName(v interface{}, k string) (warnings []string, errors []error) { - value := v.(string) - if !regexp.MustCompile(`^[a-zA-Z_0-9.-]+$`).MatchString(value) { - errors = append(errors, fmt.Errorf( - "only word characters, numbers, underscores, periods, and hyphens allowed in %q: %q", - k, value)) - } - - if len(value) > 80 { - errors = append(errors, fmt.Errorf( - "%q cannot be longer than 80 characters: %q", k, value)) - } - - if len(value) == 0 { - errors = append(errors, fmt.Errorf( - "%q cannot be an empty string: %q", k, value)) - } - if !regexp.MustCompile(`[a-zA-Z0-9_]$`).MatchString(value) { - errors = append(errors, fmt.Errorf( - "%q must end with a word character, number, or underscore: %q", k, value)) - } - - if !regexp.MustCompile(`^[a-zA-Z0-9]`).MatchString(value) { - errors = append(errors, fmt.Errorf( - "%q must start with a word character or number: %q", k, value)) - } - - return warnings, errors -} diff --git a/azurerm/internal/services/network/validate.go b/azurerm/internal/services/network/validate.go index 5ceb8c4289b4..d18573fc3b93 100644 --- a/azurerm/internal/services/network/validate.go +++ b/azurerm/internal/services/network/validate.go @@ -142,6 +142,36 @@ func ValidatePrivateLinkSubResourceName(i interface{}, k string) (_ []string, er return nil, errors } +func ValidateRouteTableName(v interface{}, k string) (warnings []string, errors []error) { + value := v.(string) + if !regexp.MustCompile(`^[a-zA-Z_0-9.-]+$`).MatchString(value) { + errors = append(errors, fmt.Errorf( + "only word characters, numbers, underscores, periods, and hyphens allowed in %q: %q", + k, value)) + } + + if len(value) > 80 { + errors = append(errors, fmt.Errorf( + "%q cannot be longer than 80 characters: %q", k, value)) + } + + if len(value) == 0 { + errors = append(errors, fmt.Errorf( + "%q cannot be an empty string: %q", k, value)) + } + if !regexp.MustCompile(`[a-zA-Z0-9_]$`).MatchString(value) { + errors = append(errors, fmt.Errorf( + "%q must end with a word character, number, or underscore: %q", k, value)) + } + + if !regexp.MustCompile(`^[a-zA-Z0-9]`).MatchString(value) { + errors = append(errors, fmt.Errorf( + "%q must start with a word character or number: %q", k, value)) + } + + return warnings, errors +} + func ValidateRouteName(v interface{}, k string) (warnings []string, errors []error) { value := v.(string) if !regexp.MustCompile(`^[a-zA-Z_0-9.-]+$`).MatchString(value) { From f9fa19bc67230134653c5970713f3b7ec101ed13 Mon Sep 17 00:00:00 2001 From: Yves Vogl <39190668+yves-vogl@users.noreply.github.com> Date: Thu, 16 Apr 2020 12:57:08 +0200 Subject: [PATCH 4/5] Update azurerm/internal/services/network/validate.go Co-Authored-By: Steve <11830746+jackofallops@users.noreply.github.com> --- azurerm/internal/services/network/validate.go | 25 ++----------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/azurerm/internal/services/network/validate.go b/azurerm/internal/services/network/validate.go index d18573fc3b93..a16e201c20be 100644 --- a/azurerm/internal/services/network/validate.go +++ b/azurerm/internal/services/network/validate.go @@ -144,29 +144,8 @@ func ValidatePrivateLinkSubResourceName(i interface{}, k string) (_ []string, er func ValidateRouteTableName(v interface{}, k string) (warnings []string, errors []error) { value := v.(string) - if !regexp.MustCompile(`^[a-zA-Z_0-9.-]+$`).MatchString(value) { - errors = append(errors, fmt.Errorf( - "only word characters, numbers, underscores, periods, and hyphens allowed in %q: %q", - k, value)) - } - - if len(value) > 80 { - errors = append(errors, fmt.Errorf( - "%q cannot be longer than 80 characters: %q", k, value)) - } - - if len(value) == 0 { - errors = append(errors, fmt.Errorf( - "%q cannot be an empty string: %q", k, value)) - } - if !regexp.MustCompile(`[a-zA-Z0-9_]$`).MatchString(value) { - errors = append(errors, fmt.Errorf( - "%q must end with a word character, number, or underscore: %q", k, value)) - } - - if !regexp.MustCompile(`^[a-zA-Z0-9]`).MatchString(value) { - errors = append(errors, fmt.Errorf( - "%q must start with a word character or number: %q", k, value)) + if !regexp.MustCompile(`^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,78}[a-zA-Z0-9_]?$`).MatchString(value) { + errors = append(errors, fmt.Errorf("%q should be between 1 and 80 characters, start with an alphanumeric, end with an alphanumeric or underscore and can contain alphanumerics, underscores, periods, and hyphens", k)) } return warnings, errors From f88b9c61c90cd47c3ae8c50bdf348ca7c35bf14d Mon Sep 17 00:00:00 2001 From: Yves Vogl <39190668+yves-vogl@users.noreply.github.com> Date: Thu, 16 Apr 2020 12:57:19 +0200 Subject: [PATCH 5/5] Update azurerm/internal/services/network/validate.go Co-Authored-By: Steve <11830746+jackofallops@users.noreply.github.com> --- azurerm/internal/services/network/validate.go | 26 ++----------------- 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/azurerm/internal/services/network/validate.go b/azurerm/internal/services/network/validate.go index a16e201c20be..d8b5fb1ee5e1 100644 --- a/azurerm/internal/services/network/validate.go +++ b/azurerm/internal/services/network/validate.go @@ -153,30 +153,8 @@ func ValidateRouteTableName(v interface{}, k string) (warnings []string, errors func ValidateRouteName(v interface{}, k string) (warnings []string, errors []error) { value := v.(string) - if !regexp.MustCompile(`^[a-zA-Z_0-9.-]+$`).MatchString(value) { - errors = append(errors, fmt.Errorf( - "only word characters, numbers, underscores, periods, and hyphens allowed in %q: %q", - k, value)) - } - - if len(value) > 80 { - errors = append(errors, fmt.Errorf( - "%q cannot be longer than 80 characters: %q", k, value)) - } - - if len(value) == 0 { - errors = append(errors, fmt.Errorf( - "%q cannot be an empty string: %q", k, value)) - } - if !regexp.MustCompile(`[a-zA-Z0-9_]$`).MatchString(value) { - errors = append(errors, fmt.Errorf( - "%q must end with a word character, number, or underscore: %q", k, value)) - } - - if !regexp.MustCompile(`^[a-zA-Z0-9]`).MatchString(value) { - errors = append(errors, fmt.Errorf( - "%q must start with a word character or number: %q", k, value)) + if !regexp.MustCompile(`^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,78}[a-zA-Z0-9_]?$`).MatchString(value) { + errors = append(errors, fmt.Errorf("%q should be between 1 and 80 characters, start with an alphanumeric, end with an alphanumeric or underscore and can contain alphanumerics, underscores, periods, and hyphens", k)) } - return warnings, errors }