From dcb643f35ae2df1503ae449726e78556f1ef21d1 Mon Sep 17 00:00:00 2001 From: Stephen Jennings Date: Fri, 10 Jun 2022 15:10:56 -0700 Subject: [PATCH 1/2] remove validation of app service sticky setting names This validation is too strict. The Azure Portal allows the following name for both app settings and connection strings: A test: !@#$%^&*()_+-=' ";/? I can't find a reference for what the valid character set would be, and the names in the app_settings attribute aren't validated at all, so we may as well remove this validation. Fixes #16612 --- .../appservice/helpers/shared_schema.go | 3 --- .../appservice/validate/app_setting_name.go | 20 ------------------- 2 files changed, 23 deletions(-) delete mode 100644 internal/services/appservice/validate/app_setting_name.go diff --git a/internal/services/appservice/helpers/shared_schema.go b/internal/services/appservice/helpers/shared_schema.go index cf752a860da3..25ffbea489c6 100644 --- a/internal/services/appservice/helpers/shared_schema.go +++ b/internal/services/appservice/helpers/shared_schema.go @@ -5,7 +5,6 @@ import ( "strings" "github.com/Azure/azure-sdk-for-go/services/web/mgmt/2021-02-01/web" - appserviceValidate "github.com/hashicorp/terraform-provider-azurerm/internal/services/appservice/validate" networkValidate "github.com/hashicorp/terraform-provider-azurerm/internal/services/network/validate" "github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk" "github.com/hashicorp/terraform-provider-azurerm/internal/tf/validation" @@ -1554,7 +1553,6 @@ func StickySettingsSchema() *pluginsdk.Schema { Optional: true, Elem: &pluginsdk.Schema{ Type: pluginsdk.TypeString, - ValidateFunc: appserviceValidate.AppSettingName, }, AtLeastOneOf: []string{ "sticky_settings.0.app_setting_names", @@ -1568,7 +1566,6 @@ func StickySettingsSchema() *pluginsdk.Schema { Optional: true, Elem: &pluginsdk.Schema{ Type: pluginsdk.TypeString, - ValidateFunc: appserviceValidate.AppSettingName, }, AtLeastOneOf: []string{ "sticky_settings.0.app_setting_names", diff --git a/internal/services/appservice/validate/app_setting_name.go b/internal/services/appservice/validate/app_setting_name.go deleted file mode 100644 index 21c2129ecac5..000000000000 --- a/internal/services/appservice/validate/app_setting_name.go +++ /dev/null @@ -1,20 +0,0 @@ -package validate - -import ( - "fmt" - "regexp" -) - -func AppSettingName(i interface{}, k string) (warnings []string, errors []error) { - v, ok := i.(string) - if !ok { - errors = append(errors, fmt.Errorf("expected %q to be a string", k)) - return - } - - if matched := regexp.MustCompile(`^[0-9a-zA-Z._]+$`).Match([]byte(v)); !matched { - errors = append(errors, fmt.Errorf("%q may only contain alphanumeric characters, periods and underscores", k)) - } - - return -} From 67a19be8d169ad5d9f45f33be15456801a95c1b8 Mon Sep 17 00:00:00 2001 From: Stephen Jennings Date: Wed, 22 Jun 2022 14:02:45 -0700 Subject: [PATCH 2/2] add non-empty validation for sticky_settings names --- .../appservice/helpers/shared_schema.go | 2 ++ .../windows_function_app_resource_test.go | 29 ++++++++++++------- .../windows_web_app_resource_test.go | 29 ++++++++++++------- 3 files changed, 38 insertions(+), 22 deletions(-) diff --git a/internal/services/appservice/helpers/shared_schema.go b/internal/services/appservice/helpers/shared_schema.go index 25ffbea489c6..f7be2aa54c3f 100644 --- a/internal/services/appservice/helpers/shared_schema.go +++ b/internal/services/appservice/helpers/shared_schema.go @@ -1553,6 +1553,7 @@ func StickySettingsSchema() *pluginsdk.Schema { Optional: true, Elem: &pluginsdk.Schema{ Type: pluginsdk.TypeString, + ValidateFunc: validation.StringIsNotEmpty, }, AtLeastOneOf: []string{ "sticky_settings.0.app_setting_names", @@ -1566,6 +1567,7 @@ func StickySettingsSchema() *pluginsdk.Schema { Optional: true, Elem: &pluginsdk.Schema{ Type: pluginsdk.TypeString, + ValidateFunc: validation.StringIsNotEmpty, }, AtLeastOneOf: []string{ "sticky_settings.0.app_setting_names", diff --git a/internal/services/appservice/windows_function_app_resource_test.go b/internal/services/appservice/windows_function_app_resource_test.go index 041acd390f9d..0da8da2a56d8 100644 --- a/internal/services/appservice/windows_function_app_resource_test.go +++ b/internal/services/appservice/windows_function_app_resource_test.go @@ -275,9 +275,9 @@ func TestAccWindowsFunctionApp_stickySettings(t *testing.T) { Check: acceptance.ComposeTestCheckFunc( check.That(data.ResourceName).ExistsInAzure(r), check.That(data.ResourceName).Key("app_settings.foo").HasValue("bar"), - check.That(data.ResourceName).Key("sticky_settings.0.app_setting_names.#").HasValue("2"), + check.That(data.ResourceName).Key("sticky_settings.0.app_setting_names.#").HasValue("3"), check.That(data.ResourceName).Key("sticky_settings.0.app_setting_names.0").HasValue("foo"), - check.That(data.ResourceName).Key("sticky_settings.0.connection_string_names.#").HasValue("2"), + check.That(data.ResourceName).Key("sticky_settings.0.connection_string_names.#").HasValue("3"), check.That(data.ResourceName).Key("sticky_settings.0.connection_string_names.0").HasValue("First"), ), }, @@ -304,9 +304,9 @@ func TestAccWindowsFunctionApp_stickySettingsUpdate(t *testing.T) { Check: acceptance.ComposeTestCheckFunc( check.That(data.ResourceName).ExistsInAzure(r), check.That(data.ResourceName).Key("app_settings.foo").HasValue("bar"), - check.That(data.ResourceName).Key("sticky_settings.0.app_setting_names.#").HasValue("2"), + check.That(data.ResourceName).Key("sticky_settings.0.app_setting_names.#").HasValue("3"), check.That(data.ResourceName).Key("sticky_settings.0.app_setting_names.0").HasValue("foo"), - check.That(data.ResourceName).Key("sticky_settings.0.connection_string_names.#").HasValue("2"), + check.That(data.ResourceName).Key("sticky_settings.0.connection_string_names.#").HasValue("3"), check.That(data.ResourceName).Key("sticky_settings.0.connection_string_names.0").HasValue("First"), ), }, @@ -328,9 +328,9 @@ func TestAccWindowsFunctionApp_stickySettingsUpdate(t *testing.T) { Check: acceptance.ComposeTestCheckFunc( check.That(data.ResourceName).ExistsInAzure(r), check.That(data.ResourceName).Key("app_settings.foo").HasValue("bar"), - check.That(data.ResourceName).Key("sticky_settings.0.app_setting_names.#").HasValue("2"), + check.That(data.ResourceName).Key("sticky_settings.0.app_setting_names.#").HasValue("3"), check.That(data.ResourceName).Key("sticky_settings.0.app_setting_names.0").HasValue("foo"), - check.That(data.ResourceName).Key("sticky_settings.0.connection_string_names.#").HasValue("2"), + check.That(data.ResourceName).Key("sticky_settings.0.connection_string_names.#").HasValue("3"), check.That(data.ResourceName).Key("sticky_settings.0.connection_string_names.0").HasValue("First"), ), }, @@ -1256,9 +1256,10 @@ resource "azurerm_windows_function_app" "test" { site_config {} app_settings = { - foo = "bar" - secret = "sauce" - third = "degree" + foo = "bar" + secret = "sauce" + third = "degree" + "Special chars: !@#$%%^&*()_+-=' \";/?" = "Supported by the Azure portal" } connection_string { @@ -1279,9 +1280,15 @@ resource "azurerm_windows_function_app" "test" { type = "PostgreSQL" } + connection_string { + name = "Special chars: !@#$%%^&*()_+-=' \";/?" + value = "characters-supported-by-the-Azure-portal" + type = "Custom" + } + sticky_settings { - app_setting_names = ["foo", "secret"] - connection_string_names = ["First", "Third"] + app_setting_names = ["foo", "secret", "Special chars: !@#$%%^&*()_+-=' \";/?"] + connection_string_names = ["First", "Third", "Special chars: !@#$%%^&*()_+-=' \";/?"] } } `, r.template(data, SkuStandardPlan), data.RandomInteger) diff --git a/internal/services/appservice/windows_web_app_resource_test.go b/internal/services/appservice/windows_web_app_resource_test.go index 4e81f57b4386..06523123333d 100644 --- a/internal/services/appservice/windows_web_app_resource_test.go +++ b/internal/services/appservice/windows_web_app_resource_test.go @@ -920,9 +920,9 @@ func TestAccWindowsWebApp_stickySettings(t *testing.T) { Check: acceptance.ComposeTestCheckFunc( check.That(data.ResourceName).ExistsInAzure(r), check.That(data.ResourceName).Key("app_settings.foo").HasValue("bar"), - check.That(data.ResourceName).Key("sticky_settings.0.app_setting_names.#").HasValue("2"), + check.That(data.ResourceName).Key("sticky_settings.0.app_setting_names.#").HasValue("3"), check.That(data.ResourceName).Key("sticky_settings.0.app_setting_names.0").HasValue("foo"), - check.That(data.ResourceName).Key("sticky_settings.0.connection_string_names.#").HasValue("2"), + check.That(data.ResourceName).Key("sticky_settings.0.connection_string_names.#").HasValue("3"), check.That(data.ResourceName).Key("sticky_settings.0.connection_string_names.0").HasValue("First"), ), }, @@ -949,9 +949,9 @@ func TestAccWindowsWebApp_stickySettingsUpdate(t *testing.T) { Check: acceptance.ComposeTestCheckFunc( check.That(data.ResourceName).ExistsInAzure(r), check.That(data.ResourceName).Key("app_settings.foo").HasValue("bar"), - check.That(data.ResourceName).Key("sticky_settings.0.app_setting_names.#").HasValue("2"), + check.That(data.ResourceName).Key("sticky_settings.0.app_setting_names.#").HasValue("3"), check.That(data.ResourceName).Key("sticky_settings.0.app_setting_names.0").HasValue("foo"), - check.That(data.ResourceName).Key("sticky_settings.0.connection_string_names.#").HasValue("2"), + check.That(data.ResourceName).Key("sticky_settings.0.connection_string_names.#").HasValue("3"), check.That(data.ResourceName).Key("sticky_settings.0.connection_string_names.0").HasValue("First"), ), }, @@ -973,9 +973,9 @@ func TestAccWindowsWebApp_stickySettingsUpdate(t *testing.T) { Check: acceptance.ComposeTestCheckFunc( check.That(data.ResourceName).ExistsInAzure(r), check.That(data.ResourceName).Key("app_settings.foo").HasValue("bar"), - check.That(data.ResourceName).Key("sticky_settings.0.app_setting_names.#").HasValue("2"), + check.That(data.ResourceName).Key("sticky_settings.0.app_setting_names.#").HasValue("3"), check.That(data.ResourceName).Key("sticky_settings.0.app_setting_names.0").HasValue("foo"), - check.That(data.ResourceName).Key("sticky_settings.0.connection_string_names.#").HasValue("2"), + check.That(data.ResourceName).Key("sticky_settings.0.connection_string_names.#").HasValue("3"), check.That(data.ResourceName).Key("sticky_settings.0.connection_string_names.0").HasValue("First"), ), }, @@ -2460,9 +2460,10 @@ resource "azurerm_windows_web_app" "test" { site_config {} app_settings = { - foo = "bar" - secret = "sauce" - third = "degree" + foo = "bar" + secret = "sauce" + third = "degree" + "Special chars: !@#$%%^&*()_+-=' \";/?" = "Supported by the Azure portal" } connection_string { @@ -2483,9 +2484,15 @@ resource "azurerm_windows_web_app" "test" { type = "PostgreSQL" } + connection_string { + name = "Special chars: !@#$%%^&*()_+-=' \";/?" + value = "characters-supported-by-the-Azure-portal" + type = "Custom" + } + sticky_settings { - app_setting_names = ["foo", "secret"] - connection_string_names = ["First", "Third"] + app_setting_names = ["foo", "secret", "Special chars: !@#$%%^&*()_+-=' \";/?"] + connection_string_names = ["First", "Third", "Special chars: !@#$%%^&*()_+-=' \";/?"] } } `, r.baseTemplate(data), data.RandomInteger)