my-homelab-configs/scripts/grafana-dashboards

67 lines
2.0 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
DASHBOARD_DIR="${HOMELAB_GRAFANA_DASHBOARD_DIR:-${REPO_ROOT}/bootstrap/platform/grafana-dashboards}"
NAMESPACE="${HOMELAB_GRAFANA_NAMESPACE:-monitoring}"
KUBECONFIG_PATH="${KUBECONFIG:-${LAB_KUBECONFIG_PATH:-${HOME}/.kube/config}}"
usage() {
cat <<EOF
Usage: ./jeannie grafana-dashboards {list|apply}
list Show repo-managed dashboard files.
apply Rebuild Grafana dashboard ConfigMaps and restart Grafana.
EOF
}
list_dashboards() {
find "$DASHBOARD_DIR" -maxdepth 1 -type f -name '*.json' -print | sort
}
apply_dashboards() {
local file
local base
local name
if ! command -v kubectl >/dev/null 2>&1; then
echo "kubectl is required." >&2
exit 1
fi
if [ ! -s "$KUBECONFIG_PATH" ]; then
echo "kubeconfig is missing: $KUBECONFIG_PATH" >&2
exit 1
fi
while IFS= read -r file; do
base="$(basename "$file")"
name="homelab-grafana-${base%.json}"
echo "Applying Grafana dashboard ConfigMap ${NAMESPACE}/${name} from ${base}..."
kubectl --kubeconfig "$KUBECONFIG_PATH" -n "$NAMESPACE" create configmap "$name" \
--from-file="$base=$file" \
--dry-run=client -o yaml |
kubectl --kubeconfig "$KUBECONFIG_PATH" apply -f -
kubectl --kubeconfig "$KUBECONFIG_PATH" -n "$NAMESPACE" label configmap "$name" grafana_dashboard=1 --overwrite
kubectl --kubeconfig "$KUBECONFIG_PATH" -n "$NAMESPACE" annotate configmap "$name" grafana_folder=Homelab --overwrite
done < <(list_dashboards)
echo "Restarting Grafana so the sidecar reloads dashboards..."
kubectl --kubeconfig "$KUBECONFIG_PATH" -n "$NAMESPACE" rollout restart deployment/prometheus-stack-grafana
}
case "${1:-list}" in
list)
list_dashboards
;;
apply|rebuild)
apply_dashboards
;;
-h|--help|help)
usage
;;
*)
usage >&2
exit 1
;;
esac