#!/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 </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