86 lines
2.9 KiB
Bash
Executable File
86 lines
2.9 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
|
|
local grafana_workload=""
|
|
|
|
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..."
|
|
if kubectl --kubeconfig "$KUBECONFIG_PATH" -n "$NAMESPACE" get deployment prometheus-stack-grafana >/dev/null 2>&1; then
|
|
grafana_workload="deployment/prometheus-stack-grafana"
|
|
elif kubectl --kubeconfig "$KUBECONFIG_PATH" -n "$NAMESPACE" get statefulset prometheus-stack-grafana >/dev/null 2>&1; then
|
|
grafana_workload="statefulset/prometheus-stack-grafana"
|
|
else
|
|
grafana_workload="$(
|
|
kubectl --kubeconfig "$KUBECONFIG_PATH" -n "$NAMESPACE" get deployment,statefulset \
|
|
-l app.kubernetes.io/name=grafana \
|
|
-o name 2>/dev/null | head -n 1
|
|
)"
|
|
fi
|
|
|
|
if [ -z "$grafana_workload" ]; then
|
|
echo "Grafana workload was not found in namespace ${NAMESPACE}; dashboards were applied but Grafana was not restarted." >&2
|
|
echo "Check with: kubectl -n ${NAMESPACE} get deploy,sts | grep grafana" >&2
|
|
return 1
|
|
fi
|
|
|
|
kubectl --kubeconfig "$KUBECONFIG_PATH" -n "$NAMESPACE" rollout restart "$grafana_workload"
|
|
}
|
|
|
|
case "${1:-list}" in
|
|
list)
|
|
list_dashboards
|
|
;;
|
|
apply|rebuild)
|
|
apply_dashboards
|
|
;;
|
|
-h|--help|help)
|
|
usage
|
|
;;
|
|
*)
|
|
usage >&2
|
|
exit 1
|
|
;;
|
|
esac
|