apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: grafana-import-dashboards
  namespace: monitoring
  labels:
    app: grafana
    component: import-dashboards
spec:
  successfulJobsHistoryLimit: 1
  failedJobsHistoryLimit: 2
  schedule: "3 0 * * *"
  jobTemplate:
    spec:
      template:
        metadata:
          name: grafana-import-dashboards
          labels:
            app: grafana
            component: import-dashboards
        spec:
          serviceAccountName: prometheus-k8s
          initContainers:
            - name: wait-for-grafana
              image: giantswarm/tiny-tools
              args:
                - /bin/sh
                - -c
                - >
                  set -x;
                  while [ $(curl -Lsw '%{http_code}' "http://grafana:3000" -o /dev/null) -ne 200 ]; do
                    echo '.'
                    sleep 15;
                  done
          containers:
            - name: grafana-import-dashboards
              image: giantswarm/tiny-tools
              command: ["/bin/sh", "-c"]
              workingDir: /opt/grafana-import-dashboards
              args:
                - >
                  for file in *-datasource.json ; do
                    if [ -e "$file" ] ; then
                      echo "importing $file" &&
                      curl --silent --fail --show-error \
                        --request POST http://${GF_ADMIN_USER}:${GF_ADMIN_PASSWORD}@grafana:3000/api/datasources \
                        --header "Content-Type: application/json" \
                        --data-binary "@$file" ;
                      echo "" ;
                    fi
                  done ;
                  for file in *-dashboard.json ; do
                    if [ -e "$file" ] ; then
                      echo "importing $file" &&
                      ( echo '{"dashboard":'; \
                        cat "$file"; \
                        echo ',"overwrite":true,"inputs":[{"name":"DS_PROMETHEUS","type":"datasource","pluginId":"prometheus","value":"prometheus"}]}' ) \
                      | jq -c '.' \
                      | curl --silent --fail --show-error \
                        --request POST http://${GF_ADMIN_USER}:${GF_ADMIN_PASSWORD}@grafana:3000/api/dashboards/import \
                        --header "Content-Type: application/json" \
                        --data-binary "@-" ;
                      echo "" ;
                    fi
                  done

              env:
                - name: GF_ADMIN_USER
                  valueFrom:
                    secretKeyRef:
                      name: grafana
                      key: admin-username
                - name: GF_ADMIN_PASSWORD
                  valueFrom:
                    secretKeyRef:
                      name: grafana
                      key: admin-password
              volumeMounts:
                - name: config-volume
                  mountPath: /opt/grafana-import-dashboards
          restartPolicy: Never
          volumes:
            - name: config-volume
              configMap:
                name: grafana-import-dashboards


