From 18652f9b84bd3b56ff84d07020158f897a80f375 Mon Sep 17 00:00:00 2001
From: Frederic Branczyk <fbranczyk@gmail.com>
Date: Thu, 20 Oct 2016 11:17:36 +0200
Subject: [PATCH] grafana-watcher: wait for Grafana to be available and
 initialize

---
 grafana-watcher/main.go               | 26 +++++++++++++++++++++++++-
 grafana-watcher/updater/dashboard.go  |  9 +++++++++
 grafana-watcher/updater/datasource.go |  8 ++++++++
 3 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/grafana-watcher/main.go b/grafana-watcher/main.go
index 34096705..ede90e83 100644
--- a/grafana-watcher/main.go
+++ b/grafana-watcher/main.go
@@ -5,6 +5,7 @@ import (
 	"log"
 	"os"
 	"path/filepath"
+	"time"
 
 	fsnotify "gopkg.in/fsnotify.v1"
 
@@ -85,9 +86,32 @@ func main() {
 	}
 
 	g := grafana.New(*grafanaUrl)
-	du := updater.NewGrafanaDashboardUpdater(g.Dashboards(), filepath.Join(*watchDir, "*-dashboard.json"))
+
+	for {
+		log.Println("Waiting for Grafana to be available.")
+		_, err := g.Datasources().All()
+		if err == nil {
+			break
+		}
+		time.Sleep(time.Second)
+	}
+
 	su := updater.NewGrafanaDatasourceUpdater(g.Datasources(), filepath.Join(*watchDir, "*-datasource.json"))
+	log.Println("Initializing datasources.")
+	err := su.Init()
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	du := updater.NewGrafanaDashboardUpdater(g.Dashboards(), filepath.Join(*watchDir, "*-dashboard.json"))
+	log.Println("Initializing dashboards.")
+	err = du.Init()
+	if err != nil {
+		log.Fatal(err)
+	}
+
 	w := newVolumeWatcher(*watchDir)
+
 	w.AddEventHandler(du)
 	w.AddEventHandler(su)
 
diff --git a/grafana-watcher/updater/dashboard.go b/grafana-watcher/updater/dashboard.go
index 4094a1b0..754a9490 100644
--- a/grafana-watcher/updater/dashboard.go
+++ b/grafana-watcher/updater/dashboard.go
@@ -9,6 +9,7 @@ import (
 )
 
 type Updater interface {
+	Init() error
 	OnModify() error
 }
 
@@ -24,7 +25,15 @@ func NewGrafanaDashboardUpdater(c grafana.DashboardsInterface, g string) Updater
 	}
 }
 
+func (u *GrafanaDashboardUpdater) Init() error {
+	return u.updateDashboards()
+}
+
 func (u *GrafanaDashboardUpdater) OnModify() error {
+	return u.updateDashboards()
+}
+
+func (u *GrafanaDashboardUpdater) updateDashboards() error {
 	err := u.deleteAllDashboards()
 	if err != nil {
 		return err
diff --git a/grafana-watcher/updater/datasource.go b/grafana-watcher/updater/datasource.go
index ad96852c..77c50282 100644
--- a/grafana-watcher/updater/datasource.go
+++ b/grafana-watcher/updater/datasource.go
@@ -20,7 +20,15 @@ func NewGrafanaDatasourceUpdater(c grafana.DatasourcesInterface, g string) Updat
 	}
 }
 
+func (u *GrafanaDatasourceUpdater) Init() error {
+	return u.updateDatasources()
+}
+
 func (u *GrafanaDatasourceUpdater) OnModify() error {
+	return u.updateDatasources()
+}
+
+func (u *GrafanaDatasourceUpdater) updateDatasources() error {
 	err := u.deleteAllDatasources()
 	if err != nil {
 		return err
-- 
GitLab