diff --git a/helmfile.d/helmfile-03.databases.yaml.gotmpl b/helmfile.d/helmfile-03.databases.yaml.gotmpl index bb0882cc3a..2ad77f0fa8 100644 --- a/helmfile.d/helmfile-03.databases.yaml.gotmpl +++ b/helmfile.d/helmfile-03.databases.yaml.gotmpl @@ -1,6 +1,9 @@ bases: - snippets/defaults.yaml --- +bases: + - snippets/defaults.gotmpl +--- bases: - snippets/env.gotmpl --- diff --git a/helmfile.d/helmfile-03.init.yaml.gotmpl b/helmfile.d/helmfile-03.init.yaml.gotmpl index 8d741370ea..2274b5a14d 100644 --- a/helmfile.d/helmfile-03.init.yaml.gotmpl +++ b/helmfile.d/helmfile-03.init.yaml.gotmpl @@ -1,6 +1,9 @@ bases: - snippets/defaults.yaml --- +bases: + - snippets/defaults.gotmpl +--- bases: - snippets/env.gotmpl --- diff --git a/helmfile.d/helmfile-04.init.yaml.gotmpl b/helmfile.d/helmfile-04.init.yaml.gotmpl index ba98df61ad..b1961db777 100644 --- a/helmfile.d/helmfile-04.init.yaml.gotmpl +++ b/helmfile.d/helmfile-04.init.yaml.gotmpl @@ -1,6 +1,9 @@ bases: - snippets/defaults.yaml --- +bases: + - snippets/defaults.gotmpl +--- bases: - snippets/env.gotmpl --- diff --git a/helmfile.d/helmfile-05.init.yaml.gotmpl b/helmfile.d/helmfile-05.init.yaml.gotmpl index 2ea6f6a730..8261d4d0cf 100644 --- a/helmfile.d/helmfile-05.init.yaml.gotmpl +++ b/helmfile.d/helmfile-05.init.yaml.gotmpl @@ -1,6 +1,9 @@ bases: - snippets/defaults.yaml --- +bases: + - snippets/defaults.gotmpl +--- bases: - snippets/env.gotmpl --- diff --git a/helmfile.d/helmfile-06.init.yaml.gotmpl b/helmfile.d/helmfile-06.init.yaml.gotmpl index ffe6e1bd8d..ce85dc86bf 100644 --- a/helmfile.d/helmfile-06.init.yaml.gotmpl +++ b/helmfile.d/helmfile-06.init.yaml.gotmpl @@ -1,6 +1,9 @@ bases: - snippets/defaults.yaml --- +bases: + - snippets/defaults.gotmpl +--- bases: - snippets/env.gotmpl --- diff --git a/helmfile.d/helmfile-07.init.yaml.gotmpl b/helmfile.d/helmfile-07.init.yaml.gotmpl index 1a9a85648d..cb84c94ee2 100644 --- a/helmfile.d/helmfile-07.init.yaml.gotmpl +++ b/helmfile.d/helmfile-07.init.yaml.gotmpl @@ -1,6 +1,9 @@ bases: - snippets/defaults.yaml --- +bases: + - snippets/defaults.gotmpl +--- bases: - snippets/env.gotmpl --- diff --git a/helmfile.d/helmfile-08.init.yaml.gotmpl b/helmfile.d/helmfile-08.init.yaml.gotmpl index c332a25c58..f23dd3a7f2 100644 --- a/helmfile.d/helmfile-08.init.yaml.gotmpl +++ b/helmfile.d/helmfile-08.init.yaml.gotmpl @@ -1,6 +1,9 @@ bases: - snippets/defaults.yaml --- +bases: + - snippets/defaults.gotmpl +--- bases: - snippets/env.gotmpl --- diff --git a/helmfile.d/helmfile-09.init.yaml.gotmpl b/helmfile.d/helmfile-09.init.yaml.gotmpl index 5abf074beb..3eea8d4045 100644 --- a/helmfile.d/helmfile-09.init.yaml.gotmpl +++ b/helmfile.d/helmfile-09.init.yaml.gotmpl @@ -1,6 +1,9 @@ bases: - snippets/defaults.yaml --- +bases: + - snippets/defaults.gotmpl +--- bases: - snippets/env.gotmpl --- diff --git a/helmfile.d/helmfile-10.monitoring.yaml.gotmpl b/helmfile.d/helmfile-10.monitoring.yaml.gotmpl index 3b28413fbb..6d246aecb2 100644 --- a/helmfile.d/helmfile-10.monitoring.yaml.gotmpl +++ b/helmfile.d/helmfile-10.monitoring.yaml.gotmpl @@ -1,6 +1,9 @@ bases: - snippets/defaults.yaml --- +bases: + - snippets/defaults.gotmpl +--- bases: - snippets/env.gotmpl --- diff --git a/helmfile.d/helmfile-20.ingress.yaml.gotmpl b/helmfile.d/helmfile-20.ingress.yaml.gotmpl index 2d7599c9e6..206b5b92a2 100644 --- a/helmfile.d/helmfile-20.ingress.yaml.gotmpl +++ b/helmfile.d/helmfile-20.ingress.yaml.gotmpl @@ -1,6 +1,9 @@ bases: - snippets/defaults.yaml --- +bases: + - snippets/defaults.gotmpl +--- bases: - snippets/env.gotmpl --- diff --git a/helmfile.d/helmfile-50.services.yaml.gotmpl b/helmfile.d/helmfile-50.services.yaml.gotmpl index 7c02a1e939..1a29e01b2f 100644 --- a/helmfile.d/helmfile-50.services.yaml.gotmpl +++ b/helmfile.d/helmfile-50.services.yaml.gotmpl @@ -1,6 +1,9 @@ bases: - snippets/defaults.yaml --- +bases: + - snippets/defaults.gotmpl +--- bases: - snippets/env.gotmpl --- diff --git a/helmfile.d/helmfile-70.shared.yaml.gotmpl b/helmfile.d/helmfile-70.shared.yaml.gotmpl index 2b0f64b250..a78a1d10fd 100644 --- a/helmfile.d/helmfile-70.shared.yaml.gotmpl +++ b/helmfile.d/helmfile-70.shared.yaml.gotmpl @@ -1,6 +1,9 @@ bases: - snippets/defaults.yaml --- +bases: + - snippets/defaults.gotmpl +--- bases: - snippets/env.gotmpl --- diff --git a/helmfile.d/helmfile-90.artifacts.yaml.gotmpl b/helmfile.d/helmfile-90.artifacts.yaml.gotmpl index b7481011aa..d84667bf1d 100644 --- a/helmfile.d/helmfile-90.artifacts.yaml.gotmpl +++ b/helmfile.d/helmfile-90.artifacts.yaml.gotmpl @@ -1,6 +1,9 @@ bases: - snippets/defaults.yaml --- +bases: + - snippets/defaults.gotmpl +--- bases: - snippets/env.gotmpl --- @@ -27,4 +30,4 @@ releases: namespace: otel labels: pkg: otel-operator - <<: *raw \ No newline at end of file + <<: *raw diff --git a/helmfile.d/helmfile-91.artifacts.yaml.gotmpl b/helmfile.d/helmfile-91.artifacts.yaml.gotmpl index 20a443602c..9429e71def 100644 --- a/helmfile.d/helmfile-91.artifacts.yaml.gotmpl +++ b/helmfile.d/helmfile-91.artifacts.yaml.gotmpl @@ -1,6 +1,9 @@ bases: - snippets/defaults.yaml --- +bases: + - snippets/defaults.gotmpl +--- bases: - snippets/env.gotmpl --- @@ -18,4 +21,4 @@ releases: labels: pkg: istio app: core - <<: *raw \ No newline at end of file + <<: *raw diff --git a/helmfile.d/snippets/defaults.yaml b/helmfile.d/snippets/defaults.yaml index 0b378a4387..51c64d3d4a 100644 --- a/helmfile.d/snippets/defaults.yaml +++ b/helmfile.d/snippets/defaults.yaml @@ -1011,6 +1011,7 @@ environments: keycloak: imageName: null size: 5Gi + storageClass: '' walStorageSize: 5Gi replicas: 2 recovery: {} @@ -1039,6 +1040,7 @@ environments: harbor: imageName: null size: 5Gi + storageClass: '' walStorageSize: 5Gi replicas: 2 coreDatabase: registry @@ -1068,6 +1070,7 @@ environments: gitea: imageName: null size: 5Gi + storageClass: '' walStorageSize: 5Gi replicas: 2 recovery: {} diff --git a/src/cmd/migrate.test.ts b/src/cmd/migrate.test.ts index 268e72301c..9ce86bacf9 100644 --- a/src/cmd/migrate.test.ts +++ b/src/cmd/migrate.test.ts @@ -1,8 +1,8 @@ -import { globSync } from 'glob' import { applyChanges, Changes, filterChanges, + preservePvcStorageClassInRawValues, processDeletionEntry, removeSopsArtifacts, sopsMigration, @@ -442,3 +442,142 @@ describe('processDeletionEntry', () => { expect(mockDeleteFile).not.toHaveBeenCalled() }) }) + +describe('preservePvcStorageClassInRawValues', () => { + const makeDeps = (overrides: Partial = {}) => ({ + readPvc: jest.fn(async () => undefined), + listPvcs: jest.fn(async () => []), + getParsedArgs: jest.fn(() => ({ dryRun: false, local: false })), + terminal, + ...overrides, + }) + + it('should set app _rawValues and databases.storageClass when pvc storageClass differs from cluster default', async () => { + const values: Record = { + cluster: { defaultStorageClass: 'linode-block-storage' }, + databases: { + gitea: {}, + harbor: {}, + keycloak: {}, + }, + apps: { + gitea: { _rawValues: {} }, + harbor: { _rawValues: {} }, + keycloak: { _rawValues: {} }, + prometheus: { _rawValues: {} }, + 'kubeflow-pipelines': { _rawValues: {} }, + 'git-server': { _rawValues: {} }, + }, + } + + const readPvc = jest.fn(async (namespace: string, name: string) => { + const byName: Record = { + 'git-server/git-server-data': { spec: { storageClassName: 'legacy-sc' } }, + 'gitea/data-gitea-0': { spec: { storageClassName: 'legacy-sc' } }, + 'gitea/gitea-backup': { spec: { storageClassName: 'legacy-sc' } }, + 'kfp/mysql-pv-claim': { spec: { storageClassName: 'legacy-sc' } }, + } + return byName[`${namespace}/${name}`] + }) + + const listPvcs = jest.fn(async (namespace: string, labelSelector: string) => { + const bySelector: Record = { + 'gitea/cnpg.io/cluster=gitea-db': [ + { metadata: { labels: { 'cnpg.io/pvcRole': 'PG_DATA' } }, spec: { storageClassName: 'legacy-sc' } }, + { metadata: { labels: { 'cnpg.io/pvcRole': 'PG_WAL' } }, spec: { storageClassName: 'legacy-wal-sc' } }, + ], + 'harbor/app.kubernetes.io/instance=harbor,component=redis': [{ spec: { storageClassName: 'legacy-sc' } }], + 'harbor/app.kubernetes.io/instance=harbor,component=trivy': [{ spec: { storageClassName: 'legacy-sc' } }], + 'harbor/cnpg.io/cluster=harbor-otomi-db': [ + { metadata: { labels: { 'cnpg.io/pvcRole': 'PG_DATA' } }, spec: { storageClassName: 'legacy-sc' } }, + ], + 'keycloak/cnpg.io/cluster=keycloak-db': [ + { metadata: { labels: { 'cnpg.io/pvcRole': 'PG_DATA' } }, spec: { storageClassName: 'legacy-sc' } }, + ], + 'monitoring/operator.prometheus.io/name=po-prometheus': [{ spec: { storageClassName: 'legacy-sc' } }], + } + return bySelector[`${namespace}/${labelSelector}`] || [] + }) + + await preservePvcStorageClassInRawValues(values, makeDeps({ readPvc, listPvcs })) + + expect(values.apps['git-server']._rawValues.persistence.storageClass).toBe('legacy-sc') + expect(values.apps.gitea._rawValues.global.storageClass).toBe('legacy-sc') + expect(values.apps.gitea._rawValues.giteaBackup.storageClassName).toBe('legacy-sc') + expect(values.databases.gitea.storageClass).toBe('legacy-sc') + expect(values.apps.harbor._rawValues.persistence.persistentVolumeClaim.redis.storageClass).toBe('legacy-sc') + expect(values.apps.harbor._rawValues.persistence.persistentVolumeClaim.trivy.storageClass).toBe('legacy-sc') + expect(values.databases.harbor.storageClass).toBe('legacy-sc') + expect(values.databases.keycloak.storageClass).toBe('legacy-sc') + expect(values.apps['kubeflow-pipelines']._rawValues.mysql.storage.storageClass).toBe('legacy-sc') + expect( + values.apps.prometheus._rawValues.prometheus.prometheusSpec.storageSpec.volumeClaimTemplate.spec.storageClassName, + ).toBe('legacy-sc') + }) + + it('should not set overrides when pvc storageClass equals cluster default', async () => { + const values: Record = { + cluster: { defaultStorageClass: 'linode-block-storage' }, + databases: { + gitea: {}, + harbor: {}, + keycloak: {}, + }, + apps: { + gitea: { _rawValues: {} }, + harbor: { _rawValues: {} }, + keycloak: { _rawValues: {} }, + prometheus: { _rawValues: {} }, + 'kubeflow-pipelines': { _rawValues: {} }, + 'git-server': { _rawValues: {} }, + }, + } + + const readPvc = jest.fn(async () => ({ spec: { storageClassName: 'linode-block-storage' } })) + const listPvcs = jest.fn(async () => [{ spec: { storageClassName: 'linode-block-storage' } }]) + + await preservePvcStorageClassInRawValues(values, makeDeps({ readPvc, listPvcs })) + + expect(values.apps['git-server']._rawValues).toEqual({}) + expect(values.apps.gitea._rawValues).toEqual({}) + expect(values.apps.harbor._rawValues).toEqual({}) + expect(values.apps.keycloak._rawValues).toEqual({}) + expect(values.apps['kubeflow-pipelines']._rawValues).toEqual({}) + expect(values.apps.prometheus._rawValues).toEqual({}) + expect(values.databases.gitea).toEqual({}) + expect(values.databases.harbor).toEqual({}) + expect(values.databases.keycloak).toEqual({}) + }) + + it('should keep existing databases.storageClass overrides', async () => { + const values: Record = { + cluster: { defaultStorageClass: 'linode-block-storage' }, + databases: { + gitea: { storageClass: 'preset-db-sc' }, + harbor: { storageClass: 'preset-db-sc' }, + keycloak: { storageClass: 'preset-db-sc' }, + }, + } + + const listPvcs = jest.fn(async (namespace: string, labelSelector: string) => { + const bySelector: Record = { + 'gitea/cnpg.io/cluster=gitea-db': [ + { metadata: { labels: { 'cnpg.io/pvcRole': 'PG_DATA' } }, spec: { storageClassName: 'legacy-sc' } }, + ], + 'harbor/cnpg.io/cluster=harbor-otomi-db': [ + { metadata: { labels: { 'cnpg.io/pvcRole': 'PG_DATA' } }, spec: { storageClassName: 'legacy-sc' } }, + ], + 'keycloak/cnpg.io/cluster=keycloak-db': [ + { metadata: { labels: { 'cnpg.io/pvcRole': 'PG_DATA' } }, spec: { storageClassName: 'legacy-sc' } }, + ], + } + return bySelector[`${namespace}/${labelSelector}`] || [] + }) + + await preservePvcStorageClassInRawValues(values, makeDeps({ listPvcs })) + + expect(values.databases.gitea.storageClass).toBe('preset-db-sc') + expect(values.databases.harbor.storageClass).toBe('preset-db-sc') + expect(values.databases.keycloak.storageClass).toBe('preset-db-sc') + }) +}) diff --git a/src/cmd/migrate.ts b/src/cmd/migrate.ts index 86607e9cee..3fa2b42d10 100644 --- a/src/cmd/migrate.ts +++ b/src/cmd/migrate.ts @@ -16,6 +16,7 @@ import { BasicArguments, getParsedArgs, setParsedArgs } from 'src/common/yargs' import { Argv } from 'yargs' import { cd, sleep } from 'zx' import { OTOMI_SECRETS, SEALED_SECRETS_NAMESPACE } from '../common/constants' +import { getOldGitCredentials, setGitConfig } from '../common/git-config' import { createArgoCdRedisSecret, ensureNamespaceExists, @@ -40,7 +41,6 @@ import { SealedSecretManifest, writeSealedSecretManifests, } from '../common/sealed-secrets' -import { getOldGitCredentials, setGitConfig } from '../common/git-config' const cmdName = getFilename(__filename) const sealedSecretManifestsGlob = `${env.ENV_DIR}/env/manifests/namespaces/**/sealedsecrets/*.yaml` @@ -463,6 +463,106 @@ export const addRedisSecretForArgoCD = async (values: Record): Prom } } +type PvcReadResult = { spec?: { storageClassName?: string }; metadata?: { labels?: Record } } + +interface PreservePvcStorageClassDeps { + readPvc: (namespace: string, name: string) => Promise + listPvcs: (namespace: string, labelSelector: string) => Promise + getParsedArgs: typeof getParsedArgs + terminal: typeof terminal +} + +export const preservePvcStorageClassInRawValues = async ( + values: Record, + deps: PreservePvcStorageClassDeps = { + readPvc: async (namespace: string, name: string) => { + try { + return await k8s.core().readNamespacedPersistentVolumeClaim({ namespace, name }) + } catch (error) { + if (error instanceof ApiException && error.code === 404) return undefined + throw error + } + }, + listPvcs: async (namespace: string, labelSelector: string) => { + const pvcList = await k8s.core().listNamespacedPersistentVolumeClaim({ namespace, labelSelector }) + return pvcList?.items || [] + }, + getParsedArgs, + terminal, + }, +): Promise => { + const d = deps.terminal('preservePvcStorageClassInRawValues') + const parsedArgs = deps.getParsedArgs() + if (parsedArgs?.dryRun || parsedArgs?.local || env.DISABLE_SYNC) { + d.info('Skipping PVC storageClass preservation in dry-run/local/dev mode') + return + } + + const clusterDefaultStorageClass = values?.cluster?.defaultStorageClass ?? '' + const maybeSetRawValue = (path: string, pvcStorageClass?: string): void => { + if (!pvcStorageClass) return + if (pvcStorageClass === clusterDefaultStorageClass) return + const existing = get(values, path) + if (existing !== undefined) { + d.info(`Keeping existing override at ${path}`) + return + } + set(values, path, pvcStorageClass) + d.info(`Set ${path}=${pvcStorageClass} to preserve existing PVC storageClass`) + } + + const gitServerPvc = await deps.readPvc('git-server', 'git-server-data') + maybeSetRawValue('apps.git-server._rawValues.persistence.storageClass', gitServerPvc?.spec?.storageClassName) + + const giteaPvc = await deps.readPvc('gitea', 'data-gitea-0') + maybeSetRawValue('apps.gitea._rawValues.global.storageClass', giteaPvc?.spec?.storageClassName) + + const giteaBackupPvc = await deps.readPvc('gitea', 'gitea-backup') + maybeSetRawValue('apps.gitea._rawValues.giteaBackup.storageClassName', giteaBackupPvc?.spec?.storageClassName) + + const giteaDbPvcs = await deps.listPvcs('gitea', 'cnpg.io/cluster=gitea-db') + const giteaDbDataPvc = giteaDbPvcs.find((pvc) => pvc?.metadata?.labels?.['cnpg.io/pvcRole'] === 'PG_DATA') + maybeSetRawValue( + 'databases.gitea.storageClass', + giteaDbDataPvc?.spec?.storageClassName || giteaDbPvcs[0]?.spec?.storageClassName, + ) + + const harborRedisPvcs = await deps.listPvcs('harbor', 'app.kubernetes.io/instance=harbor,component=redis') + maybeSetRawValue( + 'apps.harbor._rawValues.persistence.persistentVolumeClaim.redis.storageClass', + harborRedisPvcs[0]?.spec?.storageClassName, + ) + + const harborTrivyPvcs = await deps.listPvcs('harbor', 'app.kubernetes.io/instance=harbor,component=trivy') + maybeSetRawValue( + 'apps.harbor._rawValues.persistence.persistentVolumeClaim.trivy.storageClass', + harborTrivyPvcs[0]?.spec?.storageClassName, + ) + + const harborDbPvcs = await deps.listPvcs('harbor', 'cnpg.io/cluster=harbor-otomi-db') + const harborDbDataPvc = harborDbPvcs.find((pvc) => pvc?.metadata?.labels?.['cnpg.io/pvcRole'] === 'PG_DATA') + maybeSetRawValue( + 'databases.harbor.storageClass', + harborDbDataPvc?.spec?.storageClassName || harborDbPvcs[0]?.spec?.storageClassName, + ) + + const keycloakDbPvcs = await deps.listPvcs('keycloak', 'cnpg.io/cluster=keycloak-db') + const keycloakDbDataPvc = keycloakDbPvcs.find((pvc) => pvc?.metadata?.labels?.['cnpg.io/pvcRole'] === 'PG_DATA') + maybeSetRawValue( + 'databases.keycloak.storageClass', + keycloakDbDataPvc?.spec?.storageClassName || keycloakDbPvcs[0]?.spec?.storageClassName, + ) + + const kubeflowPvc = await deps.readPvc('kfp', 'mysql-pv-claim') + maybeSetRawValue('apps.kubeflow-pipelines._rawValues.mysql.storage.storageClass', kubeflowPvc?.spec?.storageClassName) + + const prometheusPvcs = await deps.listPvcs('monitoring', 'operator.prometheus.io/name=po-prometheus') + maybeSetRawValue( + 'apps.prometheus._rawValues.prometheus.prometheusSpec.storageSpec.volumeClaimTemplate.spec.storageClassName', + prometheusPvcs[0]?.spec?.storageClassName, + ) +} + const addLinodeNBAnnotations = async (values: Record): Promise => { const d = terminal('addLinodeNBAnnotations') if (values?.cluster?.provider !== 'linode') { @@ -725,6 +825,7 @@ const removeIngressNginxValues = async (values: Record) => { const customMigrationFunctions: Record = { valkeyAndOauth2RedisPVCMigration, + preservePvcStorageClassInRawValues, addLinodeNBAnnotations, sopsMigration, setIngressDefault, diff --git a/values-changes.yaml b/values-changes.yaml index f9f7b4e559..31958656ca 100644 --- a/values-changes.yaml +++ b/values-changes.yaml @@ -504,3 +504,6 @@ changes: - version: 70 deletions: - 'teamConfig.{team}.password' + - version: 71 + customFunctions: + - preservePvcStorageClassInRawValues diff --git a/values-schema.yaml b/values-schema.yaml index d2cfa10baf..ce355a21ee 100644 --- a/values-schema.yaml +++ b/values-schema.yaml @@ -2943,6 +2943,8 @@ properties: properties: size: type: string + storageClass: + type: string walStorageSize: type: string resources: @@ -2972,6 +2974,8 @@ properties: properties: size: type: string + storageClass: + type: string walStorageSize: type: string resources: @@ -3001,6 +3005,8 @@ properties: properties: size: type: string + storageClass: + type: string walStorageSize: type: string resources: diff --git a/values/gitea/gitea-otomi-db.gotmpl b/values/gitea/gitea-otomi-db.gotmpl index 134288b515..d274c38941 100644 --- a/values/gitea/gitea-otomi-db.gotmpl +++ b/values/gitea/gitea-otomi-db.gotmpl @@ -1,16 +1,16 @@ {{- $v := .Values }} -{{- $k := $v.apps.gitea }} {{- $cnpg := $v.apps.cnpg }} {{- $gdb := $v.databases.gitea }} {{- $obj := $v.obj.provider }} {{- $b := $v.platformBackups.database.gitea }} +{{- $dbStorageClass := $gdb | get "storageClass" $v.cluster.defaultStorageClass }} name: gitea-db storage: - storageClass: {{ $v.cluster.defaultStorageClass }} + storageClass: {{ $dbStorageClass }} size: {{ $gdb.size }} walStorage: - storageClass: {{ $v.cluster.defaultStorageClass }} + storageClass: {{ $dbStorageClass }} size: {{ $gdb.walStorageSize }} instances: {{ $gdb.replicas }} diff --git a/values/gitea/gitea-raw.gotmpl b/values/gitea/gitea-raw.gotmpl index 34efad925c..822312c8be 100644 --- a/values/gitea/gitea-raw.gotmpl +++ b/values/gitea/gitea-raw.gotmpl @@ -2,6 +2,7 @@ {{- $g := $v.apps.gitea }} {{- $otomiAdmin := "otomi-admin" }} {{- $obj := $v.obj.provider }} +{{- $giteaBackupStorageClass := $g | get "_rawValues.giteaBackup.storageClassName" $v.cluster.defaultStorageClass }} {{- $giteaBackupConfig := $v.platformBackups.gitea }} {{- $rcloneVersion := "1.74.0" }} {{- $rcloneZipSha512 := "deaf15bf8227ebeb5ead6ab033d34f0c21dca0bec272614958e0590ee85a4fd72abe8aa30c3fe8099b8632e18d999e1083cb119a1b1a56f6fff094ab027f8813" }} @@ -103,8 +104,8 @@ resources: resources: requests: storage: 1Gi - {{- if $v.cluster.defaultStorageClass }} - storageClassName: {{ $v.cluster.defaultStorageClass }} + {{- if $giteaBackupStorageClass }} + storageClassName: {{ $giteaBackupStorageClass }} {{- end }} {{- end }} {{- if $giteaBackupConfig.enabled }} diff --git a/values/gitea/gitea-valkey.gotmpl b/values/gitea/gitea-valkey.gotmpl index cbbe100975..819776704d 100644 --- a/values/gitea/gitea-valkey.gotmpl +++ b/values/gitea/gitea-valkey.gotmpl @@ -1,9 +1,11 @@ {{- $v := .Values }} global: - defaultStorageClass: {{ if eq $v.cluster.provider "linode" }}linode-block-storage{{ else }}{{ $v.cluster.defaultStorageClass | default "" }}{{ end }} security: allowInsecureImages: true + {{- with $v.cluster | get "defaultStorageClass" nil }} + defaultStorageClass: {{ . | quote }} + {{- end }} image: {{- if $v.otomi.linodeLkeImageRepository }} diff --git a/values/harbor/harbor-otomi-db.gotmpl b/values/harbor/harbor-otomi-db.gotmpl index 1caa33afaa..86b473f3d5 100644 --- a/values/harbor/harbor-otomi-db.gotmpl +++ b/values/harbor/harbor-otomi-db.gotmpl @@ -3,13 +3,14 @@ {{- $cnpg := $v.apps.cnpg }} {{- $obj := $v.obj.provider }} {{- $b := $v.platformBackups.database.harbor }} +{{- $dbStorageClass := $hdb | get "storageClass" $v.cluster.defaultStorageClass }} name: harbor-otomi-db storage: - storageClass: {{ $v.cluster.defaultStorageClass }} + storageClass: {{ $dbStorageClass }} size: {{ $hdb.size }} walStorage: - storageClass: {{ $v.cluster.defaultStorageClass }} + storageClass: {{ $dbStorageClass }} size: {{ $hdb.walStorageSize }} instances: {{ $hdb.replicas }} diff --git a/values/keycloak/keycloak-otomi-db.gotmpl b/values/keycloak/keycloak-otomi-db.gotmpl index b988a8afd8..2a9b898305 100644 --- a/values/keycloak/keycloak-otomi-db.gotmpl +++ b/values/keycloak/keycloak-otomi-db.gotmpl @@ -1,16 +1,16 @@ {{- $v := .Values }} -{{- $k := $v.apps.keycloak }} {{- $cnpg := $v.apps.cnpg }} {{- $kdb := $v.databases.keycloak }} {{- $obj := $v.obj.provider }} {{- $b := $v.platformBackups.database.keycloak }} +{{- $dbStorageClass := $kdb | get "storageClass" $v.cluster.defaultStorageClass }} name: keycloak-db storage: - storageClass: {{ $v.cluster.defaultStorageClass }} + storageClass: {{ $dbStorageClass }} size: {{ $kdb.size }} walStorage: - storageClass: {{ $v.cluster.defaultStorageClass }} + storageClass: {{ $dbStorageClass }} size: {{ $kdb.walStorageSize }} instances: {{ $kdb.replicas }} diff --git a/values/loki/loki.gotmpl b/values/loki/loki.gotmpl index 6e7dd2ead7..adb1a3a7ed 100644 --- a/values/loki/loki.gotmpl +++ b/values/loki/loki.gotmpl @@ -276,6 +276,11 @@ deploymentMode: SingleBinary singleBinary: replicas: 1 + {{- with $v.cluster | get "defaultStorageClass" nil }} + persistence: + storageClass: {{ . | quote }} + {{- end }} + resources: {{ $l.resources.singleBinary | toYaml | nindent 4 }} podAnnotations: diff --git a/values/oauth2-proxy/oauth2-proxy.gotmpl b/values/oauth2-proxy/oauth2-proxy.gotmpl index 04940ce42a..4bb3eba654 100644 --- a/values/oauth2-proxy/oauth2-proxy.gotmpl +++ b/values/oauth2-proxy/oauth2-proxy.gotmpl @@ -6,6 +6,7 @@ {{- $o := $v | get "oidc" dict }} {{- $domainSuffix := $v.cluster.domainSuffix }} {{- $httpRoute := tpl (readFile "../../helmfile.d/snippets/routes.gotmpl") $v | fromYaml }} +{{- $persistentStorageEnabled := hasKey $r "persistentVolumeSize" }} # get all public domains that don't have the cluster domain as root {{ $domains := list (print "." $domainSuffix) "oauth2-proxy.istio-system.svc.cluster.local" }} @@ -153,13 +154,13 @@ redis-ha: {{- end }} persistentVolume: - {{- if $r.persistentVolumeSize }} + enabled: {{ $persistentStorageEnabled }} size: {{ $r.persistentVolumeSize }} - storageClass: {{ if eq $v.cluster.provider "linode" }}linode-block-storage{{ else }}{{ $v.cluster.defaultStorageClass | default "" }}{{ end }} - {{- else }} - enabled: false + {{- with $v.cluster | get "defaultStorageClass" nil }} + storageClass: {{ . | quote }} {{- end }} + sentinel: resources: {{- $r.resources.sentinel | toYaml | nindent 6 }}