Add self-contained API simulators lab with Compose and Helm.
Ship Proxmox, oVirt, VMware, and OpenStack behind one Postgres stack, Makefile helpers (up/clean/helm up|down/push), and a Helm chart with namespace, Let's Encrypt ingresses, migrate inits, and skip-if-seeded jobs.
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
{{- 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 }}
|
||||
Reference in New Issue
Block a user