From d69258e28f90d6a7eb850c6f91c799b1899fd58d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Thu, 18 Dec 2014 15:41:38 +0100 Subject: [PATCH] Backend can now generate config.js, the very basic stuff, more work needed --- grafana | 2 +- pkg/api/api.go | 3 ++ pkg/api/api_account.go | 5 +-- pkg/api/api_config.go | 68 ++++++++++++++++++++++++++++++ pkg/configuration/configuration.go | 40 ------------------ pkg/models/datasource.go | 10 ++--- 6 files changed, 79 insertions(+), 49 deletions(-) create mode 100644 pkg/api/api_config.go delete mode 100644 pkg/configuration/configuration.go diff --git a/grafana b/grafana index ad91093902b..4e542d8b838 160000 --- a/grafana +++ b/grafana @@ -1 +1 @@ -Subproject commit ad91093902bdfc0d2a87bb362a76a9057aef4361 +Subproject commit 4e542d8b83844f8faa4d5ae3edab593950aaa344 diff --git a/pkg/api/api.go b/pkg/api/api.go index 5987168f85b..b08f051539d 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -43,6 +43,9 @@ func Register(m *macaron.Macaron) { m.Post("/api/dashboard/", auth, PostDashboard) m.Delete("/api/dashboard/:slug", auth, DeleteDashboard) + // frontend config + m.Get("/frontend/config", auth, GetConfigJS) + // rendering m.Get("/render/*", auth, RenderToPng) } diff --git a/pkg/api/api_account.go b/pkg/api/api_account.go index 0001cd4b9a1..2dff6bfeac9 100644 --- a/pkg/api/api_account.go +++ b/pkg/api/api_account.go @@ -1,7 +1,6 @@ package api import ( - "github.com/gin-gonic/gin" "github.com/torkelo/grafana-pro/pkg/api/dtos" "github.com/torkelo/grafana-pro/pkg/middleware" "github.com/torkelo/grafana-pro/pkg/models" @@ -96,7 +95,7 @@ func SetUsingAccount(c *middleware.Context) { otherAccounts, err := models.GetOtherAccountsFor(c.UserAccount.Id) if err != nil { - c.JSON(500, gin.H{"message": err.Error()}) + c.JSON(500, utils.DynMap{"message": err.Error()}) return } @@ -116,7 +115,7 @@ func SetUsingAccount(c *middleware.Context) { account.UsingAccountId = usingAccountId err = models.SaveAccount(account) if err != nil { - c.JSON(500, gin.H{"message": err.Error()}) + c.JSON(500, utils.DynMap{"message": err.Error()}) return } diff --git a/pkg/api/api_config.go b/pkg/api/api_config.go new file mode 100644 index 00000000000..17894b269fa --- /dev/null +++ b/pkg/api/api_config.go @@ -0,0 +1,68 @@ +package api + +import ( + "encoding/json" + "strings" + + "github.com/torkelo/grafana-pro/pkg/bus" + "github.com/torkelo/grafana-pro/pkg/middleware" + m "github.com/torkelo/grafana-pro/pkg/models" +) + +const configTemplate = ` + define(['settings'], + function (Settings) { + "use strict"; + return new Settings(%json%); + }); + ` + +type configJsTmplModel struct { + DataSources []*m.DataSource +} + +func renderConfig(data *configJsTmplModel) string { + datasources := make(map[string]interface{}) + + for _, ds := range data.DataSources { + datasources[ds.Name] = map[string]interface{}{ + "type": ds.Type, + "url": ds.Url, + } + } + + jsonObj := map[string]interface{}{ + "datasources": datasources, + } + + buff, _ := json.Marshal(jsonObj) + + return strings.Replace(configTemplate, "%json%", string(buff), 1) +} + +func GetConfigJS(c *middleware.Context) { + + query := m.GetDataSourcesQuery{AccountId: c.GetAccountId()} + err := bus.Dispatch(&query) + + if err != nil { + c.Handle(500, "cold not load data sources", err) + return + } + + vm := configJsTmplModel{DataSources: query.Result} + configStr := renderConfig(&vm) + + if err != nil { + c.Handle(500, "Failed to generate config.js", err) + return + } + + c.Header().Set("Content-Type", "text/javascript; charset=UTF-8") + c.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") + c.Header().Set("Pragma", "no-cache") + c.Header().Set("Expires", "0") + c.WriteHeader(200) + + c.Write([]byte(configStr)) +} diff --git a/pkg/configuration/configuration.go b/pkg/configuration/configuration.go deleted file mode 100644 index 78cf32ede5a..00000000000 --- a/pkg/configuration/configuration.go +++ /dev/null @@ -1,40 +0,0 @@ -package configuration - -type Cfg struct { - Http HttpCfg -} - -type HttpCfg struct { - Port string - GoogleOAuth OAuthCfg - GithubOAuth OAuthCfg -} - -type OAuthCfg struct { - Enabled bool - ClientId string - ClientSecret string -} - -type DashboardSourceCfg struct { - sourceType string - path string -} - -func NewCfg(port string) *Cfg { - return &Cfg{ - Http: HttpCfg{ - Port: port, - GoogleOAuth: OAuthCfg{ - Enabled: true, - ClientId: "106011922963-4pvl05e9urtrm8bbqr0vouosj3e8p8kb.apps.googleusercontent.com", - ClientSecret: "K2evIa4QhfbhhAm3SO72t2Zv", - }, - GithubOAuth: OAuthCfg{ - Enabled: true, - ClientId: "de054205006b9baa2e17", - ClientSecret: "72b7ea52d9f1096fdf36cea95e95362a307e0322", - }, - }, - } -} diff --git a/pkg/models/datasource.go b/pkg/models/datasource.go index 25ca8d66bd8..fbacfb09f24 100644 --- a/pkg/models/datasource.go +++ b/pkg/models/datasource.go @@ -3,11 +3,11 @@ package models import "time" const ( - DS_GRAPHITE = "GRAPHITE" - DS_INFLUXDB = "INFLUXDB" - DS_ES = "ES" - DS_ACCESS_DIRECT = "DIRECT" - DS_ACCESS_PROXY = "PROXY" + DS_GRAPHITE = "graphite" + DS_INFLUXDB = "influxdb" + DS_ES = "es" + DS_ACCESS_DIRECT = "direct" + DS_ACCESS_PROXY = "proxy" ) type DsType string