Commit 27f07e9d by Torkel Ödegaard

Progress on data source admin

parent b70a3f09
......@@ -4,6 +4,7 @@ all: build
build:
go build -o bin/grafana .
go test ./pkg/...
lint:
@gofmt -w . && go tool vet pkg/**/*.go && echo "$(GOLINT)"
......
Subproject commit b3b096e204a8ad6eb2aba6b98802589ab3d1fa28
Subproject commit adb1502e728e5a312a6e4dc680edbd1f75219ea1
......@@ -27,7 +27,8 @@ func Register(m *macaron.Macaron) {
// datasources
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
m.Get("/register/*_", Index)
......
......@@ -8,10 +8,26 @@ import (
func GetDataSources(c *middleware.Context) {
query := m.GetDataSourcesQuery{AccountId: c.Account.Id}
err := bus.SendQuery(&query)
err := bus.Dispatch(&query)
if err != nil {
c.JsonApiErr(500, "Failed to query datasources", err)
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"
)
type QueryHandler interface{}
type Query interface{}
type HandlerFunc interface{}
type Msg interface{}
type Bus interface {
SendQuery(query Query) error
AddQueryHandler(handler QueryHandler)
Dispatch(msg Msg) error
AddHandler(handler HandlerFunc)
}
type InProcBus struct {
handlerIndex map[string]QueryHandler
handlers map[string]HandlerFunc
}
// temp stuff, not sure how to handle bus instance, and init yet
......@@ -23,21 +23,20 @@ var globalBus = New()
func New() Bus {
bus := &InProcBus{}
bus.handlerIndex = make(map[string]QueryHandler)
bus.handlers = make(map[string]HandlerFunc)
return bus
}
func (b *InProcBus) SendQuery(query Query) error {
var queryName = reflect.TypeOf(query).Elem().Name()
fmt.Printf("sending query for type: %v\n", queryName)
func (b *InProcBus) Dispatch(msg Msg) error {
var msgName = reflect.TypeOf(msg).Elem().Name()
var handler = b.handlerIndex[queryName]
var handler = b.handlers[msgName]
if handler == nil {
return errors.New("handler not found")
}
var params = make([]reflect.Value, 1)
params[0] = reflect.ValueOf(query)
params[0] = reflect.ValueOf(msg)
ret := reflect.ValueOf(handler).Call(params)
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)
queryTypeName := handlerType.In(0).Elem().Name()
fmt.Printf("QueryType %v\n", queryTypeName)
b.handlerIndex[queryTypeName] = handler
b.handlers[queryTypeName] = handler
}
// Package level functions
func AddQueryHandler(implName string, handler QueryHandler) {
globalBus.AddQueryHandler(handler)
func AddHandler(implName string, handler HandlerFunc) {
globalBus.AddHandler(handler)
}
func SendQuery(query Query) error {
return globalBus.SendQuery(query)
func Dispatch(msg Msg) error {
return globalBus.Dispatch(msg)
}
......@@ -10,14 +10,14 @@ type TestQuery struct {
Resp string
}
func TestHandlerReturnsError(t *testing.T) {
func TestQueryHandlerReturnsError(t *testing.T) {
bus := New()
bus.AddQueryHandler(func(query *TestQuery) error {
bus.AddHandler(func(query *TestQuery) error {
return errors.New("handler error")
})
err := bus.SendQuery(&TestQuery{})
err := bus.Dispatch(&TestQuery{})
if err == nil {
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.AddQueryHandler(func(q *TestQuery) error {
bus.AddHandler(func(q *TestQuery) error {
q.Resp = "hello from handler"
return nil
})
query := &TestQuery{}
err := bus.SendQuery(query)
err := bus.Dispatch(query)
if err != nil {
t.Fatal("Send query failed " + err.Error())
......
package renderer
import (
"io/ioutil"
"os"
"testing"
. "github.com/smartystreets/goconvey/convey"
)
func TestPhantomRender(t *testing.T) {
Convey("Can render url", t, func() {
tempDir, _ := ioutil.TempDir("", "img")
png, err := RenderToPng("http://www.google.com")
So(err, ShouldBeNil)
So(exists(png), ShouldEqual, true)
//_, err = os.Stat(store.getFilePathForDashboard("hello"))
//So(err, ShouldBeNil)
})
}
func exists(path string) bool {
_, err := os.Stat(path)
if err == nil {
return true
}
if os.IsNotExist(err) {
return false
}
return false
}
//
// import (
// "io/ioutil"
// "os"
// "testing"
//
// . "github.com/smartystreets/goconvey/convey"
// )
//
// func TestPhantomRender(t *testing.T) {
//
// Convey("Can render url", t, func() {
// tempDir, _ := ioutil.TempDir("", "img")
// ipng, err := RenderToPng("http://www.google.com")
// So(err, ShouldBeNil)
// So(exists(png), ShouldEqual, true)
//
// //_, err = os.Stat(store.getFilePathForDashboard("hello"))
// //So(err, ShouldBeNil)
// })
//
// }
//
// func exists(path string) bool {
// _, err := os.Stat(path)
// if err == nil {
// return true
// }
// if os.IsNotExist(err) {
// return false
// }
// return false
// }
......@@ -33,3 +33,13 @@ type GetDataSourcesQuery struct {
AccountId int64
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"
"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/go-xorm/xorm"
......@@ -27,18 +27,19 @@ var (
)
func Init() {
tables = append(tables, new(models.Account), new(models.Dashboard), new(models.Collaborator))
models.SaveAccount = SaveAccount
models.GetAccount = GetAccount
models.GetAccountByLogin = GetAccountByLogin
models.GetOtherAccountsFor = GetOtherAccountsFor
models.GetDashboard = GetDashboard
models.SaveDashboard = SaveDashboard
models.SearchQuery = SearchQuery
models.DeleteDashboard = DeleteDashboard
models.GetCollaboratorsForAccount = GetCollaboratorsForAccount
models.AddCollaborator = AddCollaborator
tables = append(tables, new(m.Account), new(m.Dashboard),
new(m.Collaborator), new(m.DataSource))
m.SaveAccount = SaveAccount
m.GetAccount = GetAccount
m.GetAccountByLogin = GetAccountByLogin
m.GetOtherAccountsFor = GetOtherAccountsFor
m.GetDashboard = GetDashboard
m.SaveDashboard = SaveDashboard
m.SearchQuery = SearchQuery
m.DeleteDashboard = DeleteDashboard
m.GetCollaboratorsForAccount = GetCollaboratorsForAccount
m.AddCollaborator = AddCollaborator
}
func LoadModelsConfig() {
......
......@@ -7,9 +7,14 @@ import (
)
func init() {
bus.AddQueryHandler("sql", GetDataSourcesQuery)
bus.AddHandler("sql", GetDataSourcesQuery)
bus.AddHandler("sql", AddDataSource)
}
func GetDataSourcesQuery(query *m.GetDataSourcesQuery) error {
return errors.New("Hello from query handler")
}
func AddDataSource(cmd *m.AddDataSourceCommand) error {
return errors.New("Hello from command handler")
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment