{{- if .Values.dbInit.enabled }} apiVersion: batch/v1 kind: Job metadata: name: {{ include "hades.fullname" . }}-dbinit labels: {{- include "hades.labels" . | nindent 4 }} app.kubernetes.io/component: dbinit annotations: # ArgoCD sync wave - same wave as MySQL (0), wait-for-db handles timing argocd.argoproj.io/sync-wave: "0" argocd.argoproj.io/hook-delete-policy: BeforeHookCreation # Helm hooks (for non-ArgoCD deployments) "helm.sh/hook": post-install,post-upgrade "helm.sh/hook-weight": "-5" "helm.sh/hook-delete-policy": before-hook-creation spec: backoffLimit: 5 ttlSecondsAfterFinished: 300 template: metadata: labels: app.kubernetes.io/component: dbinit {{- include "hades.selectorLabels" . | nindent 8 }} spec: restartPolicy: OnFailure initContainers: # Wait for MySQL to be ready - name: wait-for-db image: busybox:1.36 command: - sh - -c - | echo "Waiting for database to be ready..." until nc -z {{ include "hades.databaseHost" . }} {{ include "hades.databasePort" . }}; do echo "Database is unavailable - sleeping" sleep 2 done echo "Database is up!" sleep 10 containers: - name: dbinit image: mysql:8.0 env: - name: MYSQL_HOST value: {{ include "hades.databaseHost" . | quote }} - name: MYSQL_PORT value: {{ include "hades.databasePort" . | quote }} - name: MYSQL_DATABASE value: {{ include "hades.databaseName" . | quote }} - name: MYSQL_USER value: {{ .Values.dbInit.mysqlUser | default "root" | quote }} - name: MYSQL_PWD valueFrom: secretKeyRef: name: {{ include "hades.databaseSecretName" . }} key: {{ .Values.dbInit.mysqlPasswordKey | default "mysql-root-password" }} command: - /bin/bash - -c - | set -ex echo "=========================================" echo "Hades Database Migration" echo "=========================================" echo "Host: ${MYSQL_HOST}:${MYSQL_PORT}" echo "Database: ${MYSQL_DATABASE}" echo "User: ${MYSQL_USER}" echo "=========================================" # Test connection echo "Testing database connection..." if ! mysql -h"${MYSQL_HOST}" -P"${MYSQL_PORT}" -u"${MYSQL_USER}" -e "SELECT 1" "${MYSQL_DATABASE}" &> /dev/null; then echo "ERROR: Cannot connect to database" exit 1 fi echo "✓ Database connection successful" echo "" # Apply migrations in order TOTAL=0 SUCCESS=0 FAILED=0 for sql_file in /migrations/*.sql; do if [ ! -f "$sql_file" ]; then continue fi filename=$(basename "$sql_file") TOTAL=$((TOTAL + 1)) echo -n "Applying $filename... " if mysql -h"${MYSQL_HOST}" -P"${MYSQL_PORT}" -u"${MYSQL_USER}" "${MYSQL_DATABASE}" < "$sql_file" 2>/tmp/migration_error.log; then echo "✓ SUCCESS" SUCCESS=$((SUCCESS + 1)) else echo "✗ FAILED" echo "Error details:" cat /tmp/migration_error.log FAILED=$((FAILED + 1)) # Stop on first error echo "" echo "=========================================" echo "Migration failed at: $filename" echo "=========================================" exit 1 fi done echo "" echo "=========================================" echo "Migration Summary:" echo " Total: $TOTAL" echo " Success: $SUCCESS" echo " Failed: $FAILED" echo "=========================================" if [ $FAILED -eq 0 ]; then echo "✓ All migrations completed successfully!" exit 0 else echo "✗ Some migrations failed" exit 1 fi volumeMounts: - name: sql-migrations mountPath: /migrations volumes: - name: sql-migrations configMap: name: {{ include "hades.fullname" . }}-sql-migrations {{- end }}