mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Progress on data source admin
This commit is contained in:
1
Makefile
1
Makefile
@@ -4,6 +4,7 @@ all: build
|
|||||||
|
|
||||||
build:
|
build:
|
||||||
go build -o bin/grafana .
|
go build -o bin/grafana .
|
||||||
|
go test ./pkg/...
|
||||||
|
|
||||||
lint:
|
lint:
|
||||||
@gofmt -w . && go tool vet pkg/**/*.go && echo "$(GOLINT)"
|
@gofmt -w . && go tool vet pkg/**/*.go && echo "$(GOLINT)"
|
||||||
|
|||||||
2
grafana
2
grafana
Submodule grafana updated: b3b096e204...adb1502e72
@@ -27,7 +27,8 @@ func Register(m *macaron.Macaron) {
|
|||||||
|
|
||||||
// datasources
|
// datasources
|
||||||
m.Get("/admin/datasources/", auth, Index)
|
m.Get("/admin/datasources/", auth, Index)
|
||||||
m.Get("/api/admin/datasources/", auth, GetDataSources)
|
m.Get("/api/admin/datasource/list", auth, GetDataSources)
|
||||||
|
m.Post("/api/admin/datasource/add", auth, AddDataSource)
|
||||||
|
|
||||||
// user register
|
// user register
|
||||||
m.Get("/register/*_", Index)
|
m.Get("/register/*_", Index)
|
||||||
|
|||||||
@@ -8,10 +8,26 @@ import (
|
|||||||
|
|
||||||
func GetDataSources(c *middleware.Context) {
|
func GetDataSources(c *middleware.Context) {
|
||||||
query := m.GetDataSourcesQuery{AccountId: c.Account.Id}
|
query := m.GetDataSourcesQuery{AccountId: c.Account.Id}
|
||||||
err := bus.SendQuery(&query)
|
err := bus.Dispatch(&query)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JsonApiErr(500, "Failed to query datasources", err)
|
c.JsonApiErr(500, "Failed to query datasources", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func AddDataSource(c *middleware.Context) {
|
||||||
|
cmd := m.AddDataSourceCommand{}
|
||||||
|
|
||||||
|
if !c.JsonBody(&cmd) {
|
||||||
|
c.JsonApiErr(400, "bad request", nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err := bus.Dispatch(&cmd)
|
||||||
|
if err != nil {
|
||||||
|
c.JsonApiErr(500, "Failed to add datasource", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -6,16 +6,16 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
)
|
)
|
||||||
|
|
||||||
type QueryHandler interface{}
|
type HandlerFunc interface{}
|
||||||
type Query interface{}
|
type Msg interface{}
|
||||||
|
|
||||||
type Bus interface {
|
type Bus interface {
|
||||||
SendQuery(query Query) error
|
Dispatch(msg Msg) error
|
||||||
AddQueryHandler(handler QueryHandler)
|
AddHandler(handler HandlerFunc)
|
||||||
}
|
}
|
||||||
|
|
||||||
type InProcBus struct {
|
type InProcBus struct {
|
||||||
handlerIndex map[string]QueryHandler
|
handlers map[string]HandlerFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
// temp stuff, not sure how to handle bus instance, and init yet
|
// temp stuff, not sure how to handle bus instance, and init yet
|
||||||
@@ -23,21 +23,20 @@ var globalBus = New()
|
|||||||
|
|
||||||
func New() Bus {
|
func New() Bus {
|
||||||
bus := &InProcBus{}
|
bus := &InProcBus{}
|
||||||
bus.handlerIndex = make(map[string]QueryHandler)
|
bus.handlers = make(map[string]HandlerFunc)
|
||||||
return bus
|
return bus
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *InProcBus) SendQuery(query Query) error {
|
func (b *InProcBus) Dispatch(msg Msg) error {
|
||||||
var queryName = reflect.TypeOf(query).Elem().Name()
|
var msgName = reflect.TypeOf(msg).Elem().Name()
|
||||||
fmt.Printf("sending query for type: %v\n", queryName)
|
|
||||||
|
|
||||||
var handler = b.handlerIndex[queryName]
|
var handler = b.handlers[msgName]
|
||||||
if handler == nil {
|
if handler == nil {
|
||||||
return errors.New("handler not found")
|
return errors.New("handler not found")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var params = make([]reflect.Value, 1)
|
var params = make([]reflect.Value, 1)
|
||||||
params[0] = reflect.ValueOf(query)
|
params[0] = reflect.ValueOf(msg)
|
||||||
|
|
||||||
ret := reflect.ValueOf(handler).Call(params)
|
ret := reflect.ValueOf(handler).Call(params)
|
||||||
err := ret[0].Interface()
|
err := ret[0].Interface()
|
||||||
@@ -48,18 +47,18 @@ func (b *InProcBus) SendQuery(query Query) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *InProcBus) AddQueryHandler(handler QueryHandler) {
|
func (b *InProcBus) AddHandler(handler HandlerFunc) {
|
||||||
handlerType := reflect.TypeOf(handler)
|
handlerType := reflect.TypeOf(handler)
|
||||||
queryTypeName := handlerType.In(0).Elem().Name()
|
queryTypeName := handlerType.In(0).Elem().Name()
|
||||||
fmt.Printf("QueryType %v\n", queryTypeName)
|
fmt.Printf("QueryType %v\n", queryTypeName)
|
||||||
b.handlerIndex[queryTypeName] = handler
|
b.handlers[queryTypeName] = handler
|
||||||
}
|
}
|
||||||
|
|
||||||
// Package level functions
|
// Package level functions
|
||||||
func AddQueryHandler(implName string, handler QueryHandler) {
|
func AddHandler(implName string, handler HandlerFunc) {
|
||||||
globalBus.AddQueryHandler(handler)
|
globalBus.AddHandler(handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
func SendQuery(query Query) error {
|
func Dispatch(msg Msg) error {
|
||||||
return globalBus.SendQuery(query)
|
return globalBus.Dispatch(msg)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,14 +10,14 @@ type TestQuery struct {
|
|||||||
Resp string
|
Resp string
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHandlerReturnsError(t *testing.T) {
|
func TestQueryHandlerReturnsError(t *testing.T) {
|
||||||
bus := New()
|
bus := New()
|
||||||
|
|
||||||
bus.AddQueryHandler(func(query *TestQuery) error {
|
bus.AddHandler(func(query *TestQuery) error {
|
||||||
return errors.New("handler error")
|
return errors.New("handler error")
|
||||||
})
|
})
|
||||||
|
|
||||||
err := bus.SendQuery(&TestQuery{})
|
err := bus.Dispatch(&TestQuery{})
|
||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatal("Send query failed " + err.Error())
|
t.Fatal("Send query failed " + err.Error())
|
||||||
@@ -26,16 +26,16 @@ func TestHandlerReturnsError(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHandlerReturn(t *testing.T) {
|
func TestQueryHandlerReturn(t *testing.T) {
|
||||||
bus := New()
|
bus := New()
|
||||||
|
|
||||||
bus.AddQueryHandler(func(q *TestQuery) error {
|
bus.AddHandler(func(q *TestQuery) error {
|
||||||
q.Resp = "hello from handler"
|
q.Resp = "hello from handler"
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
query := &TestQuery{}
|
query := &TestQuery{}
|
||||||
err := bus.SendQuery(query)
|
err := bus.Dispatch(query)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal("Send query failed " + err.Error())
|
t.Fatal("Send query failed " + err.Error())
|
||||||
|
|||||||
@@ -1,34 +1,35 @@
|
|||||||
package renderer
|
package renderer
|
||||||
|
|
||||||
import (
|
//
|
||||||
"io/ioutil"
|
// import (
|
||||||
"os"
|
// "io/ioutil"
|
||||||
"testing"
|
// "os"
|
||||||
|
// "testing"
|
||||||
. "github.com/smartystreets/goconvey/convey"
|
//
|
||||||
)
|
// . "github.com/smartystreets/goconvey/convey"
|
||||||
|
// )
|
||||||
func TestPhantomRender(t *testing.T) {
|
//
|
||||||
|
// func TestPhantomRender(t *testing.T) {
|
||||||
Convey("Can render url", t, func() {
|
//
|
||||||
tempDir, _ := ioutil.TempDir("", "img")
|
// Convey("Can render url", t, func() {
|
||||||
png, err := RenderToPng("http://www.google.com")
|
// tempDir, _ := ioutil.TempDir("", "img")
|
||||||
So(err, ShouldBeNil)
|
// ipng, err := RenderToPng("http://www.google.com")
|
||||||
So(exists(png), ShouldEqual, true)
|
// So(err, ShouldBeNil)
|
||||||
|
// So(exists(png), ShouldEqual, true)
|
||||||
//_, err = os.Stat(store.getFilePathForDashboard("hello"))
|
//
|
||||||
//So(err, ShouldBeNil)
|
// //_, err = os.Stat(store.getFilePathForDashboard("hello"))
|
||||||
})
|
// //So(err, ShouldBeNil)
|
||||||
|
// })
|
||||||
}
|
//
|
||||||
|
// }
|
||||||
func exists(path string) bool {
|
//
|
||||||
_, err := os.Stat(path)
|
// func exists(path string) bool {
|
||||||
if err == nil {
|
// _, err := os.Stat(path)
|
||||||
return true
|
// if err == nil {
|
||||||
}
|
// return true
|
||||||
if os.IsNotExist(err) {
|
// }
|
||||||
return false
|
// if os.IsNotExist(err) {
|
||||||
}
|
// return false
|
||||||
return false
|
// }
|
||||||
}
|
// return false
|
||||||
|
// }
|
||||||
|
|||||||
@@ -33,3 +33,13 @@ type GetDataSourcesQuery struct {
|
|||||||
AccountId int64
|
AccountId int64
|
||||||
Resp []*DataSource
|
Resp []*DataSource
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type AddDataSourceCommand struct {
|
||||||
|
AccountId int64
|
||||||
|
Name string
|
||||||
|
Type DsType
|
||||||
|
Access DsAccess
|
||||||
|
Url string
|
||||||
|
Password string
|
||||||
|
User string
|
||||||
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"path"
|
"path"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/torkelo/grafana-pro/pkg/models"
|
m "github.com/torkelo/grafana-pro/pkg/models"
|
||||||
"github.com/torkelo/grafana-pro/pkg/setting"
|
"github.com/torkelo/grafana-pro/pkg/setting"
|
||||||
|
|
||||||
"github.com/go-xorm/xorm"
|
"github.com/go-xorm/xorm"
|
||||||
@@ -27,18 +27,19 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func Init() {
|
func Init() {
|
||||||
tables = append(tables, new(models.Account), new(models.Dashboard), new(models.Collaborator))
|
tables = append(tables, new(m.Account), new(m.Dashboard),
|
||||||
|
new(m.Collaborator), new(m.DataSource))
|
||||||
|
|
||||||
models.SaveAccount = SaveAccount
|
m.SaveAccount = SaveAccount
|
||||||
models.GetAccount = GetAccount
|
m.GetAccount = GetAccount
|
||||||
models.GetAccountByLogin = GetAccountByLogin
|
m.GetAccountByLogin = GetAccountByLogin
|
||||||
models.GetOtherAccountsFor = GetOtherAccountsFor
|
m.GetOtherAccountsFor = GetOtherAccountsFor
|
||||||
models.GetDashboard = GetDashboard
|
m.GetDashboard = GetDashboard
|
||||||
models.SaveDashboard = SaveDashboard
|
m.SaveDashboard = SaveDashboard
|
||||||
models.SearchQuery = SearchQuery
|
m.SearchQuery = SearchQuery
|
||||||
models.DeleteDashboard = DeleteDashboard
|
m.DeleteDashboard = DeleteDashboard
|
||||||
models.GetCollaboratorsForAccount = GetCollaboratorsForAccount
|
m.GetCollaboratorsForAccount = GetCollaboratorsForAccount
|
||||||
models.AddCollaborator = AddCollaborator
|
m.AddCollaborator = AddCollaborator
|
||||||
}
|
}
|
||||||
|
|
||||||
func LoadModelsConfig() {
|
func LoadModelsConfig() {
|
||||||
|
|||||||
@@ -7,9 +7,14 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
bus.AddQueryHandler("sql", GetDataSourcesQuery)
|
bus.AddHandler("sql", GetDataSourcesQuery)
|
||||||
|
bus.AddHandler("sql", AddDataSource)
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetDataSourcesQuery(query *m.GetDataSourcesQuery) error {
|
func GetDataSourcesQuery(query *m.GetDataSourcesQuery) error {
|
||||||
return errors.New("Hello from query handler")
|
return errors.New("Hello from query handler")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func AddDataSource(cmd *m.AddDataSourceCommand) error {
|
||||||
|
return errors.New("Hello from command handler")
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user