{{- if .Values.seedJobs.enabled }} {{- range $name, $sim := .Values.simulators }} {{- if and $sim.enabled $sim.seed $sim.seed.enabled }} {{- $fullname := printf "%s-%s" (include "lab.fullname" $) $name }} {{- $tag := $sim.image.tag | default $.Values.imageTag }} apiVersion: batch/v1 kind: Job metadata: name: {{ $fullname }}-seed namespace: {{ include "lab.namespace" $ }} labels: {{- include "lab.labels" $ | nindent 4 }} app.kubernetes.io/component: {{ $name }}-seed annotations: helm.sh/hook: post-install,post-upgrade helm.sh/hook-weight: "10" helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded spec: backoffLimit: {{ $.Values.seedJobs.backoffLimit }} ttlSecondsAfterFinished: {{ $.Values.seedJobs.ttlSecondsAfterFinished }} template: metadata: labels: {{- include "lab.selectorLabels" $ | nindent 8 }} app.kubernetes.io/component: {{ $name }}-seed spec: restartPolicy: OnFailure {{- with $.Values.imagePullSecrets }} imagePullSecrets: {{- toYaml . | nindent 8 }} {{- end }} initContainers: - name: wait-ready image: curlimages/curl:8.12.1 imagePullPolicy: IfNotPresent command: - sh - -ec - | url="http://{{ $fullname }}:{{ $sim.port }}{{ $sim.healthPath }}" echo "waiting for $url" until curl -fsS "$url" >/dev/null; do sleep 3; done containers: - name: seed image: "{{ $sim.image.repository }}:{{ $tag }}" imagePullPolicy: {{ $sim.image.pullPolicy }} # Skip when skipIfSql returns a row (DB already seeded / has lab data). command: - python - -c - | import asyncio, os, subprocess, sys import asyncpg skip_sql = os.environ.get("SEED_SKIP_IF_SQL", "").strip() seed_cmd = {{ $sim.seed.command | toJson }} async def already_seeded() -> bool: if not skip_sql: return False conn = await asyncpg.connect(os.environ["DATABASE_URL"]) try: return await conn.fetchval(skip_sql) is not None except Exception as exc: # noqa: BLE001 — empty/unmigrated DB print(f"seed: skip-check deferred ({exc})") return False finally: await conn.close() if asyncio.run(already_seeded()): print("seed: database already has data — skipping") raise SystemExit(0) print("seed: applying", seed_cmd) raise SystemExit(subprocess.call(seed_cmd)) env: {{- include "lab.commonEnv" $ | nindent 12 }} - name: DATABASE_URL value: {{ include "lab.databaseUrl" (dict "root" $ "sim" $sim) | quote }} - name: SEED_SKIP_IF_SQL value: {{ ($sim.seed.skipIfSql | default "") | quote }} {{- range $k, $v := $sim.env }} - name: {{ $k }} value: {{ $v | quote }} {{- end }} {{- range $k, $v := ($sim.seed.env | default dict) }} - name: {{ $k }} value: {{ $v | quote }} {{- end }} --- {{- end }} {{- end }} {{- end }}