From 109994fefbab2a4faf1060a45939d98367c05d93 Mon Sep 17 00:00:00 2001 From: jbinko Date: Sun, 14 Feb 2021 18:37:26 +0100 Subject: [PATCH] Fix - MariaDB firewall rule name restrictions does not match official (#10579) Minor changes - Fixing this bug: #9799 --- .../mariadb/mariadb_firewall_rule_resource.go | 13 ++--- .../mariadb_firewall_rule_resource_test.go | 2 +- .../mariadb/validate/firewall_rule_name.go | 25 ++++++++ .../validate/firewall_rule_name_test.go | 58 +++++++++++++++++++ .../synapse/validate/firewall_rule_name.go | 4 +- 5 files changed, 90 insertions(+), 12 deletions(-) create mode 100644 azurerm/internal/services/mariadb/validate/firewall_rule_name.go create mode 100644 azurerm/internal/services/mariadb/validate/firewall_rule_name_test.go diff --git a/azurerm/internal/services/mariadb/mariadb_firewall_rule_resource.go b/azurerm/internal/services/mariadb/mariadb_firewall_rule_resource.go index c4c249567869..6fd23231784d 100644 --- a/azurerm/internal/services/mariadb/mariadb_firewall_rule_resource.go +++ b/azurerm/internal/services/mariadb/mariadb_firewall_rule_resource.go @@ -3,12 +3,10 @@ package mariadb import ( "fmt" "log" - "regexp" "time" "github.com/Azure/azure-sdk-for-go/services/mariadb/mgmt/2018-06-01/mariadb" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" - "github.com/hashicorp/terraform-plugin-sdk/helper/validation" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" azValidate "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/validate" @@ -37,13 +35,10 @@ func resourceArmMariaDBFirewallRule() *schema.Resource { Schema: map[string]*schema.Schema{ "name": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - ValidateFunc: validation.StringMatch( - regexp.MustCompile("^[-a-z0-9]{1,128}$"), - "name must be 1-128 characters long and contain only letters, numbers and hyphens", - ), + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: validate.FirewallRuleName, }, "resource_group_name": azure.SchemaResourceGroupName(), diff --git a/azurerm/internal/services/mariadb/mariadb_firewall_rule_resource_test.go b/azurerm/internal/services/mariadb/mariadb_firewall_rule_resource_test.go index 7bcf9482ef4c..e98a8546cf99 100644 --- a/azurerm/internal/services/mariadb/mariadb_firewall_rule_resource_test.go +++ b/azurerm/internal/services/mariadb/mariadb_firewall_rule_resource_test.go @@ -98,7 +98,7 @@ resource "azurerm_mariadb_server" "test" { } resource "azurerm_mariadb_firewall_rule" "test" { - name = "acctestfwrule-%d" + name = "acctestFWRule_01-%d" resource_group_name = "${azurerm_resource_group.test.name}" server_name = "${azurerm_mariadb_server.test.name}" start_ip_address = "0.0.0.0" diff --git a/azurerm/internal/services/mariadb/validate/firewall_rule_name.go b/azurerm/internal/services/mariadb/validate/firewall_rule_name.go new file mode 100644 index 000000000000..59fab3a336f5 --- /dev/null +++ b/azurerm/internal/services/mariadb/validate/firewall_rule_name.go @@ -0,0 +1,25 @@ +package validate + +import ( + "fmt" + "regexp" +) + +func FirewallRuleName(i interface{}, k string) (warnings []string, errors []error) { + v, ok := i.(string) + if !ok { + errors = append(errors, fmt.Errorf("expected type of %s to be string", k)) + return + } + + // The name attribute rules are : + // 1. can contain only letters, numbers, underscore and hyphen. + // 2. The value must be between 1 and 128 characters long + + if !regexp.MustCompile(`^[a-zA-Z\d-_]{1,128}$`).MatchString(v) { + errors = append(errors, fmt.Errorf("%s can contain only letters, numbers, underscore and hyphen, and be between 1 and 128 characters long", k)) + return + } + + return warnings, errors +} diff --git a/azurerm/internal/services/mariadb/validate/firewall_rule_name_test.go b/azurerm/internal/services/mariadb/validate/firewall_rule_name_test.go new file mode 100644 index 000000000000..99064e231dd0 --- /dev/null +++ b/azurerm/internal/services/mariadb/validate/firewall_rule_name_test.go @@ -0,0 +1,58 @@ +package validate + +import ( + "testing" +) + +func TestFirewallRuleName(t *testing.T) { + testData := []struct { + input string + expected bool + }{ + { + // empty + input: "", + expected: false, + }, + { + // basic example + input: "abc123", + expected: true, + }, + { + // can contain underscore + input: "aBc_123", + expected: true, + }, + { + // can contain hyphen + input: "ab-c", + expected: true, + }, + { + // can't contain `*` + input: "abcon*demand", + expected: false, + }, + { + // 128 chars + input: "abcdefghijklmnopqrstuvwxyzabcdefabcdefghijklmnopqrstuvwxyzabcdefabcdefghijklmnopqrstuvwxyzabcdefabcdefghijklmnopqrstuvwxyzabcdef", + expected: true, + }, + { + // 129 chars + input: "abcdefghijklmnopqrstuvwxyzabcdefabcdefghijklmnopqrstuvwxyzabcdefabcdefghijklmnopqrstuvwxyzabcdefabcdefghijklmnopqrstuvwxyzabcdefg", + expected: false, + }, + } + + for _, v := range testData { + t.Logf("[DEBUG] Testing %q..", v.input) + + _, errors := FirewallRuleName(v.input, "name") + actual := len(errors) == 0 + if v.expected != actual { + t.Fatalf("Expected %t but got %t", v.expected, actual) + } + } +} diff --git a/azurerm/internal/services/synapse/validate/firewall_rule_name.go b/azurerm/internal/services/synapse/validate/firewall_rule_name.go index eef7b35e15e8..59fab3a336f5 100644 --- a/azurerm/internal/services/synapse/validate/firewall_rule_name.go +++ b/azurerm/internal/services/synapse/validate/firewall_rule_name.go @@ -13,11 +13,11 @@ func FirewallRuleName(i interface{}, k string) (warnings []string, errors []erro } // The name attribute rules are : - // 1. can contain only letters, numbers, underscore and hythen. + // 1. can contain only letters, numbers, underscore and hyphen. // 2. The value must be between 1 and 128 characters long if !regexp.MustCompile(`^[a-zA-Z\d-_]{1,128}$`).MatchString(v) { - errors = append(errors, fmt.Errorf("%s can contain only letters, numbers, underscore and hythen, and be between 1 and 128 characters long", k)) + errors = append(errors, fmt.Errorf("%s can contain only letters, numbers, underscore and hyphen, and be between 1 and 128 characters long", k)) return }