From 2764d707f497c40229d81307218af4eebed0e147 Mon Sep 17 00:00:00 2001 From: Micaiah Martin Date: Wed, 5 Aug 2026 14:54:02 -0600 Subject: [PATCH 1/2] Add support for migrationTimeoutSeconds --- .../post-install-db-migrator-job.yaml | 4 ++- .../pre-install-db-migrator-job.yaml | 3 ++ .../templates/pre-install-hook-configmap.yaml | 3 ++ charts/self-host/tests/configmap_test.yaml | 11 ++++++++ .../tests/post_install_db_migrator_test.yaml | 28 +++++++++++++++++++ charts/self-host/values.schema.json | 6 ++++ charts/self-host/values.yaml | 4 +++ 7 files changed, 58 insertions(+), 1 deletion(-) diff --git a/charts/self-host/templates/post-install-db-migrator-job.yaml b/charts/self-host/templates/post-install-db-migrator-job.yaml index 5f47c9ce0..a1395a2d6 100644 --- a/charts/self-host/templates/post-install-db-migrator-job.yaml +++ b/charts/self-host/templates/post-install-db-migrator-job.yaml @@ -130,7 +130,9 @@ spec: readOnly: true {{- end }} {{- if or ( not .Values.database.enabled ) ( and .Values.database.enabled .Release.IsUpgrade ) }} - args: [ "-f", "DbScripts_transition", "-r"] + args: [ "-f", "DbScripts_transition", "-r"{{ if .Values.jobs.db.migrationTimeoutSeconds }}, "-t", {{ .Values.jobs.db.migrationTimeoutSeconds | quote }}{{ end }}] + {{- else if .Values.jobs.db.migrationTimeoutSeconds }} + args: [ "-t", {{ .Values.jobs.db.migrationTimeoutSeconds | quote }}] {{- end }} restartPolicy: Never volumes: diff --git a/charts/self-host/templates/pre-install-db-migrator-job.yaml b/charts/self-host/templates/pre-install-db-migrator-job.yaml index 172597ed4..324cc1fc8 100644 --- a/charts/self-host/templates/pre-install-db-migrator-job.yaml +++ b/charts/self-host/templates/pre-install-db-migrator-job.yaml @@ -94,6 +94,9 @@ spec: mountPath: "/mnt/secrets-store" readOnly: true {{- end }} + {{- if .Values.jobs.db.migrationTimeoutSeconds }} + args: [ "-t", {{ .Values.jobs.db.migrationTimeoutSeconds | quote }}] + {{- end }} restartPolicy: Never volumes: - name: migrator-extract-dir diff --git a/charts/self-host/templates/pre-install-hook-configmap.yaml b/charts/self-host/templates/pre-install-hook-configmap.yaml index 7d30e2140..a349c14e2 100644 --- a/charts/self-host/templates/pre-install-hook-configmap.yaml +++ b/charts/self-host/templates/pre-install-hook-configmap.yaml @@ -74,6 +74,9 @@ data: {{- end }} {{- if .Values.general.knownNetworks }} globalSettings__knownNetworks: {{ .Values.general.knownNetworks | quote }} +{{- end }} +{{- if .Values.jobs.db.migrationTimeoutSeconds }} + globalSettings__sqlServer__migrationExecutionTimeoutSeconds: {{ .Values.jobs.db.migrationTimeoutSeconds | quote }} {{- end }} adminSettings__admins: {{ .Values.general.admins | quote }} LOCAL_UID: "1000" diff --git a/charts/self-host/tests/configmap_test.yaml b/charts/self-host/tests/configmap_test.yaml index e3fe204a7..3ac264017 100644 --- a/charts/self-host/tests/configmap_test.yaml +++ b/charts/self-host/tests/configmap_test.yaml @@ -62,3 +62,14 @@ tests: - isNull: path: data.globalSettings__IdentityServer__AbsoluteRefreshTokenLifetimeSeconds documentIndex: 0 + + - it: should include the migration timeout when migrationTimeoutSeconds is set + template: templates/pre-install-hook-configmap.yaml + set: + general.domain: "example.com" + jobs.db.migrationTimeoutSeconds: "900" + asserts: + - equal: + path: data.globalSettings__sqlServer__migrationExecutionTimeoutSeconds + value: "900" + documentIndex: 0 diff --git a/charts/self-host/tests/post_install_db_migrator_test.yaml b/charts/self-host/tests/post_install_db_migrator_test.yaml index fd48fdcb3..fbce13afa 100644 --- a/charts/self-host/tests/post_install_db_migrator_test.yaml +++ b/charts/self-host/tests/post_install_db_migrator_test.yaml @@ -105,3 +105,31 @@ tests: asserts: - hasDocuments: count: 0 + + - it: should append the timeout to the transition args when migrationTimeoutSeconds is set + template: templates/post-install-db-migrator-job.yaml + set: + database.enabled: false + jobs.db.migrationTimeoutSeconds: "900" + asserts: + - equal: + path: spec.template.spec.containers[0].args + value: ["-f", "DbScripts_transition", "-r", "-t", "900"] + + - it: should pass only the timeout when transition args are not rendered + template: templates/post-install-db-migrator-job.yaml + set: + database.enabled: true + jobs.db.migrationTimeoutSeconds: "900" + asserts: + - equal: + path: spec.template.spec.containers[0].args + value: ["-t", "900"] + + - it: should not set args when database is enabled and no timeout is set + template: templates/post-install-db-migrator-job.yaml + set: + database.enabled: true + asserts: + - isNull: + path: spec.template.spec.containers[0].args diff --git a/charts/self-host/values.schema.json b/charts/self-host/values.schema.json index 68852002b..08a6e4131 100644 --- a/charts/self-host/values.schema.json +++ b/charts/self-host/values.schema.json @@ -3342,6 +3342,12 @@ }, "db": { "properties": { + "migrationTimeoutSeconds": { + "default": "", + "description": "Timeout seconds for MSSQL migrations.\nDefault: 5 minutes\nA value of 0 can be used for unlimited timeout, useful for large databases", + "title": "migrationTimeoutSeconds", + "type": "string" + }, "postInstallMigrator": { "properties": { "annotations": { diff --git a/charts/self-host/values.yaml b/charts/self-host/values.yaml index d44af3809..e24ced7f4 100644 --- a/charts/self-host/values.yaml +++ b/charts/self-host/values.yaml @@ -888,6 +888,10 @@ jobs: podSecurityContext: {} db: + # Timeout seconds for MSSQL migrations. + # Default: 5 minutes + # A value of 0 can be used for unlimited timeout, useful for large databases + migrationTimeoutSeconds: "" preInstallMigrator: # Additional job labels labels: {} From cc2589e4ed5bc0d2ffa0d396d4f84ae2b4f30e17 Mon Sep 17 00:00:00 2001 From: Micaiah Martin Date: Thu, 6 Aug 2026 14:32:05 -0600 Subject: [PATCH 2/2] Address review feedback: document quoted "0" and add pre-install migrator tests Clarify that the unlimited-timeout value must be quoted, since the schema types migrationTimeoutSeconds as a string and an unquoted 0 fails validation. Add helm-unittest coverage for the pre-install migrator job args, including the "0" unlimited case so a future schema widening to integers fails a test rather than silently dropping the flag. --- .../tests/pre_install_db_migrator_test.yaml | 55 +++++++++++++++++++ charts/self-host/values.schema.json | 2 +- charts/self-host/values.yaml | 2 +- 3 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 charts/self-host/tests/pre_install_db_migrator_test.yaml diff --git a/charts/self-host/tests/pre_install_db_migrator_test.yaml b/charts/self-host/tests/pre_install_db_migrator_test.yaml new file mode 100644 index 000000000..f4052c85c --- /dev/null +++ b/charts/self-host/tests/pre_install_db_migrator_test.yaml @@ -0,0 +1,55 @@ +suite: test pre-install db migrator job +templates: + - templates/helpers.tpl + - templates/pre-install-db-migrator-job.yaml +tests: + - it: should pass the timeout when migrationTimeoutSeconds is set + template: templates/pre-install-db-migrator-job.yaml + set: + jobs.db.migrationTimeoutSeconds: "900" + asserts: + - isKind: + of: Job + - equal: + path: metadata.annotations["helm.sh/hook"] + value: pre-upgrade + - equal: + path: spec.template.spec.containers[0].args + value: ["-t", "900"] + + - it: should pass the timeout when database is disabled + template: templates/pre-install-db-migrator-job.yaml + set: + database.enabled: false + jobs.db.migrationTimeoutSeconds: "900" + asserts: + - equal: + path: metadata.annotations["helm.sh/hook"] + value: pre-install,pre-upgrade + - equal: + path: spec.template.spec.containers[0].args + value: ["-t", "900"] + + - it: should pass the timeout when migrationTimeoutSeconds is "0" for unlimited + template: templates/pre-install-db-migrator-job.yaml + set: + jobs.db.migrationTimeoutSeconds: "0" + asserts: + - equal: + path: spec.template.spec.containers[0].args + value: ["-t", "0"] + + - it: should not set args when no timeout is set + template: templates/pre-install-db-migrator-job.yaml + asserts: + - isNull: + path: spec.template.spec.containers[0].args + + - it: should not render job when databaseProvider is postgres + template: templates/pre-install-db-migrator-job.yaml + set: + general.databaseProvider: postgres + jobs.db.migrationTimeoutSeconds: "900" + asserts: + - hasDocuments: + count: 0 diff --git a/charts/self-host/values.schema.json b/charts/self-host/values.schema.json index 08a6e4131..bc66db717 100644 --- a/charts/self-host/values.schema.json +++ b/charts/self-host/values.schema.json @@ -3344,7 +3344,7 @@ "properties": { "migrationTimeoutSeconds": { "default": "", - "description": "Timeout seconds for MSSQL migrations.\nDefault: 5 minutes\nA value of 0 can be used for unlimited timeout, useful for large databases", + "description": "Timeout seconds for MSSQL migrations.\nDefault: 5 minutes\nA value of \"0\" can be used for unlimited timeout, useful for large databases", "title": "migrationTimeoutSeconds", "type": "string" }, diff --git a/charts/self-host/values.yaml b/charts/self-host/values.yaml index e24ced7f4..717ca7466 100644 --- a/charts/self-host/values.yaml +++ b/charts/self-host/values.yaml @@ -890,7 +890,7 @@ jobs: db: # Timeout seconds for MSSQL migrations. # Default: 5 minutes - # A value of 0 can be used for unlimited timeout, useful for large databases + # A value of "0" can be used for unlimited timeout, useful for large databases migrationTimeoutSeconds: "" preInstallMigrator: # Additional job labels