From 367f3c0df8869023af8746bc90d812b275d28343 Mon Sep 17 00:00:00 2001 From: Jehoszafat Zimnowoda <17126497+j-zimnowoda@users.noreply.github.com> Date: Thu, 9 Jul 2026 14:07:47 +0200 Subject: [PATCH 1/3] feat: attempt to migrate values on recovery from the values repo --- src/cmd/migrate.test.ts | 31 +++++++++++++++++++++++++++++++ src/cmd/migrate.ts | 9 +++++++++ src/operator/main.ts | 11 +++++++++++ 3 files changed, 51 insertions(+) diff --git a/src/cmd/migrate.test.ts b/src/cmd/migrate.test.ts index 268e72301c..11c4e5922e 100644 --- a/src/cmd/migrate.test.ts +++ b/src/cmd/migrate.test.ts @@ -3,6 +3,7 @@ import { applyChanges, Changes, filterChanges, + needsMigration, processDeletionEntry, removeSopsArtifacts, sopsMigration, @@ -442,3 +443,33 @@ describe('processDeletionEntry', () => { expect(mockDeleteFile).not.toHaveBeenCalled() }) }) + +describe('needsMigration', () => { + const makeLoadYaml = + (repoSpecVersion: number | undefined, defaultSpecVersion: number | undefined) => + async (path: string, _opts?: any): Promise => { + if (path.includes('versions.yaml')) return repoSpecVersion !== undefined ? { spec: { specVersion: repoSpecVersion } } : undefined + if (path.includes('defaults.yaml')) return defaultSpecVersion !== undefined ? { versions: { specVersion: defaultSpecVersion } } : undefined + return undefined + } + + it('returns true when repo specVersion differs from defaults specVersion', async () => { + const result = await needsMigration({ loadYaml: makeLoadYaml(69, 70) }) + expect(result).toBe(true) + }) + + it('returns false when repo specVersion matches defaults specVersion', async () => { + const result = await needsMigration({ loadYaml: makeLoadYaml(70, 70) }) + expect(result).toBe(false) + }) + + it('returns false when versions.yaml is missing', async () => { + const result = await needsMigration({ loadYaml: makeLoadYaml(undefined, 70) }) + expect(result).toBe(false) + }) + + it('returns false when defaults.yaml is missing', async () => { + const result = await needsMigration({ loadYaml: makeLoadYaml(69, undefined) }) + expect(result).toBe(false) + }) +}) diff --git a/src/cmd/migrate.ts b/src/cmd/migrate.ts index 86607e9cee..aa6448fe73 100644 --- a/src/cmd/migrate.ts +++ b/src/cmd/migrate.ts @@ -850,6 +850,15 @@ export const setAtPath = (path: string, values: Record, value: stri paths.forEach((p) => set(values, p, Array.isArray(value) ? [...value] : value)) } +export const needsMigration = async (deps = { loadYaml }): Promise => { + const defaults = await deps.loadYaml(`${rootDir}/helmfile.d/snippets/defaults.yaml`, { noError: true }) + const defaultSpecVersion: number = defaults?.versions?.specVersion + const versions = await deps.loadYaml(`${env.ENV_DIR}/env/settings/versions.yaml`, { noError: true }) + const repoSpecVersion: number = versions?.spec?.specVersion + if (!repoSpecVersion || !defaultSpecVersion) return false + return repoSpecVersion !== defaultSpecVersion +} + export const migrate = async (): Promise => { const d = terminal(`cmd:${cmdName}:migrate`) const argv: Arguments = getParsedArgs() diff --git a/src/operator/main.ts b/src/operator/main.ts index f746a4d243..b4ee278930 100644 --- a/src/operator/main.ts +++ b/src/operator/main.ts @@ -3,9 +3,12 @@ import fs from 'fs' import process from 'node:process' import path from 'path' import { retryInstallStep } from '../cmd/install' +import { commit } from '../cmd/commit' +import { needsMigration } from '../cmd/migrate' import { terminal } from '../common/debug' import { env } from '../common/envalid' import { getStoredGitRepoConfig } from '../common/git-config' +import { getDefaultValues, writeValues } from '../common/values' import { AplOperations } from './apl-operations' import { AplOperator, AplOperatorConfig } from './apl-operator' import { GitRepository } from './git-repository' @@ -79,6 +82,14 @@ async function main(): Promise { await installer.ensureRecoveryPrerequisites() await installer.applyRecoveryManifests() await installer.recoverFromGit() + if (await needsMigration()) { + d.info('specVersion mismatch detected, running migration before install') + const defaultValues = await getDefaultValues() + await writeValues(defaultValues) + await aplOps.migrate() + const gitConfig = await getStoredGitRepoConfig() + await commit(gitConfig) + } d.info('Recovery installation completed, switching installation mode to standard') await installer.resetRecoveryModeToStandard() await installer.reconcileInstall() From fe46ab3c8ece7e87175c37ca475d439ec2be0900 Mon Sep 17 00:00:00 2001 From: Jehoszafat Zimnowoda <17126497+j-zimnowoda@users.noreply.github.com> Date: Thu, 9 Jul 2026 14:38:01 +0200 Subject: [PATCH 2/3] fix: linter --- .cspell.json | 1 + src/cmd/migrate.test.ts | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.cspell.json b/.cspell.json index 60b53049a1..9079d5f922 100644 --- a/.cspell.json +++ b/.cspell.json @@ -28,6 +28,7 @@ "civo", "crypted", "descheduler", + "dyff", "CNAMEs", "encodedkey", "envs", diff --git a/src/cmd/migrate.test.ts b/src/cmd/migrate.test.ts index 11c4e5922e..16af42dc6c 100644 --- a/src/cmd/migrate.test.ts +++ b/src/cmd/migrate.test.ts @@ -1,4 +1,3 @@ -import { globSync } from 'glob' import { applyChanges, Changes, @@ -448,8 +447,10 @@ describe('needsMigration', () => { const makeLoadYaml = (repoSpecVersion: number | undefined, defaultSpecVersion: number | undefined) => async (path: string, _opts?: any): Promise => { - if (path.includes('versions.yaml')) return repoSpecVersion !== undefined ? { spec: { specVersion: repoSpecVersion } } : undefined - if (path.includes('defaults.yaml')) return defaultSpecVersion !== undefined ? { versions: { specVersion: defaultSpecVersion } } : undefined + if (path.includes('versions.yaml')) + return repoSpecVersion !== undefined ? { spec: { specVersion: repoSpecVersion } } : undefined + if (path.includes('defaults.yaml')) + return defaultSpecVersion !== undefined ? { versions: { specVersion: defaultSpecVersion } } : undefined return undefined } From d8a36b0aa326c24533b02e7cd1cf9a2f591b6b71 Mon Sep 17 00:00:00 2001 From: Jehoszafat Zimnowoda <17126497+j-zimnowoda@users.noreply.github.com> Date: Thu, 9 Jul 2026 15:20:45 +0200 Subject: [PATCH 3/3] test: fix --- .../env/teams/admin/services/misc-admin.yaml | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 tests/fixtures/env/teams/admin/services/misc-admin.yaml diff --git a/tests/fixtures/env/teams/admin/services/misc-admin.yaml b/tests/fixtures/env/teams/admin/services/misc-admin.yaml deleted file mode 100644 index f4534ba971..0000000000 --- a/tests/fixtures/env/teams/admin/services/misc-admin.yaml +++ /dev/null @@ -1,12 +0,0 @@ -kind: AplTeamService -metadata: - name: misc - labels: - apl.io/teamId: admin -spec: - port: 80 - namespace: misc - cname: - domain: misc-admin.cname.com - tlsSecretName: 'hello-cert' - useCname: true