From 0deeacb6023d7815414c66873f129dd985e26cd9 Mon Sep 17 00:00:00 2001 From: Igor Borsutsky Date: Wed, 27 Aug 2025 16:55:10 +0300 Subject: [PATCH 1/9] javaooptions changes --- chart/templates/backend-deployment.yaml | 11 +-- chart/templates/crons/deployment.yaml | 4 +- chart/templates/helpers/_helpers.tpl | 82 ++++++++++++++++++++++- chart/templates/keycloak-statefulset.yaml | 10 ++- 4 files changed, 87 insertions(+), 20 deletions(-) diff --git a/chart/templates/backend-deployment.yaml b/chart/templates/backend-deployment.yaml index 0913650..7e6d8a2 100644 --- a/chart/templates/backend-deployment.yaml +++ b/chart/templates/backend-deployment.yaml @@ -145,15 +145,10 @@ spec: - name: SPRING_PROFILES_ACTIVE value: "prod,swagger,cluster" {{- if .Values.deployments.backend.extraEnvs }} - {{- toYaml .Values.deployments.backend.extraEnvs | nindent 12 }} - {{- if not (include "list-of-maps-contains" (list .Values.deployments.backend.extraEnvs "_JAVA_OPTIONS") ) }} - - name: "_JAVA_OPTIONS" - value: {{- toYaml (include "calculate-heap-size" .Values.deployments.backend) | nindent 21 }} - {{- end }} - {{- else }} - - name: "_JAVA_OPTIONS" - value: {{- toYaml (include "calculate-heap-size" .Values.deployments.backend) | nindent 21 }} + {{- include "filter-out-java-options" .Values.deployments.backend.extraEnvs | nindent 12 }} {{- end }} + - name: "_JAVA_OPTIONS" + value: {{- toYaml (include "compose-java-options" (list .Values.deployments.backend (include "get-java-options-from-envs" .Values.deployments.backend.extraEnvs))) | nindent 21 }} # waiting for mysql, rabbitmq and keycloak initialization initContainers: diff --git a/chart/templates/crons/deployment.yaml b/chart/templates/crons/deployment.yaml index b0c8225..108bd5e 100644 --- a/chart/templates/crons/deployment.yaml +++ b/chart/templates/crons/deployment.yaml @@ -140,10 +140,8 @@ spec: {{- if $mergedExtraEnvs }} {{ $mergedExtraEnvs | nindent 12 }} {{- end }} - {{- if and (not (include "list-of-maps-contains" (list .Values.deployments.crons.extraEnvs "_JAVA_OPTIONS"))) (not (include "list-of-maps-contains" (list .Values.deployments.backend.extraEnvs "_JAVA_OPTIONS"))) }} - name: "_JAVA_OPTIONS" - value: {{- toYaml (include "calculate-heap-size" (list .Values.deployments.crons 1 3)) | nindent 21 }} - {{- end }} + value: {{- toYaml (include "compose-java-options" (list .Values.deployments.crons (include "lightrun-crons.getMergedJavaOptions" .) 1 3)) | nindent 21 }} # waiting for mysql, rabbitmq and keycloak initialization initContainers: diff --git a/chart/templates/helpers/_helpers.tpl b/chart/templates/helpers/_helpers.tpl index 9e6ae47..948cee8 100644 --- a/chart/templates/helpers/_helpers.tpl +++ b/chart/templates/helpers/_helpers.tpl @@ -572,6 +572,63 @@ false {{- printf "-Xmx%vm -Xms%vm" $heap $xms -}} {{- end -}} +{{/* +Build final JAVA options string according to the rules: + - If user provided -Xms and/or -Xmx, use exactly what they provided and do not add the missing pair + - If neither -Xms nor -Xmx were provided, calculate both and append any additional user options +Usage: + {{ include "compose-java-options" (list $deployment $userOptions) }} + {{ include "compose-java-options" (list $deployment $userOptions 1 3) }} # with ratios +*/}} +{{- define "compose-java-options" -}} +{{- $deployment := index . 0 -}} +{{- $userOptions := index . 1 | default "" -}} +{{- $xmsRatio := 1 -}} +{{- $xmxRatio := 1 -}} +{{- if ge (len .) 3 -}} + {{- $xmsRatio = index . 2 | int -}} +{{- end -}} +{{- if ge (len .) 4 -}} + {{- $xmxRatio = index . 3 | int -}} +{{- end -}} +{{- $hasXms := and $userOptions (contains "-Xms" $userOptions) -}} +{{- $hasXmx := and $userOptions (contains "-Xmx" $userOptions) -}} +{{- if or $hasXms $hasXmx -}} +{{- $userOptions -}} +{{- else -}} +{{- $calculated := include "calculate-heap-size" (list $deployment $xmsRatio $xmxRatio) -}} +{{- printf "%s %s" $calculated $userOptions | trim -}} +{{- end -}} +{{- end -}} + +{{/* Extract JAVA options value from a list of env maps */}} +{{- define "get-java-options-from-envs" -}} +{{- $envs := . | default list -}} +{{- $opts := "" -}} +{{- range $envs -}} + {{- if or (eq .name "_JAVA_OPTIONS") (eq .name "JAVA_OPTIONS") -}} + {{- if .value -}} + {{- $opts = .value -}} + {{- end -}} + {{- end -}} +{{- end -}} +{{- $opts -}} +{{- end -}} + +{{/* Return env list without any JAVA options entries */}} +{{- define "filter-out-java-options" -}} +{{- $envs := . | default list -}} +{{- $out := list -}} +{{- range $envs -}} + {{- if and (ne .name "_JAVA_OPTIONS") (ne .name "JAVA_OPTIONS") -}} + {{- $out = append $out . -}} + {{- end -}} +{{- end -}} +{{- if $out -}} +{{- toYaml $out -}} +{{- end -}} +{{- end -}} + {{- define "list-of-maps-contains" }} {{- $arg1 := index . 0 }} {{- $arg2 := index . 1 }} @@ -852,7 +909,8 @@ Cron-specific asyncProfiler helpers {{- end -}} {{/* -Merge extraEnvs from backend and crons with crons taking precedence for duplicate keys +Merge extraEnvs from backend and crons with crons taking precedence for duplicate keys. +JAVA options are intentionally filtered out and should be added explicitly by templates. */}} {{- define "lightrun-crons.mergedExtraEnvs" -}} {{- $backendExtraEnvs := .Values.deployments.backend.extraEnvs | default list -}} @@ -871,13 +929,17 @@ Merge extraEnvs from backend and crons with crons taking precedence for duplicat {{- end -}} {{/* Only add backend env if not overridden by crons */}} {{- if not $isOverridden -}} -{{- $mergedEnvs = append $mergedEnvs $backendEnv -}} +{{- if and (ne $backendEnv.name "_JAVA_OPTIONS") (ne $backendEnv.name "JAVA_OPTIONS") -}} + {{- $mergedEnvs = append $mergedEnvs $backendEnv -}} + {{- end -}} {{- end -}} {{- end -}} {{/* Then, add all crons extraEnvs (these take precedence) */}} {{- range $cronsExtraEnvs -}} -{{- $mergedEnvs = append $mergedEnvs . -}} +{{- if and (ne .name "_JAVA_OPTIONS") (ne .name "JAVA_OPTIONS") -}} + {{- $mergedEnvs = append $mergedEnvs . -}} + {{- end -}} {{- end -}} {{/* Output merged envs as YAML if any exist */}} @@ -886,6 +948,20 @@ Merge extraEnvs from backend and crons with crons taking precedence for duplicat {{- end -}} {{- end -}} + +{{/* Get merged JAVA options from backend+crons with crons taking precedence */}} +{{- define "lightrun-crons.getMergedJavaOptions" -}} +{{- $backendExtraEnvs := .Values.deployments.backend.extraEnvs | default list -}} +{{- $cronsExtraEnvs := .Values.deployments.crons.extraEnvs | default list -}} +{{- $opts := include "get-java-options-from-envs" $backendExtraEnvs -}} +{{- $cronsOpts := include "get-java-options-from-envs" $cronsExtraEnvs -}} +{{- if $cronsOpts -}} +{{- $cronsOpts -}} +{{- else -}} +{{- $opts -}} +{{- end -}} +{{- end -}} + {{/* ################ ### Datadog ### diff --git a/chart/templates/keycloak-statefulset.yaml b/chart/templates/keycloak-statefulset.yaml index c31fec8..809df3b 100644 --- a/chart/templates/keycloak-statefulset.yaml +++ b/chart/templates/keycloak-statefulset.yaml @@ -301,11 +301,11 @@ spec: - name: JAVASCRIPT_FILES value: js/keycloak.js {{- if .Values.deployments.keycloak.extraEnvs }} - {{- toYaml .Values.deployments.keycloak.extraEnvs | nindent 12 }} - {{- if not (include "list-of-maps-contains" (list .Values.deployments.keycloak.extraEnvs "_JAVA_OPTIONS") ) }} + {{- include "filter-out-java-options" .Values.deployments.keycloak.extraEnvs | nindent 12 }} + {{- end }} - name: "_JAVA_OPTIONS" - value: {{- toYaml (include "calculate-heap-size" .Values.deployments.keycloak) | nindent 21 }} - {{- end }} + value: {{- toYaml (include "compose-java-options" (list .Values.deployments.keycloak (include "get-java-options-from-envs" .Values.deployments.keycloak.extraEnvs))) | nindent 21 }} + {{- if .Values.deployments.keycloak.extraEnvs }} {{- if not (include "list-of-maps-contains" (list .Values.deployments.keycloak.extraEnvs "KC_HOSTNAME") ) }} {{- if semverCompare ">=1.38.0" $version }} - name: KC_HOSTNAME @@ -316,8 +316,6 @@ spec: {{- end }} {{- end }} {{- else }} - - name: "_JAVA_OPTIONS" - value: {{- toYaml (include "calculate-heap-size" .Values.deployments.keycloak) | nindent 21 }} {{- if semverCompare ">=1.38.0" $version }} - name: KC_HOSTNAME value: 'https://{{ .Values.general.lightrun_endpoint }}/auth' From 71a8d884cc11af7ee0a13929f14b0301f9e577a6 Mon Sep 17 00:00:00 2001 From: Igor Borsutsky Date: Tue, 9 Sep 2025 11:53:03 -0400 Subject: [PATCH 2/9] java_options allows to set custom parameters --- chart/templates/backend-deployment.yaml | 31 ++- chart/templates/crons/deployment.yaml | 50 ++++- chart/templates/helpers/_helpers.tpl | 248 +++++++++++++--------- chart/templates/keycloak-statefulset.yaml | 98 +++++---- 4 files changed, 270 insertions(+), 157 deletions(-) diff --git a/chart/templates/backend-deployment.yaml b/chart/templates/backend-deployment.yaml index 7e6d8a2..ddd7866 100644 --- a/chart/templates/backend-deployment.yaml +++ b/chart/templates/backend-deployment.yaml @@ -144,11 +144,32 @@ spec: {{- include "lightrun-backend-crons.environmentVariables" . | nindent 12 }} - name: SPRING_PROFILES_ACTIVE value: "prod,swagger,cluster" - {{- if .Values.deployments.backend.extraEnvs }} - {{- include "filter-out-java-options" .Values.deployments.backend.extraEnvs | nindent 12 }} - {{- end }} - - name: "_JAVA_OPTIONS" - value: {{- toYaml (include "compose-java-options" (list .Values.deployments.backend (include "get-java-options-from-envs" .Values.deployments.backend.extraEnvs))) | nindent 21 }} +{{- /* >>> BEGIN updated env-emitting block <<< */}} +{{- $envs := .Values.deployments.backend.extraEnvs | default (list) -}} +{{- $memMi := include "mem-to-mi" (.Values.deployments.backend.resources.memory | default "") | int -}} +{{- $javaVal := (include "get-env" (list $envs "_JAVA_OPTIONS") | trim) -}} + +{{- /* start with user extraEnvs, but drop _JAVA_OPTIONS */ -}} +{{- $rendered := list -}} +{{- range $e := $envs -}} + {{- $name := $e.name | default "" -}} + {{- if ne $name "_JAVA_OPTIONS" -}} + {{- $rendered = append $rendered $e -}} + {{- end -}} +{{- end -}} + +{{- /* add enhanced _JAVA_OPTIONS calculation */ -}} +{{- $enhancedJavaOpts := include "calculate-enhanced-java-options" (dict "deployment" .Values.deployments.backend "existingJavaOpts" $javaVal) -}} +{{- if ne $enhancedJavaOpts "" -}} + {{- $rendered = append $rendered (dict "name" "_JAVA_OPTIONS" "value" $enhancedJavaOpts) -}} +{{- else if eq $javaVal "" -}} + {{- $rendered = append $rendered (dict "name" "_JAVA_OPTIONS" "value" "") -}} +{{- end -}} + +{{- if $rendered }} +{{ toYaml $rendered | nindent 12 }} +{{- end }} +{{- /* >>> END updated env-emitting block <<< */}} # waiting for mysql, rabbitmq and keycloak initialization initContainers: diff --git a/chart/templates/crons/deployment.yaml b/chart/templates/crons/deployment.yaml index 108bd5e..6466d25 100644 --- a/chart/templates/crons/deployment.yaml +++ b/chart/templates/crons/deployment.yaml @@ -136,12 +136,52 @@ spec: {{- include "lightrun-backend-crons.environmentVariables" . | nindent 12 }} - name: SPRING_PROFILES_ACTIVE value: "prod,swagger,cluster,cron" - {{- $mergedExtraEnvs := include "lightrun-crons.mergedExtraEnvs" . }} - {{- if $mergedExtraEnvs }} -{{ $mergedExtraEnvs | nindent 12 }} + {{- /* Enhanced _JAVA_OPTIONS logic for crons */ -}} + {{- $backendExtraEnvs := .Values.deployments.backend.extraEnvs | default list -}} + {{- $cronsExtraEnvs := .Values.deployments.crons.extraEnvs | default list -}} + {{- $mergedEnvs := list -}} + {{- $javaVal := "" -}} + + {{- /* First, add all backend extraEnvs except _JAVA_OPTIONS */ -}} + {{- range $backendExtraEnvs -}} + {{- $backendEnv := . -}} + {{- $isOverridden := false -}} + {{- if eq $backendEnv.name "_JAVA_OPTIONS" -}} + {{- $javaVal = (printf "%v" $backendEnv.value) -}} + {{- else -}} + {{- /* Check if this env var is overridden in crons */ -}} + {{- range $cronsExtraEnvs -}} + {{- if eq .name $backendEnv.name -}} + {{- $isOverridden = true -}} + {{- end -}} + {{- end -}} + {{- /* Only add backend env if not overridden by crons */ -}} + {{- if not $isOverridden -}} + {{- $mergedEnvs = append $mergedEnvs $backendEnv -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- /* Then, add all crons extraEnvs except _JAVA_OPTIONS */ -}} + {{- range $cronsExtraEnvs -}} + {{- if eq .name "_JAVA_OPTIONS" -}} + {{- $javaVal = (printf "%v" .value) -}} + {{- else -}} + {{- $mergedEnvs = append $mergedEnvs . -}} + {{- end -}} + {{- end -}} + + {{- /* Add enhanced _JAVA_OPTIONS calculation */ -}} + {{- $enhancedJavaOpts := include "calculate-enhanced-java-options" (dict "deployment" .Values.deployments.crons "existingJavaOpts" $javaVal) -}} + {{- if ne $enhancedJavaOpts "" -}} + {{- $mergedEnvs = append $mergedEnvs (dict "name" "_JAVA_OPTIONS" "value" $enhancedJavaOpts) -}} + {{- else if eq $javaVal "" -}} + {{- $mergedEnvs = append $mergedEnvs (dict "name" "_JAVA_OPTIONS" "value" "") -}} + {{- end -}} + + {{- if $mergedEnvs }} +{{ toYaml $mergedEnvs | nindent 12 }} {{- end }} - - name: "_JAVA_OPTIONS" - value: {{- toYaml (include "compose-java-options" (list .Values.deployments.crons (include "lightrun-crons.getMergedJavaOptions" .) 1 3)) | nindent 21 }} # waiting for mysql, rabbitmq and keycloak initialization initContainers: diff --git a/chart/templates/helpers/_helpers.tpl b/chart/templates/helpers/_helpers.tpl index 948cee8..8943add 100644 --- a/chart/templates/helpers/_helpers.tpl +++ b/chart/templates/helpers/_helpers.tpl @@ -539,105 +539,170 @@ false ##################### */}} -{{- define "calculate-heap-size" -}} -{{- $deployment := . -}} -{{- $xmsRatio := 1 -}} -{{- $xmxRatio := 1 -}} -{{- $heap:= "" -}} -{{- $xms:= "" -}} -{{/* Check if called with parameters: deployment, xmsRatio, xmxRatio */}} -{{- if kindIs "slice" . -}} - {{- $deployment = index . 0 -}} - {{- if ge (len .) 2 -}} - {{- $xmsRatio = index . 1 | int -}} - {{- end -}} - {{- if ge (len .) 3 -}} - {{- $xmxRatio = index . 2 | int -}} - {{- end -}} -{{- end -}} -{{/* Validate ratios - only allow sensible ratios like 1:1, 1:2, 1:3, 1:4, 1:5 */}} -{{- if ne $xmsRatio 1 -}} - {{- fail "calculate-heap-size: xmsRatio must be 1. Only ratios like 1:1, 1:2, 1:3, 1:4, 1:5 are supported." -}} +{{- /* Convert a memory string like "1024Mi" or "2Gi" to Mi (int). Unknown/empty -> 0 */ -}} +{{- define "mem-to-mi" -}} +{{- $m := . | default "" -}} +{{- if $m | hasSuffix "Gi" -}} +{{- mul (trimSuffix "Gi" $m | int) 1024 -}} +{{- else if $m | hasSuffix "Mi" -}} +{{- trimSuffix "Mi" $m | int -}} +{{- else -}} +0 {{- end -}} -{{- if or (lt $xmxRatio 1) (gt $xmxRatio 5) -}} - {{- fail "calculate-heap-size: xmxRatio must be between 1 and 5. Only ratios like 1:1, 1:2, 1:3, 1:4, 1:5 are supported." -}} {{- end -}} -{{- if contains "Gi" $deployment.resources.memory -}} - {{- $heap = div ($deployment.resources.memory | replace "Gi" "" | int | mul 1024 | mul 75 ) 100 -}} -{{- else if contains "Mi" $deployment.resources.memory -}} - {{- $heap = div ($deployment.resources.memory | replace "Mi" "" | int | mul 75) 100 -}} + +{{- define "get-env" -}} +{{- $list := index . 0 -}} +{{- $name := index . 1 -}} +{{- $out := "" -}} +{{- range $list -}} + {{- if and (hasKey . "name") (eq .name $name) -}} + {{- if hasKey . "value" -}} + {{- $out = (printf "%v" .value) -}} + {{- else -}} + {{- $out = "" -}} + {{- end -}} + {{- end -}} {{- end -}} -{{/* Calculate Xms = Xmx / xmxRatio */}} -{{- $xms = div $heap $xmxRatio -}} -{{- printf "-Xmx%vm -Xms%vm" $heap $xms -}} +{{- $out -}} {{- end -}} -{{/* -Build final JAVA options string according to the rules: - - If user provided -Xms and/or -Xmx, use exactly what they provided and do not add the missing pair - - If neither -Xms nor -Xmx were provided, calculate both and append any additional user options -Usage: - {{ include "compose-java-options" (list $deployment $userOptions) }} - {{ include "compose-java-options" (list $deployment $userOptions 1 3) }} # with ratios -*/}} -{{- define "compose-java-options" -}} -{{- $deployment := index . 0 -}} -{{- $userOptions := index . 1 | default "" -}} +{{- define "calculate-heap-size" -}} +{{- $deployment := . -}} {{- $xmsRatio := 1 -}} {{- $xmxRatio := 1 -}} -{{- if ge (len .) 3 -}} - {{- $xmsRatio = index . 2 | int -}} -{{- end -}} -{{- if ge (len .) 4 -}} - {{- $xmxRatio = index . 3 | int -}} +{{- if kindIs "slice" . -}} + {{- $deployment = index . 0 -}} + {{- if ge (len .) 2 -}}{{- $xmsRatio = index . 1 | int -}}{{- end -}} + {{- if ge (len .) 3 -}}{{- $xmxRatio = index . 2 | int -}}{{- end -}} {{- end -}} -{{- $hasXms := and $userOptions (contains "-Xms" $userOptions) -}} -{{- $hasXmx := and $userOptions (contains "-Xmx" $userOptions) -}} -{{- if or $hasXms $hasXmx -}} -{{- $userOptions -}} +{{- if ne $xmsRatio 1 -}}{{- fail "calculate-heap-size: xmsRatio must be 1 (supported: 1:1..1:5)" -}}{{- end -}} +{{- if or (lt $xmxRatio 1) (gt $xmxRatio 5) -}}{{- fail "calculate-heap-size: xmxRatio must be 1..5 (supported: 1:1..1:5)" -}}{{- end -}} + +{{- $memMi := include "mem-to-mi" ($deployment.resources.memory | default "") | int -}} +{{- if le $memMi 0 -}} +{{- "" -}} {{- else -}} -{{- $calculated := include "calculate-heap-size" (list $deployment $xmsRatio $xmxRatio) -}} -{{- printf "%s %s" $calculated $userOptions | trim -}} -{{- end -}} + {{- $xmx := div (mul $memMi 75) 100 -}} {{/* 75% of container memory */}} + {{- $xms := div $xmx $xmxRatio -}} {{/* Xms = Xmx / xmxRatio */}} + {{- printf "-Xmx%vm -Xms%vm" $xmx $xms -}} +{{- end -}} +{{- end -}} + +{{- /* Parse existing _JAVA_OPTIONS to extract Xms and Xmx values */ -}} +{{- define "parse-java-options" -}} +{{- $javaOpts := . | default "" -}} +{{- $xms := "" -}} +{{- $xmx := "" -}} +{{- $otherOpts := "" -}} +{{- if ne $javaOpts "" -}} + {{- $parts := split " " $javaOpts -}} + {{- range $parts -}} + {{- $part := . | trim -}} + {{- if hasPrefix "-Xms" $part -}} + {{- $xms = $part -}} + {{- else if hasPrefix "-Xmx" $part -}} + {{- $xmx = $part -}} + {{- else if ne $part "" -}} + {{- if eq $otherOpts "" -}} + {{- $otherOpts = $part -}} + {{- else -}} + {{- $otherOpts = printf "%s %s" $otherOpts $part -}} + {{- end -}} + {{- end -}} + {{- end -}} {{- end -}} - -{{/* Extract JAVA options value from a list of env maps */}} -{{- define "get-java-options-from-envs" -}} -{{- $envs := . | default list -}} -{{- $opts := "" -}} -{{- range $envs -}} - {{- if or (eq .name "_JAVA_OPTIONS") (eq .name "JAVA_OPTIONS") -}} - {{- if .value -}} - {{- $opts = .value -}} +{{- printf "%s|%s|%s" $xms $xmx $otherOpts -}} +{{- end -}} + +{{- /* Calculate enhanced _JAVA_OPTIONS based on existing options and memory */ -}} +{{- define "calculate-enhanced-java-options" -}} +{{- $deployment := .deployment -}} +{{- $existingJavaOpts := .existingJavaOpts | default "" -}} +{{- $memMi := include "mem-to-mi" ($deployment.resources.memory | default "") | int -}} + +{{- $hasXms := false -}} +{{- $hasXmx := false -}} +{{- $existingXms := "" -}} +{{- $existingXmx := "" -}} +{{- $otherOpts := "" -}} + +{{- /* Parse existing options */ -}} +{{- if ne $existingJavaOpts "" -}} + {{- $parts := split " " $existingJavaOpts -}} + {{- range $parts -}} + {{- $part := . | trim -}} + {{- if or (hasPrefix "-Xms" $part) (hasPrefix "Xms" $part) -}} + {{- $hasXms = true -}} + {{- if hasPrefix "-Xms" $part -}} + {{- $existingXms = $part -}} + {{- else -}} + {{- $existingXms = printf "-%s" $part -}} + {{- end -}} + {{- else if or (hasPrefix "-Xmx" $part) (hasPrefix "Xmx" $part) -}} + {{- $hasXmx = true -}} + {{- if hasPrefix "-Xmx" $part -}} + {{- $existingXmx = $part -}} + {{- else -}} + {{- $existingXmx = printf "-%s" $part -}} + {{- end -}} + {{- else if ne $part "" -}} + {{- if eq $otherOpts "" -}} + {{- $otherOpts = $part -}} + {{- else -}} + {{- $otherOpts = printf "%s %s" $otherOpts $part -}} + {{- end -}} {{- end -}} {{- end -}} {{- end -}} -{{- $opts -}} + +{{- $result := "" -}} +{{- $xms := "" -}} +{{- $xmx := "" -}} + +{{- /* Calculate Xms and Xmx only if memory > 0 AND neither Xms nor Xmx is provided by user */ -}} +{{- if and (gt $memMi 0) (not $hasXms) (not $hasXmx) -}} + {{- $calculatedXmx := div (mul $memMi 75) 100 -}} + {{- $calculatedXms := $calculatedXmx -}} + {{- $xms = printf "-Xms%vm" $calculatedXms -}} + {{- $xmx = printf "-Xmx%vm" $calculatedXmx -}} +{{- else -}} + {{- /* Use existing values if provided, do not calculate missing ones */ -}} + {{- if $hasXms -}}{{- $xms = $existingXms -}}{{- end -}} + {{- if $hasXmx -}}{{- $xmx = $existingXmx -}}{{- end -}} {{- end -}} -{{/* Return env list without any JAVA options entries */}} -{{- define "filter-out-java-options" -}} -{{- $envs := . | default list -}} -{{- $out := list -}} -{{- range $envs -}} - {{- if and (ne .name "_JAVA_OPTIONS") (ne .name "JAVA_OPTIONS") -}} - {{- $out = append $out . -}} +{{- /* Build the final result */ -}} +{{- if ne $xms "" -}} + {{- $result = $xms -}} +{{- end -}} +{{- if ne $xmx "" -}} + {{- if ne $result "" -}} + {{- $result = printf "%s %s" $result $xmx -}} + {{- else -}} + {{- $result = $xmx -}} {{- end -}} {{- end -}} -{{- if $out -}} -{{- toYaml $out -}} +{{- if ne $otherOpts "" -}} + {{- if ne $result "" -}} + {{- $result = printf "%s %s" $result $otherOpts -}} + {{- else -}} + {{- $result = $otherOpts -}} + {{- end -}} {{- end -}} + +{{- $result -}} +{{- end -}} + +{{- /* Unchanged: check if a list of {name,value} maps contains a given name */ -}} +{{- define "list-of-maps-contains" -}} + {{- $arg1 := index . 0 -}} + {{- $arg2 := index . 1 -}} + {{- range $arg1 -}} + {{- if eq .name $arg2 -}}true{{- end -}} + {{- end -}} {{- end -}} -{{- define "list-of-maps-contains" }} - {{- $arg1 := index . 0 }} - {{- $arg2 := index . 1 }} - {{- range $arg1 }} - {{- if eq .name $arg2 }} - true - {{- end }} - {{- end }} -{{- end }} {{/* @@ -909,8 +974,7 @@ Cron-specific asyncProfiler helpers {{- end -}} {{/* -Merge extraEnvs from backend and crons with crons taking precedence for duplicate keys. -JAVA options are intentionally filtered out and should be added explicitly by templates. +Merge extraEnvs from backend and crons with crons taking precedence for duplicate keys */}} {{- define "lightrun-crons.mergedExtraEnvs" -}} {{- $backendExtraEnvs := .Values.deployments.backend.extraEnvs | default list -}} @@ -929,17 +993,13 @@ JAVA options are intentionally filtered out and should be added explicitly by te {{- end -}} {{/* Only add backend env if not overridden by crons */}} {{- if not $isOverridden -}} -{{- if and (ne $backendEnv.name "_JAVA_OPTIONS") (ne $backendEnv.name "JAVA_OPTIONS") -}} - {{- $mergedEnvs = append $mergedEnvs $backendEnv -}} - {{- end -}} +{{- $mergedEnvs = append $mergedEnvs $backendEnv -}} {{- end -}} {{- end -}} {{/* Then, add all crons extraEnvs (these take precedence) */}} {{- range $cronsExtraEnvs -}} -{{- if and (ne .name "_JAVA_OPTIONS") (ne .name "JAVA_OPTIONS") -}} - {{- $mergedEnvs = append $mergedEnvs . -}} - {{- end -}} +{{- $mergedEnvs = append $mergedEnvs . -}} {{- end -}} {{/* Output merged envs as YAML if any exist */}} @@ -948,20 +1008,6 @@ JAVA options are intentionally filtered out and should be added explicitly by te {{- end -}} {{- end -}} - -{{/* Get merged JAVA options from backend+crons with crons taking precedence */}} -{{- define "lightrun-crons.getMergedJavaOptions" -}} -{{- $backendExtraEnvs := .Values.deployments.backend.extraEnvs | default list -}} -{{- $cronsExtraEnvs := .Values.deployments.crons.extraEnvs | default list -}} -{{- $opts := include "get-java-options-from-envs" $backendExtraEnvs -}} -{{- $cronsOpts := include "get-java-options-from-envs" $cronsExtraEnvs -}} -{{- if $cronsOpts -}} -{{- $cronsOpts -}} -{{- else -}} -{{- $opts -}} -{{- end -}} -{{- end -}} - {{/* ################ ### Datadog ### diff --git a/chart/templates/keycloak-statefulset.yaml b/chart/templates/keycloak-statefulset.yaml index 809df3b..87b8a66 100644 --- a/chart/templates/keycloak-statefulset.yaml +++ b/chart/templates/keycloak-statefulset.yaml @@ -11,10 +11,8 @@ metadata: {{- end }} spec: serviceName: {{ include "lightrun-keycloak.name" . }} - updateStrategy: + updateStrategy: type: RollingUpdate - # For clusters with more than 3 pods, consider changing the number of "owner nodes" as described in - # https://www.keycloak.org/server/caching#_configuring_caches -> Configuring caches for availability replicas: {{ .Values.deployments.keycloak.replicas }} selector: matchLabels: @@ -30,7 +28,6 @@ spec: annotations: {{- end }} {{- with .Values.deployments.keycloak.annotations }} - {{/* deprecated if favor of podAnnotations */}} {{ toYaml . | nindent 8 }} {{- end }} {{- with .Values.deployments.keycloak.podAnnotations }} @@ -55,7 +52,6 @@ spec: {{- toYaml .Values.deployments.keycloak.podSecurityContext | nindent 8 }} {{- end }} containers: - {{- include "lightrun-keycloak.container.persist-async-profiler-output-files" . | indent 8 }} - name: {{ include "lightrun-keycloak.name" . }} securityContext: {{- include "lightrun-keycloak.containerSecurityContext" . | indent 12 }} @@ -71,7 +67,7 @@ spec: ports: - name: mgmt containerPort: 9000 - protocol: TCP + protocol: TCP - name: http containerPort: 9080 protocol: TCP @@ -214,15 +210,15 @@ spec: secretKeyRef: name: {{ include "secrets.backend.name" . }} key: SPRING_RABBITMQ_PASSWORD - {{- end }} + {{- end }} - name: INFO_DEPLOYMENT - {{ if eq .Values.general.deployment_type "saas" }} + {{- if eq .Values.general.deployment_type "saas" }} value: "SaaS" - {{ else if eq .Values.general.deployment_type "single-tenant" }} + {{- else if eq .Values.general.deployment_type "single-tenant" }} value: "single-tenant" - {{ else }} + {{- else }} value: "on-prem" - {{ end }} + {{- end }} - name: KC_PROXY_HEADERS value: "xforwarded" - name: KC_BOOTSTRAP_ADMIN_USERNAME @@ -235,12 +231,12 @@ spec: secretKeyRef: name: {{ include "secrets.keycloak.name" . }} key: KEYCLOAK_PASSWORD - {{ if .Values.general.internal_tls.enabled }} + {{- if .Values.general.internal_tls.enabled }} - name: KC_HTTPS_CERTIFICATE_FILE value: /etc/x509/https/tls.crt - name: KC_HTTPS_CERTIFICATE_KEY_FILE value: /etc/x509/https/tls.key - {{- if and .Values.deployments.keycloak.clusterMode (eq .Values.general.internal_tls.certificates.source "existing_certificates") }} + {{- if and .Values.deployments.keycloak.clusterMode (eq .Values.general.internal_tls.certificates.source "existing_certificates") }} - name: KC_CACHE_EMBEDDED_MTLS_ENABLED value: "true" - name: KC_CACHE_EMBEDDED_MTLS_KEY_STORE_FILE @@ -258,12 +254,12 @@ spec: name: {{ include "secrets.backend.name" . }} key: KEYSTORE_PASSWORD {{- end }} - {{ else }} + {{- else }} - name: KC_HTTPS_CERTIFICATE_FILE - name: KC_HTTPS_CERTIFICATE_KEY_FILE - name: KC_HTTP_ENABLED value: "true" - {{ end }} + {{- end }} - name: KC_DB value: mysql - name: KC_DB_URL @@ -300,30 +296,45 @@ spec: {{- end }} - name: JAVASCRIPT_FILES value: js/keycloak.js - {{- if .Values.deployments.keycloak.extraEnvs }} - {{- include "filter-out-java-options" .Values.deployments.keycloak.extraEnvs | nindent 12 }} - {{- end }} - - name: "_JAVA_OPTIONS" - value: {{- toYaml (include "compose-java-options" (list .Values.deployments.keycloak (include "get-java-options-from-envs" .Values.deployments.keycloak.extraEnvs))) | nindent 21 }} - {{- if .Values.deployments.keycloak.extraEnvs }} - {{- if not (include "list-of-maps-contains" (list .Values.deployments.keycloak.extraEnvs "KC_HOSTNAME") ) }} - {{- if semverCompare ">=1.38.0" $version }} - - name: KC_HOSTNAME - value: 'https://{{ .Values.general.lightrun_endpoint }}/auth' - {{- else }} - - name: KC_HOSTNAME_URL - value: 'https://{{ .Values.general.lightrun_endpoint }}/auth' - {{- end }} - {{- end }} - {{- else }} - {{- if semverCompare ">=1.38.0" $version }} - - name: KC_HOSTNAME - value: 'https://{{ .Values.general.lightrun_endpoint }}/auth' - {{- else }} - - name: KC_HOSTNAME_URL - value: 'https://{{ .Values.general.lightrun_endpoint }}/auth' - {{- end }} + + # ---- extra envs (with computed _JAVA_OPTIONS when empty) ---- + {{- $envs := .Values.deployments.keycloak.extraEnvs | default (list) -}} + {{- $memMi := include "mem-to-mi" (.Values.deployments.keycloak.resources.memory | default "") | int -}} + {{- $javaVal := (include "get-env" (list $envs "_JAVA_OPTIONS") | trim) -}} + + {{- /* start with user extraEnvs, but drop an empty _JAVA_OPTIONS */ -}} + {{- $rendered := list -}} + {{- range $e := $envs -}} + {{- $name := $e.name | default "" -}} + {{- $val := "" -}} + {{- if hasKey $e "value" -}}{{- $val = (printf "%v" $e.value) -}}{{- end -}} + {{- if ne $name "_JAVA_OPTIONS" -}} + {{- $rendered = append $rendered $e -}} + {{- end -}} + {{- end -}} + + {{- /* add enhanced _JAVA_OPTIONS calculation */ -}} + {{- $enhancedJavaOpts := include "calculate-enhanced-java-options" (dict "deployment" .Values.deployments.keycloak "existingJavaOpts" $javaVal) -}} + {{- if ne $enhancedJavaOpts "" -}} + {{- $rendered = append $rendered (dict "name" "_JAVA_OPTIONS" "value" $enhancedJavaOpts) -}} + {{- else if eq $javaVal "" -}} + {{- $rendered = append $rendered (dict "name" "_JAVA_OPTIONS" "value" "") -}} + {{- end -}} + + {{- /* ensure KC_HOSTNAME (or KC_HOSTNAME_URL) exists if user didn’t supply one */ -}} + {{- if not (include "list-of-maps-contains" (list $envs "KC_HOSTNAME")) -}} + {{- if semverCompare ">=1.38.0" $version -}} + {{- $rendered = append $rendered (dict "name" "KC_HOSTNAME" "value" (printf "https://%s/auth" .Values.general.lightrun_endpoint)) -}} + {{- else -}} + {{- $rendered = append $rendered (dict "name" "KC_HOSTNAME_URL" "value" (printf "https://%s/auth" .Values.general.lightrun_endpoint)) -}} + {{- end -}} + {{- end -}} + + {{- if $rendered }} + {{ toYaml $rendered | nindent 12 }} {{- end }} + + {{- if or .Values.general.readOnlyRootFilesystem .Values.general.db_local .Values.general.internal_tls.enabled @@ -331,9 +342,9 @@ spec: }} initContainers: {{- include "lightrun-keycloak.initContainer.download-async-profiler" . | nindent 6 }} - {{ if .Values.general.mq.enabled }} + {{- if .Values.general.mq.enabled }} {{- include "lightrun-mq.initContainer.wait-for-rabbitmq" (merge (dict "imageConfig" .Values.deployments.keycloak.initContainers.wait_for_rabbitmq "securityContext" "lightrun-keycloak.containerSecurityContext") .) | nindent 6 }} - {{- end }} + {{- end }} {{- end -}} {{- if .Values.general.readOnlyRootFilesystem }} {{- include "lightrun-keycloak.initContainer.read-only-rootfs" . }} @@ -387,17 +398,12 @@ spec: {{- else if eq .Values.general.internal_tls.certificates.source "existing_certificates" }} secretName: {{ .Values.general.internal_tls.certificates.existing_certificates.keycloak }} {{- end }} - {{- if and .Values.deployments.keycloak.clusterMode (eq .Values.general.internal_tls.certificates.source "existing_certificates") }} + {{- if and .Values.deployments.keycloak.clusterMode (eq .Values.general.internal_tls.certificates.source "existing_certificates") }} - name: cluster-cert secret: defaultMode: 444 - # Secret should create the following files: ca.crt, tls.key, tls.crt secretName: {{ .Values.general.internal_tls.certificates.existing_certificates.keycloak_cluster }} - name: p12 emptyDir: {} {{- end }} {{- end }} - {{- if .Values.deployments.keycloak.extraVolumes }} - {{- range .Values.deployments.keycloak.extraVolumes }} - {{- end }} - {{- end }} From 9a554d745db0dc14e159530fcb2c52b6ac4fb244 Mon Sep 17 00:00:00 2001 From: Igor Borsutsky Date: Wed, 8 Oct 2025 09:38:23 -0400 Subject: [PATCH 3/9] backend and keycloak updates --- chart/templates/backend-deployment.yaml | 2 +- chart/templates/keycloak-statefulset.yaml | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/chart/templates/backend-deployment.yaml b/chart/templates/backend-deployment.yaml index ddd7866..27a4b1f 100644 --- a/chart/templates/backend-deployment.yaml +++ b/chart/templates/backend-deployment.yaml @@ -144,7 +144,7 @@ spec: {{- include "lightrun-backend-crons.environmentVariables" . | nindent 12 }} - name: SPRING_PROFILES_ACTIVE value: "prod,swagger,cluster" -{{- /* >>> BEGIN updated env-emitting block <<< */}} + {{- $envs := .Values.deployments.backend.extraEnvs | default (list) -}} {{- $memMi := include "mem-to-mi" (.Values.deployments.backend.resources.memory | default "") | int -}} {{- $javaVal := (include "get-env" (list $envs "_JAVA_OPTIONS") | trim) -}} diff --git a/chart/templates/keycloak-statefulset.yaml b/chart/templates/keycloak-statefulset.yaml index 87b8a66..e3247a4 100644 --- a/chart/templates/keycloak-statefulset.yaml +++ b/chart/templates/keycloak-statefulset.yaml @@ -13,6 +13,8 @@ spec: serviceName: {{ include "lightrun-keycloak.name" . }} updateStrategy: type: RollingUpdate + # For clusters with more than 3 pods, consider changing the number of "owner nodes" as described in + # https://www.keycloak.org/server/caching#_configuring_caches -> Configuring caches for availability replicas: {{ .Values.deployments.keycloak.replicas }} selector: matchLabels: From be763a43959f9432886f70780b3e6edf53359933 Mon Sep 17 00:00:00 2001 From: Igor Borsutsky Date: Wed, 27 Aug 2025 16:55:10 +0300 Subject: [PATCH 4/9] javaooptions changes --- chart/templates/helpers/_helpers.tpl | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/chart/templates/helpers/_helpers.tpl b/chart/templates/helpers/_helpers.tpl index 8943add..855436b 100644 --- a/chart/templates/helpers/_helpers.tpl +++ b/chart/templates/helpers/_helpers.tpl @@ -974,7 +974,8 @@ Cron-specific asyncProfiler helpers {{- end -}} {{/* -Merge extraEnvs from backend and crons with crons taking precedence for duplicate keys +Merge extraEnvs from backend and crons with crons taking precedence for duplicate keys. +JAVA options are intentionally filtered out and should be added explicitly by templates. */}} {{- define "lightrun-crons.mergedExtraEnvs" -}} {{- $backendExtraEnvs := .Values.deployments.backend.extraEnvs | default list -}} @@ -993,13 +994,17 @@ Merge extraEnvs from backend and crons with crons taking precedence for duplicat {{- end -}} {{/* Only add backend env if not overridden by crons */}} {{- if not $isOverridden -}} -{{- $mergedEnvs = append $mergedEnvs $backendEnv -}} +{{- if and (ne $backendEnv.name "_JAVA_OPTIONS") (ne $backendEnv.name "JAVA_OPTIONS") -}} + {{- $mergedEnvs = append $mergedEnvs $backendEnv -}} + {{- end -}} {{- end -}} {{- end -}} {{/* Then, add all crons extraEnvs (these take precedence) */}} {{- range $cronsExtraEnvs -}} -{{- $mergedEnvs = append $mergedEnvs . -}} +{{- if and (ne .name "_JAVA_OPTIONS") (ne .name "JAVA_OPTIONS") -}} + {{- $mergedEnvs = append $mergedEnvs . -}} + {{- end -}} {{- end -}} {{/* Output merged envs as YAML if any exist */}} @@ -1008,6 +1013,20 @@ Merge extraEnvs from backend and crons with crons taking precedence for duplicat {{- end -}} {{- end -}} + +{{/* Get merged JAVA options from backend+crons with crons taking precedence */}} +{{- define "lightrun-crons.getMergedJavaOptions" -}} +{{- $backendExtraEnvs := .Values.deployments.backend.extraEnvs | default list -}} +{{- $cronsExtraEnvs := .Values.deployments.crons.extraEnvs | default list -}} +{{- $opts := include "get-java-options-from-envs" $backendExtraEnvs -}} +{{- $cronsOpts := include "get-java-options-from-envs" $cronsExtraEnvs -}} +{{- if $cronsOpts -}} +{{- $cronsOpts -}} +{{- else -}} +{{- $opts -}} +{{- end -}} +{{- end -}} + {{/* ################ ### Datadog ### From 2b20bd4c6ab9f9477f0776d0328269018bc08d55 Mon Sep 17 00:00:00 2001 From: Igor Borsutsky Date: Tue, 9 Sep 2025 11:53:03 -0400 Subject: [PATCH 5/9] java_options allows to set custom parameters --- chart/templates/backend-deployment.yaml | 1 - chart/templates/crons/deployment.yaml | 3 +-- chart/templates/helpers/_helpers.tpl | 25 +++-------------------- chart/templates/keycloak-statefulset.yaml | 2 -- 4 files changed, 4 insertions(+), 27 deletions(-) diff --git a/chart/templates/backend-deployment.yaml b/chart/templates/backend-deployment.yaml index 27a4b1f..225bb9c 100644 --- a/chart/templates/backend-deployment.yaml +++ b/chart/templates/backend-deployment.yaml @@ -144,7 +144,6 @@ spec: {{- include "lightrun-backend-crons.environmentVariables" . | nindent 12 }} - name: SPRING_PROFILES_ACTIVE value: "prod,swagger,cluster" - {{- $envs := .Values.deployments.backend.extraEnvs | default (list) -}} {{- $memMi := include "mem-to-mi" (.Values.deployments.backend.resources.memory | default "") | int -}} {{- $javaVal := (include "get-env" (list $envs "_JAVA_OPTIONS") | trim) -}} diff --git a/chart/templates/crons/deployment.yaml b/chart/templates/crons/deployment.yaml index 6466d25..3fc0d29 100644 --- a/chart/templates/crons/deployment.yaml +++ b/chart/templates/crons/deployment.yaml @@ -140,8 +140,7 @@ spec: {{- $backendExtraEnvs := .Values.deployments.backend.extraEnvs | default list -}} {{- $cronsExtraEnvs := .Values.deployments.crons.extraEnvs | default list -}} {{- $mergedEnvs := list -}} - {{- $javaVal := "" -}} - + {{- $javaVal := "" -}} {{- /* First, add all backend extraEnvs except _JAVA_OPTIONS */ -}} {{- range $backendExtraEnvs -}} {{- $backendEnv := . -}} diff --git a/chart/templates/helpers/_helpers.tpl b/chart/templates/helpers/_helpers.tpl index 855436b..8943add 100644 --- a/chart/templates/helpers/_helpers.tpl +++ b/chart/templates/helpers/_helpers.tpl @@ -974,8 +974,7 @@ Cron-specific asyncProfiler helpers {{- end -}} {{/* -Merge extraEnvs from backend and crons with crons taking precedence for duplicate keys. -JAVA options are intentionally filtered out and should be added explicitly by templates. +Merge extraEnvs from backend and crons with crons taking precedence for duplicate keys */}} {{- define "lightrun-crons.mergedExtraEnvs" -}} {{- $backendExtraEnvs := .Values.deployments.backend.extraEnvs | default list -}} @@ -994,17 +993,13 @@ JAVA options are intentionally filtered out and should be added explicitly by te {{- end -}} {{/* Only add backend env if not overridden by crons */}} {{- if not $isOverridden -}} -{{- if and (ne $backendEnv.name "_JAVA_OPTIONS") (ne $backendEnv.name "JAVA_OPTIONS") -}} - {{- $mergedEnvs = append $mergedEnvs $backendEnv -}} - {{- end -}} +{{- $mergedEnvs = append $mergedEnvs $backendEnv -}} {{- end -}} {{- end -}} {{/* Then, add all crons extraEnvs (these take precedence) */}} {{- range $cronsExtraEnvs -}} -{{- if and (ne .name "_JAVA_OPTIONS") (ne .name "JAVA_OPTIONS") -}} - {{- $mergedEnvs = append $mergedEnvs . -}} - {{- end -}} +{{- $mergedEnvs = append $mergedEnvs . -}} {{- end -}} {{/* Output merged envs as YAML if any exist */}} @@ -1013,20 +1008,6 @@ JAVA options are intentionally filtered out and should be added explicitly by te {{- end -}} {{- end -}} - -{{/* Get merged JAVA options from backend+crons with crons taking precedence */}} -{{- define "lightrun-crons.getMergedJavaOptions" -}} -{{- $backendExtraEnvs := .Values.deployments.backend.extraEnvs | default list -}} -{{- $cronsExtraEnvs := .Values.deployments.crons.extraEnvs | default list -}} -{{- $opts := include "get-java-options-from-envs" $backendExtraEnvs -}} -{{- $cronsOpts := include "get-java-options-from-envs" $cronsExtraEnvs -}} -{{- if $cronsOpts -}} -{{- $cronsOpts -}} -{{- else -}} -{{- $opts -}} -{{- end -}} -{{- end -}} - {{/* ################ ### Datadog ### diff --git a/chart/templates/keycloak-statefulset.yaml b/chart/templates/keycloak-statefulset.yaml index e3247a4..87b8a66 100644 --- a/chart/templates/keycloak-statefulset.yaml +++ b/chart/templates/keycloak-statefulset.yaml @@ -13,8 +13,6 @@ spec: serviceName: {{ include "lightrun-keycloak.name" . }} updateStrategy: type: RollingUpdate - # For clusters with more than 3 pods, consider changing the number of "owner nodes" as described in - # https://www.keycloak.org/server/caching#_configuring_caches -> Configuring caches for availability replicas: {{ .Values.deployments.keycloak.replicas }} selector: matchLabels: From 68483866afed72d8513341716afe846bcc4d8111 Mon Sep 17 00:00:00 2001 From: Igor Borsutsky Date: Wed, 8 Oct 2025 09:38:23 -0400 Subject: [PATCH 6/9] backend and keycloak updates --- chart/templates/keycloak-statefulset.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/chart/templates/keycloak-statefulset.yaml b/chart/templates/keycloak-statefulset.yaml index 87b8a66..e3247a4 100644 --- a/chart/templates/keycloak-statefulset.yaml +++ b/chart/templates/keycloak-statefulset.yaml @@ -13,6 +13,8 @@ spec: serviceName: {{ include "lightrun-keycloak.name" . }} updateStrategy: type: RollingUpdate + # For clusters with more than 3 pods, consider changing the number of "owner nodes" as described in + # https://www.keycloak.org/server/caching#_configuring_caches -> Configuring caches for availability replicas: {{ .Values.deployments.keycloak.replicas }} selector: matchLabels: From 29a2ad4c0443e2bf30559e97c104f77480fbdcc5 Mon Sep 17 00:00:00 2001 From: Igor Borsutsky Date: Wed, 27 Aug 2025 16:55:10 +0300 Subject: [PATCH 7/9] javaooptions changes --- chart/templates/helpers/_helpers.tpl | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/chart/templates/helpers/_helpers.tpl b/chart/templates/helpers/_helpers.tpl index 8943add..855436b 100644 --- a/chart/templates/helpers/_helpers.tpl +++ b/chart/templates/helpers/_helpers.tpl @@ -974,7 +974,8 @@ Cron-specific asyncProfiler helpers {{- end -}} {{/* -Merge extraEnvs from backend and crons with crons taking precedence for duplicate keys +Merge extraEnvs from backend and crons with crons taking precedence for duplicate keys. +JAVA options are intentionally filtered out and should be added explicitly by templates. */}} {{- define "lightrun-crons.mergedExtraEnvs" -}} {{- $backendExtraEnvs := .Values.deployments.backend.extraEnvs | default list -}} @@ -993,13 +994,17 @@ Merge extraEnvs from backend and crons with crons taking precedence for duplicat {{- end -}} {{/* Only add backend env if not overridden by crons */}} {{- if not $isOverridden -}} -{{- $mergedEnvs = append $mergedEnvs $backendEnv -}} +{{- if and (ne $backendEnv.name "_JAVA_OPTIONS") (ne $backendEnv.name "JAVA_OPTIONS") -}} + {{- $mergedEnvs = append $mergedEnvs $backendEnv -}} + {{- end -}} {{- end -}} {{- end -}} {{/* Then, add all crons extraEnvs (these take precedence) */}} {{- range $cronsExtraEnvs -}} -{{- $mergedEnvs = append $mergedEnvs . -}} +{{- if and (ne .name "_JAVA_OPTIONS") (ne .name "JAVA_OPTIONS") -}} + {{- $mergedEnvs = append $mergedEnvs . -}} + {{- end -}} {{- end -}} {{/* Output merged envs as YAML if any exist */}} @@ -1008,6 +1013,20 @@ Merge extraEnvs from backend and crons with crons taking precedence for duplicat {{- end -}} {{- end -}} + +{{/* Get merged JAVA options from backend+crons with crons taking precedence */}} +{{- define "lightrun-crons.getMergedJavaOptions" -}} +{{- $backendExtraEnvs := .Values.deployments.backend.extraEnvs | default list -}} +{{- $cronsExtraEnvs := .Values.deployments.crons.extraEnvs | default list -}} +{{- $opts := include "get-java-options-from-envs" $backendExtraEnvs -}} +{{- $cronsOpts := include "get-java-options-from-envs" $cronsExtraEnvs -}} +{{- if $cronsOpts -}} +{{- $cronsOpts -}} +{{- else -}} +{{- $opts -}} +{{- end -}} +{{- end -}} + {{/* ################ ### Datadog ### From a6c099b563423c62edc2ddc12f10374708290a4a Mon Sep 17 00:00:00 2001 From: Igor Borsutsky Date: Tue, 9 Sep 2025 11:53:03 -0400 Subject: [PATCH 8/9] java_options allows to set custom parameters --- chart/templates/backend-deployment.yaml | 1 - chart/templates/helpers/_helpers.tpl | 25 +++-------------------- chart/templates/keycloak-statefulset.yaml | 2 -- 3 files changed, 3 insertions(+), 25 deletions(-) diff --git a/chart/templates/backend-deployment.yaml b/chart/templates/backend-deployment.yaml index 225bb9c..aee363d 100644 --- a/chart/templates/backend-deployment.yaml +++ b/chart/templates/backend-deployment.yaml @@ -147,7 +147,6 @@ spec: {{- $envs := .Values.deployments.backend.extraEnvs | default (list) -}} {{- $memMi := include "mem-to-mi" (.Values.deployments.backend.resources.memory | default "") | int -}} {{- $javaVal := (include "get-env" (list $envs "_JAVA_OPTIONS") | trim) -}} - {{- /* start with user extraEnvs, but drop _JAVA_OPTIONS */ -}} {{- $rendered := list -}} {{- range $e := $envs -}} diff --git a/chart/templates/helpers/_helpers.tpl b/chart/templates/helpers/_helpers.tpl index 855436b..8943add 100644 --- a/chart/templates/helpers/_helpers.tpl +++ b/chart/templates/helpers/_helpers.tpl @@ -974,8 +974,7 @@ Cron-specific asyncProfiler helpers {{- end -}} {{/* -Merge extraEnvs from backend and crons with crons taking precedence for duplicate keys. -JAVA options are intentionally filtered out and should be added explicitly by templates. +Merge extraEnvs from backend and crons with crons taking precedence for duplicate keys */}} {{- define "lightrun-crons.mergedExtraEnvs" -}} {{- $backendExtraEnvs := .Values.deployments.backend.extraEnvs | default list -}} @@ -994,17 +993,13 @@ JAVA options are intentionally filtered out and should be added explicitly by te {{- end -}} {{/* Only add backend env if not overridden by crons */}} {{- if not $isOverridden -}} -{{- if and (ne $backendEnv.name "_JAVA_OPTIONS") (ne $backendEnv.name "JAVA_OPTIONS") -}} - {{- $mergedEnvs = append $mergedEnvs $backendEnv -}} - {{- end -}} +{{- $mergedEnvs = append $mergedEnvs $backendEnv -}} {{- end -}} {{- end -}} {{/* Then, add all crons extraEnvs (these take precedence) */}} {{- range $cronsExtraEnvs -}} -{{- if and (ne .name "_JAVA_OPTIONS") (ne .name "JAVA_OPTIONS") -}} - {{- $mergedEnvs = append $mergedEnvs . -}} - {{- end -}} +{{- $mergedEnvs = append $mergedEnvs . -}} {{- end -}} {{/* Output merged envs as YAML if any exist */}} @@ -1013,20 +1008,6 @@ JAVA options are intentionally filtered out and should be added explicitly by te {{- end -}} {{- end -}} - -{{/* Get merged JAVA options from backend+crons with crons taking precedence */}} -{{- define "lightrun-crons.getMergedJavaOptions" -}} -{{- $backendExtraEnvs := .Values.deployments.backend.extraEnvs | default list -}} -{{- $cronsExtraEnvs := .Values.deployments.crons.extraEnvs | default list -}} -{{- $opts := include "get-java-options-from-envs" $backendExtraEnvs -}} -{{- $cronsOpts := include "get-java-options-from-envs" $cronsExtraEnvs -}} -{{- if $cronsOpts -}} -{{- $cronsOpts -}} -{{- else -}} -{{- $opts -}} -{{- end -}} -{{- end -}} - {{/* ################ ### Datadog ### diff --git a/chart/templates/keycloak-statefulset.yaml b/chart/templates/keycloak-statefulset.yaml index e3247a4..87b8a66 100644 --- a/chart/templates/keycloak-statefulset.yaml +++ b/chart/templates/keycloak-statefulset.yaml @@ -13,8 +13,6 @@ spec: serviceName: {{ include "lightrun-keycloak.name" . }} updateStrategy: type: RollingUpdate - # For clusters with more than 3 pods, consider changing the number of "owner nodes" as described in - # https://www.keycloak.org/server/caching#_configuring_caches -> Configuring caches for availability replicas: {{ .Values.deployments.keycloak.replicas }} selector: matchLabels: From 66b8126616ce8bc9298f0dade603384396774fc6 Mon Sep 17 00:00:00 2001 From: Igor Borsutsky Date: Wed, 8 Oct 2025 09:38:23 -0400 Subject: [PATCH 9/9] backend and keycloak updates --- chart/templates/keycloak-statefulset.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/chart/templates/keycloak-statefulset.yaml b/chart/templates/keycloak-statefulset.yaml index 87b8a66..e3247a4 100644 --- a/chart/templates/keycloak-statefulset.yaml +++ b/chart/templates/keycloak-statefulset.yaml @@ -13,6 +13,8 @@ spec: serviceName: {{ include "lightrun-keycloak.name" . }} updateStrategy: type: RollingUpdate + # For clusters with more than 3 pods, consider changing the number of "owner nodes" as described in + # https://www.keycloak.org/server/caching#_configuring_caches -> Configuring caches for availability replicas: {{ .Values.deployments.keycloak.replicas }} selector: matchLabels: