Files
feedc0de 68c5ef5757
Validate, publish and promote Mumble chart / chart (push) Successful in 46s
Allow externally managed PostgreSQL
2026-10-25 07:47:20 +01:00

47 lines
3.0 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")"
sh -n install.sh bootstrap-homelab-secrets.sh scripts/chart-version.sh
helm repo add bitnami https://charts.bitnami.com/bitnami --force-update >/dev/null
helm dependency build chart/mumble >/dev/null
helm lint chart/mumble
helm lint chart/mumble --set postgresql.enabled=true
python3 - <<'PY'
import subprocess
import yaml
def render(*extra):
output = subprocess.check_output(['helm', 'template', 'mumble', 'chart/mumble',
'--namespace', 'default', '--set', 'postgresql.enabled=true',
*extra], text=True)
return [doc for doc in yaml.safe_load_all(output) if doc]
staged = render('--set', 'mumble.enabled=false')
assert not any(doc['kind'] == 'Deployment' for doc in staged)
assert any(doc['kind'] == 'StatefulSet' and doc['metadata']['name'] == 'mumble-postgresql' for doc in staged)
active = render()
deployment = next(doc for doc in active if doc['kind'] == 'Deployment' and doc['metadata']['name'] == 'mumble')
service = next(doc for doc in active if doc['kind'] == 'Service' and doc['metadata']['name'] == 'mumble')
assert not service['spec'].get('loadBalancerIP')
assert {port['protocol'] for port in service['spec']['ports']} == {'TCP', 'UDP'}
assert deployment['spec']['strategy']['type'] == 'Recreate'
pod = deployment['spec']['template']['spec']
assert [container['name'] for container in pod['initContainers']] == ['render-config']
assert pod['containers'][0]['image'].endswith('v1.5.939')
assert any(volume.get('secret', {}).get('secretName') == 'mumble-tls' for volume in pod['volumes'])
direct = render('--set', 'service.additionalServices.funkfeuer.spec.type=ClusterIP', '--set', 'service.additionalServices.funkfeuer.spec.externalIPs[0]=10.12.4.170')
direct_service = next(doc for doc in direct if doc['kind'] == 'Service' and doc['metadata']['name'] == 'mumble-funkfeuer')
assert direct_service['spec']['externalIPs'] == ['10.12.4.170']
assert direct_service['spec']['type'] == 'ClusterIP'
assert 'externalTrafficPolicy' not in direct_service['spec']
assert {port['protocol'] for port in direct_service['spec']['ports']} == {'TCP', 'UDP'}
external = render('--set', 'postgresql.enabled=false', '--set', 'database.host=postgresql.example.net')
external_pod = next(doc for doc in external if doc['kind'] == 'Deployment')['spec']['template']['spec']
assert [container['name'] for container in external_pod['initContainers']] == ['render-config', 'bootstrap-postgresql']
cnpg = render('--set', 'postgresql.enabled=false', '--set', 'database.bootstrap.enabled=false', '--set', 'database.host=mumble-postgresql-rw.mumble.svc.cluster.local')
cnpg_pod = next(doc for doc in cnpg if doc['kind'] == 'Deployment')['spec']['template']['spec']
assert [container['name'] for container in cnpg_pod['initContainers']] == ['render-config']
assert cnpg_pod['initContainers'][0]['env'][0]['value'] == 'mumble-postgresql-rw.mumble.svc.cluster.local'
print('Mumble chart renders staged PostgreSQL and active Mumble without cleartext credentials.')
PY