Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

azurerm_linux_web_app - fix runtime setting for java runtime #18155

Closed
wants to merge 8 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 53 additions & 5 deletions internal/services/appservice/helpers/fx_strings.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,30 @@ func decodeApplicationStackLinux(fxString string) ApplicationStackLinux {

case "JAVA", "TOMCAT", "JBOSSEAP":
result.JavaServer = parts[0]
javaParts := strings.Split(parts[1], "-")
javaData := parts[1]
javaParts := strings.Split(javaData, "-")
if len(javaParts) == 2 {
// e.g. 8-jre8
result.JavaServerVersion = javaParts[0]
result.JavaVersion = javaParts[1]
javaPrefix := []string{"java", "jre"}
if len(strings.Split(javaParts[0], ".")) < 3 {
result.JavaServerVersion = javaParts[0] + "-AUTO-UPDATE"
} else {
result.JavaServerVersion = javaParts[0]
}
for _, prefix := range javaPrefix {
if strings.Contains(javaParts[1], prefix) {
result.JavaVersion = strings.TrimPrefix(javaParts[1], prefix)
break
}
}
} else {
// e.g. 8u242 or 11.0.9
result.JavaVersion = parts[1]
for i, r := range javaData {
if r == '.' || 'a' <= r && r <= 'z' || 'A' <= r && r <= 'Z' {
result.JavaVersion = javaData[:i]
break
}
}
result.JavaServerVersion = javaData
}

case "PHP":
Expand Down Expand Up @@ -237,3 +253,35 @@ func DecodeFunctionAppWindowsFxVersion(input string) ([]ApplicationStackWindowsF

return result, nil
}

func EncodeWebAppLinuxFxVersionForJava(input ApplicationStackLinux) *string {
var javaServer, javaMajorVersion, javaServerVersion string

javaServer = input.JavaServer
javaMajorVersion = input.JavaVersion
javaServerVersion = input.JavaServerVersion

switch {
case javaMajorVersion == "8":
if strings.Contains(javaServerVersion, "AUTO-UPDATE") {
javaServerVersion = strings.TrimSuffix(javaServerVersion, "-AUTO-UPDATE")
if javaServer == "JAVA" || javaServer == "TOMCAT" {
return utils.String(fmt.Sprintf("%s|%s-%s", javaServer, javaServerVersion, "jre8"))
} else {
return utils.String(fmt.Sprintf("%s|%s-%s", javaServer, javaServerVersion, "java8"))
}
} else if javaServer == "TOMCAT" || javaServer == "JBOSSEAP" {
return utils.String(fmt.Sprintf("%s|%s-%s", javaServer, javaServerVersion, "java8"))
}

case javaMajorVersion == "11" || javaMajorVersion == "17":
if strings.Contains(javaServerVersion, "AUTO-UPDATE") || javaServer == "TOMCAT" || javaServer == "JBOSSEAP" {
javaServerVersion = strings.TrimSuffix(javaServerVersion, "-AUTO-UPDATE")
javaSuffix := "java" + javaMajorVersion
return utils.String(fmt.Sprintf("%s|%s-%s", javaServer, javaServerVersion, javaSuffix))
}
}

// defaults to: java|version
return utils.String(fmt.Sprintf("%s|%s", javaServer, javaServerVersion))
}
34 changes: 24 additions & 10 deletions internal/services/appservice/helpers/web_app_schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -1265,10 +1265,15 @@ func linuxApplicationStackSchema() *pluginsdk.Schema {
},
},

// java major version
"java_version": {
Type: pluginsdk.TypeString,
Optional: true,
ValidateFunc: validation.StringIsNotEmpty, // There a significant number of variables here, and the versions are not uniformly formatted.
Type: pluginsdk.TypeString,
Optional: true,
ValidateFunc: validation.StringInSlice([]string{
"8",
"11",
"17",
}, false),
// TODO - Needs notes in the docs for this to help users navigate the inconsistencies in the service. e.g. jre8 va java8 etc
AtLeastOneOf: []string{
"site_config.0.application_stack.0.docker_image",
Expand All @@ -1286,6 +1291,10 @@ func linuxApplicationStackSchema() *pluginsdk.Schema {
"site_config.0.application_stack.0.node_version",
"site_config.0.application_stack.0.ruby_version",
},
RequiredWith: []string{
"site_config.0.application_stack.0.java_server",
"site_config.0.application_stack.0.java_server_version",
},
},

"java_server": {
Expand All @@ -1296,11 +1305,19 @@ func linuxApplicationStackSchema() *pluginsdk.Schema {
"TOMCAT",
"JBOSSEAP",
}, false),
RequiredWith: []string{
"site_config.0.application_stack.0.java_version",
"site_config.0.application_stack.0.java_server_version",
},
},

"java_server_version": {
Type: pluginsdk.TypeString,
Optional: true,
RequiredWith: []string{
"site_config.0.application_stack.0.java_version",
"site_config.0.application_stack.0.java_server",
},
},

"docker_image": {
Expand Down Expand Up @@ -3103,14 +3120,11 @@ func ExpandSiteConfigLinux(siteConfig []SiteConfigLinux, existing *web.SiteConfi
expanded.LinuxFxVersion = utils.String(fmt.Sprintf("PYTHON|%s", linuxAppStack.PythonVersion))
}

if linuxAppStack.JavaServer != "" {
// (@jackofallops) - Java has some special cases for Java SE when using specific versions of the runtime, resulting in this string
// being formatted in the form: `JAVA|u242` instead of the standard pattern of `JAVA|u242-java8` for example. This applies to jre8 and java11.
if linuxAppStack.JavaServer == "JAVA" && linuxAppStack.JavaServerVersion == "" {
expanded.LinuxFxVersion = utils.String(fmt.Sprintf("%s|%s", linuxAppStack.JavaServer, linuxAppStack.JavaVersion))
} else {
expanded.LinuxFxVersion = utils.String(fmt.Sprintf("%s|%s-%s", linuxAppStack.JavaServer, linuxAppStack.JavaServerVersion, linuxAppStack.JavaVersion))
if linuxAppStack.JavaVersion != "" {
if linuxAppStack.JavaVersion == "17" && (linuxAppStack.JavaServer == "JBOSSEAP" || linuxAppStack.JavaServer == "JBOSSEAP-AUTO-UPDATE") {
return nil, fmt.Errorf("Red Hat (JBOSSEAP) sever is not supported in java 17 yet")
}
expanded.LinuxFxVersion = EncodeWebAppLinuxFxVersionForJava(linuxAppStack)
}

if linuxAppStack.DockerImage != "" {
Expand Down
9 changes: 3 additions & 6 deletions internal/services/appservice/helpers/web_app_slot_schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -593,13 +593,10 @@ func ExpandSiteConfigLinuxWebAppSlot(siteConfig []SiteConfigLinuxWebAppSlot, exi
}

if linuxAppStack.JavaServer != "" {
// (@jackofallops) - Java has some special cases for Java SE when using specific versions of the runtime, resulting in this string
// being formatted in the form: `JAVA|u242` instead of the standard pattern of `JAVA|u242-java8` for example. This applies to jre8 and java11.
if linuxAppStack.JavaServer == "JAVA" && linuxAppStack.JavaServerVersion == "" {
expanded.LinuxFxVersion = utils.String(fmt.Sprintf("%s|%s", linuxAppStack.JavaServer, linuxAppStack.JavaVersion))
} else {
expanded.LinuxFxVersion = utils.String(fmt.Sprintf("%s|%s-%s", linuxAppStack.JavaServer, linuxAppStack.JavaServerVersion, linuxAppStack.JavaVersion))
if linuxAppStack.JavaVersion == "17" && (linuxAppStack.JavaServer == "JBOSSEAP" || linuxAppStack.JavaServer == "JBOSSEAP-AUTO-UPDATE") {
return nil, fmt.Errorf("Red Hat (JBOSSEAP) sever is not supported in java 17 yet")
}
expanded.LinuxFxVersion = EncodeWebAppLinuxFxVersionForJava(linuxAppStack)
}

if linuxAppStack.DockerImage != "" {
Expand Down
60 changes: 27 additions & 33 deletions internal/services/appservice/linux_web_app_resource_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -754,7 +754,7 @@ func TestAccLinuxWebApp_withJre8Java(t *testing.T) {

data.ResourceTest(t, r, []acceptance.TestStep{
{
Config: r.java(data, "jre8", "JAVA", "8"),
Config: r.java(data, "8", "JAVA", "8-AUTO-UPDATE"),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
),
Expand All @@ -769,7 +769,7 @@ func TestAccLinuxWebApp_withJre11Java(t *testing.T) {

data.ResourceTest(t, r, []acceptance.TestStep{
{
Config: r.java(data, "java11", "JAVA", "11"),
Config: r.java(data, "11", "JAVA", "11-AUTO-UPDATE"),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
check.That(data.ResourceName).Key("site_config.0.linux_fx_version").HasValue("JAVA|11-java11"),
Expand All @@ -785,7 +785,7 @@ func TestAccLinuxWebApp_withJava1109(t *testing.T) {

data.ResourceTest(t, r, []acceptance.TestStep{
{
Config: r.java(data, "11.0.9", "JAVA", ""),
Config: r.java(data, "11", "JAVA", "11.0.9"),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
check.That(data.ResourceName).Key("site_config.0.linux_fx_version").HasValue("JAVA|11.0.9"),
Expand All @@ -801,7 +801,7 @@ func TestAccLinuxWebApp_withJava8u242(t *testing.T) {

data.ResourceTest(t, r, []acceptance.TestStep{
{
Config: r.java(data, "8u242", "JAVA", ""),
Config: r.java(data, "8", "JAVA", "8u242"),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
check.That(data.ResourceName).Key("site_config.0.linux_fx_version").HasValue("JAVA|8u242"),
Expand All @@ -811,13 +811,29 @@ func TestAccLinuxWebApp_withJava8u242(t *testing.T) {
})
}

func TestAccLinuxWebApp_withJava17AutoUpdate(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_linux_web_app", "test")
r := LinuxWebAppResource{}

data.ResourceTest(t, r, []acceptance.TestStep{
{
Config: r.java(data, "17", "JAVA", "17-AUTO-UPDATE"),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
check.That(data.ResourceName).Key("site_config.0.linux_fx_version").HasValue("JAVA|17-java17"),
),
},
data.ImportStep(),
})
}

func TestAccLinuxWebApp_withJava11Tomcat9(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_linux_web_app", "test")
r := LinuxWebAppResource{}

data.ResourceTest(t, r, []acceptance.TestStep{
{
Config: r.java(data, "java11", "TOMCAT", "9.0"),
Config: r.java(data, "11", "TOMCAT", "9.0-AUTO-UPDATE"),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
check.That(data.ResourceName).Key("site_config.0.linux_fx_version").HasValue("TOMCAT|9.0-java11"),
Expand All @@ -833,7 +849,7 @@ func TestAccLinuxWebApp_withJava11Tomcat9041(t *testing.T) {

data.ResourceTest(t, r, []acceptance.TestStep{
{
Config: r.java(data, "java11", "TOMCAT", "9.0.41"),
Config: r.java(data, "11", "TOMCAT", "9.0.41"),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
check.That(data.ResourceName).Key("site_config.0.linux_fx_version").HasValue("TOMCAT|9.0.41-java11"),
Expand All @@ -849,7 +865,7 @@ func TestAccLinuxWebApp_withJava11Tomcat85(t *testing.T) {

data.ResourceTest(t, r, []acceptance.TestStep{
{
Config: r.java(data, "java11", "TOMCAT", "8.5"),
Config: r.java(data, "11", "TOMCAT", "8.5-AUTO-UPDATE"),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
check.That(data.ResourceName).Key("site_config.0.linux_fx_version").HasValue("TOMCAT|8.5-java11"),
Expand All @@ -865,7 +881,7 @@ func TestAccLinuxWebApp_withJava11Tomcat8561(t *testing.T) {

data.ResourceTest(t, r, []acceptance.TestStep{
{
Config: r.java(data, "java11", "TOMCAT", "8.5.61"),
Config: r.java(data, "11", "TOMCAT", "8.5.61"),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
check.That(data.ResourceName).Key("site_config.0.linux_fx_version").HasValue("TOMCAT|8.5.61-java11"),
Expand All @@ -881,10 +897,10 @@ func TestAccLinuxWebApp_withJava8JBOSSEAP73(t *testing.T) {

data.ResourceTest(t, r, []acceptance.TestStep{
{
Config: r.javaPremiumV3Plan(data, "java8", "JBOSSEAP", "7.3"),
Config: r.javaPremiumV3Plan(data, "8", "JBOSSEAP", "7.3.9"),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
check.That(data.ResourceName).Key("site_config.0.linux_fx_version").HasValue("JBOSSEAP|7.3-java8"),
check.That(data.ResourceName).Key("site_config.0.linux_fx_version").HasValue("JBOSSEAP|7.3.9-java8"),
),
},
data.ImportStep(),
Expand Down Expand Up @@ -924,7 +940,7 @@ func TestAccLinuxWebApp_updateAppStack(t *testing.T) {
},
data.ImportStep(),
{
Config: r.java(data, "java11", "TOMCAT", "9.0"),
Config: r.java(data, "11", "TOMCAT", "9.0-AUTO-UPDATE"),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
check.That(data.ResourceName).Key("site_config.0.linux_fx_version").HasValue("TOMCAT|9.0-java11"),
Expand Down Expand Up @@ -1041,11 +1057,6 @@ func TestAccLinuxWebApp_stickySettings(t *testing.T) {
Config: r.stickySettings(data),
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.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.0").HasValue("First"),
),
},
data.ImportStep(),
Expand All @@ -1061,51 +1072,34 @@ func TestAccLinuxWebApp_stickySettingsUpdate(t *testing.T) {
Config: r.basic(data),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
check.That(data.ResourceName).Key("app_settings").DoesNotExist(),
check.That(data.ResourceName).Key("sticky_settings.#").HasValue("0"),
),
},
data.ImportStep(),
{
Config: r.stickySettings(data),
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.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.0").HasValue("First"),
),
},
data.ImportStep(),
{
Config: r.stickySettingsUpdate(data),
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("3"),
check.That(data.ResourceName).Key("sticky_settings.0.app_setting_names.0").HasValue("foo"),
),
},
data.ImportStep(),
{
Config: r.stickySettings(data),
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.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.0").HasValue("First"),
),
},
data.ImportStep(),
{
Config: r.stickySettingsRemoved(data),
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.#").HasValue("0"),
),
},
data.ImportStep(),
Expand Down
Loading