63 lines
3.1 KiB
Bash
Executable File
63 lines
3.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
project_dir=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
|
|
chart_dir="${project_dir}/chart/diun"
|
|
rendered_file="${TMPDIR:-/tmp}/diun-chart-rendered.yaml"
|
|
example_values="${project_dir}/values.example.yaml"
|
|
|
|
command -v helm >/dev/null
|
|
command -v python3 >/dev/null
|
|
helm lint --strict "${chart_dir}"
|
|
helm template diun "${chart_dir}" \
|
|
--namespace diun \
|
|
--values "${example_values}" \
|
|
> "${rendered_file}"
|
|
python3 - "${rendered_file}" "${project_dir}" "${example_values}" <<'PY'
|
|
import sys
|
|
import yaml
|
|
from pathlib import Path
|
|
|
|
project_dir = Path(sys.argv[2])
|
|
with open(sys.argv[1], encoding="utf-8") as stream:
|
|
objects = [item for item in yaml.safe_load_all(stream) if item]
|
|
with (project_dir / "chart/diun/values.yaml").open(encoding="utf-8") as stream:
|
|
chart_values = yaml.safe_load(stream)
|
|
with (project_dir / "chart/diun/Chart.yaml").open(encoding="utf-8") as stream:
|
|
chart_metadata = yaml.safe_load(stream)
|
|
with open(sys.argv[3], encoding="utf-8") as stream:
|
|
example_values = yaml.safe_load(stream)
|
|
|
|
def one(kind, name):
|
|
matches = [obj for obj in objects if obj.get("kind") == kind and obj.get("metadata", {}).get("name") == name]
|
|
assert len(matches) == 1, f"expected one {kind}/{name}, found {len(matches)}"
|
|
return matches[0]
|
|
|
|
deployment = one("Deployment", "diun")
|
|
pod = deployment["spec"]["template"]
|
|
pod_spec = pod["spec"]
|
|
container = next(item for item in pod_spec["containers"] if item["name"] == "diun")
|
|
selector = deployment["spec"]["selector"]["matchLabels"]
|
|
assert all(pod["metadata"]["labels"].get(key) == value for key, value in selector.items())
|
|
assert deployment["spec"]["replicas"] == 1
|
|
expected_tag = chart_values["image"].get("tag") or str(chart_metadata["appVersion"])
|
|
assert container["image"] == f'{chart_values["image"]["repository"]}:{expected_tag}'
|
|
assert all(name in container for name in ("startupProbe", "readinessProbe", "livenessProbe"))
|
|
assert all(container[name]["exec"]["command"] == ["diun", "healthcheck"] for name in ("startupProbe", "readinessProbe", "livenessProbe"))
|
|
assert container["envFrom"][0]["configMapRef"]["name"] == "diun"
|
|
assert pod_spec["serviceAccountName"] == "diun"
|
|
assert any(item["name"] == "install-shoutrrr" for item in pod_spec["initContainers"])
|
|
assert one("ConfigMap", "diun-matrix-script")["data"].get("send-matrix.sh")
|
|
assert one("ClusterRole", "diun")["rules"] == [{"apiGroups": [""], "resources": ["pods"], "verbs": ["get", "list", "watch"]}]
|
|
assert one("ClusterRoleBinding", "diun")["roleRef"]["name"] == "diun"
|
|
pvc = one("PersistentVolumeClaim", "diun")
|
|
assert pvc["spec"]["storageClassName"] == example_values["persistence"]["storageClassName"]
|
|
assert pod_spec["volumes"][0]["persistentVolumeClaim"]["claimName"] == pvc["metadata"]["name"]
|
|
assert not any(item.get("kind") == "Secret" for item in objects), "chart must reference secrets, never render their data"
|
|
volume = next(item for item in pod_spec["volumes"] if item["name"] == "matrix-token")
|
|
assert volume["secret"]["secretName"] == example_values["matrix"]["tokenSecretName"]
|
|
mount = next(item for item in container["volumeMounts"] if item["name"] == "matrix-token")
|
|
assert mount["readOnly"] is True
|
|
PY
|