Commit a183ea97 by bergquist

moves datasource plugin model to grafana/grafana_plugin_model

parent af9d1cc5
package tsdb
import (
"context"
proto "github.com/grafana/grafana/pkg/tsdb/models"
)
type GRPCClient struct {
proto.TsdbPluginClient
}
func (m *GRPCClient) Query(ctx context.Context, req *proto.TsdbQuery) (*proto.Response, error) {
return m.TsdbPluginClient.Query(ctx, req)
}
type GRPCServer struct {
TsdbPlugin
}
func (m *GRPCServer) Query(ctx context.Context, req *proto.TsdbQuery) (*proto.Response, error) {
return m.TsdbPlugin.Query(ctx, req)
}
package tsdb
import (
"context"
proto "github.com/grafana/grafana/pkg/tsdb/models"
plugin "github.com/hashicorp/go-plugin"
"google.golang.org/grpc"
)
type TsdbPlugin interface {
Query(ctx context.Context, req *proto.TsdbQuery) (*proto.Response, error)
}
type TsdbPluginImpl struct {
plugin.NetRPCUnsupportedPlugin
Plugin TsdbPlugin
}
func (p *TsdbPluginImpl) GRPCServer(s *grpc.Server) error {
proto.RegisterTsdbPluginServer(s, &GRPCServer{p.Plugin})
return nil
}
func (p *TsdbPluginImpl) GRPCClient(c *grpc.ClientConn) (interface{}, error) {
return &GRPCClient{proto.NewTsdbPluginClient(c)}, nil
}
package tsdb package wrapper
import ( import (
"context" "context"
...@@ -8,16 +8,15 @@ import ( ...@@ -8,16 +8,15 @@ import (
"github.com/grafana/grafana/pkg/log" "github.com/grafana/grafana/pkg/log"
"github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/tsdb" "github.com/grafana/grafana/pkg/tsdb"
proto "github.com/grafana/grafana/pkg/tsdb/models" "github.com/grafana/grafana_plugin_model/go/datasource"
) )
func NewDatasourcePluginWrapper(log log.Logger, plugin TsdbPlugin) *DatasourcePluginWrapper { func NewDatasourcePluginWrapper(log log.Logger, plugin datasource.DatasourcePlugin) *DatasourcePluginWrapper {
return &DatasourcePluginWrapper{TsdbPlugin: plugin, logger: log} return &DatasourcePluginWrapper{DatasourcePlugin: plugin, logger: log}
} }
type DatasourcePluginWrapper struct { type DatasourcePluginWrapper struct {
TsdbPlugin datasource.DatasourcePlugin
logger log.Logger logger log.Logger
} }
...@@ -27,8 +26,8 @@ func (tw *DatasourcePluginWrapper) Query(ctx context.Context, ds *models.DataSou ...@@ -27,8 +26,8 @@ func (tw *DatasourcePluginWrapper) Query(ctx context.Context, ds *models.DataSou
return nil, err return nil, err
} }
pbQuery := &proto.TsdbQuery{ pbQuery := &datasource.DatasourceRequest{
Datasource: &proto.DatasourceInfo{ Datasource: &datasource.DatasourceInfo{
JsonData: string(jsonData), JsonData: string(jsonData),
Name: ds.Name, Name: ds.Name,
Type: ds.Type, Type: ds.Type,
...@@ -36,19 +35,19 @@ func (tw *DatasourcePluginWrapper) Query(ctx context.Context, ds *models.DataSou ...@@ -36,19 +35,19 @@ func (tw *DatasourcePluginWrapper) Query(ctx context.Context, ds *models.DataSou
Id: ds.Id, Id: ds.Id,
OrgId: ds.OrgId, OrgId: ds.OrgId,
}, },
TimeRange: &proto.TimeRange{ TimeRange: &datasource.TimeRange{
FromRaw: query.TimeRange.From, FromRaw: query.TimeRange.From,
ToRaw: query.TimeRange.To, ToRaw: query.TimeRange.To,
ToEpochMs: query.TimeRange.GetToAsMsEpoch(), ToEpochMs: query.TimeRange.GetToAsMsEpoch(),
FromEpochMs: query.TimeRange.GetFromAsMsEpoch(), FromEpochMs: query.TimeRange.GetFromAsMsEpoch(),
}, },
Queries: []*proto.Query{}, Queries: []*datasource.Query{},
} }
for _, q := range query.Queries { for _, q := range query.Queries {
modelJson, _ := q.Model.MarshalJSON() modelJson, _ := q.Model.MarshalJSON()
pbQuery.Queries = append(pbQuery.Queries, &proto.Query{ pbQuery.Queries = append(pbQuery.Queries, &datasource.Query{
ModelJson: string(modelJson), ModelJson: string(modelJson),
IntervalMs: q.IntervalMs, IntervalMs: q.IntervalMs,
RefId: q.RefId, RefId: q.RefId,
...@@ -56,7 +55,7 @@ func (tw *DatasourcePluginWrapper) Query(ctx context.Context, ds *models.DataSou ...@@ -56,7 +55,7 @@ func (tw *DatasourcePluginWrapper) Query(ctx context.Context, ds *models.DataSou
}) })
} }
pbres, err := tw.TsdbPlugin.Query(ctx, pbQuery) pbres, err := tw.DatasourcePlugin.Query(ctx, pbQuery)
if err != nil { if err != nil {
return nil, err return nil, err
...@@ -96,7 +95,7 @@ func (tw *DatasourcePluginWrapper) Query(ctx context.Context, ds *models.DataSou ...@@ -96,7 +95,7 @@ func (tw *DatasourcePluginWrapper) Query(ctx context.Context, ds *models.DataSou
return res, nil return res, nil
} }
func (tw *DatasourcePluginWrapper) mapTables(r *proto.QueryResult) ([]*tsdb.Table, error) { func (tw *DatasourcePluginWrapper) mapTables(r *datasource.QueryResult) ([]*tsdb.Table, error) {
var tables []*tsdb.Table var tables []*tsdb.Table
for _, t := range r.GetTables() { for _, t := range r.GetTables() {
mappedTable, err := tw.mapTable(t) mappedTable, err := tw.mapTable(t)
...@@ -108,7 +107,7 @@ func (tw *DatasourcePluginWrapper) mapTables(r *proto.QueryResult) ([]*tsdb.Tabl ...@@ -108,7 +107,7 @@ func (tw *DatasourcePluginWrapper) mapTables(r *proto.QueryResult) ([]*tsdb.Tabl
return tables, nil return tables, nil
} }
func (tw *DatasourcePluginWrapper) mapTable(t *proto.Table) (*tsdb.Table, error) { func (tw *DatasourcePluginWrapper) mapTable(t *datasource.Table) (*tsdb.Table, error) {
table := &tsdb.Table{} table := &tsdb.Table{}
for _, c := range t.GetColumns() { for _, c := range t.GetColumns() {
table.Columns = append(table.Columns, tsdb.TableColumn{ table.Columns = append(table.Columns, tsdb.TableColumn{
...@@ -131,19 +130,19 @@ func (tw *DatasourcePluginWrapper) mapTable(t *proto.Table) (*tsdb.Table, error) ...@@ -131,19 +130,19 @@ func (tw *DatasourcePluginWrapper) mapTable(t *proto.Table) (*tsdb.Table, error)
return table, nil return table, nil
} }
func (tw *DatasourcePluginWrapper) mapRowValue(rv *proto.RowValue) (interface{}, error) { func (tw *DatasourcePluginWrapper) mapRowValue(rv *datasource.RowValue) (interface{}, error) {
switch rv.Kind { switch rv.Kind {
case proto.RowValue_TYPE_NULL: case datasource.RowValue_TYPE_NULL:
return nil, nil return nil, nil
case proto.RowValue_TYPE_INT64: case datasource.RowValue_TYPE_INT64:
return rv.Int64Value, nil return rv.Int64Value, nil
case proto.RowValue_TYPE_BOOL: case datasource.RowValue_TYPE_BOOL:
return rv.BoolValue, nil return rv.BoolValue, nil
case proto.RowValue_TYPE_STRING: case datasource.RowValue_TYPE_STRING:
return rv.StringValue, nil return rv.StringValue, nil
case proto.RowValue_TYPE_DOUBLE: case datasource.RowValue_TYPE_DOUBLE:
return rv.DoubleValue, nil return rv.DoubleValue, nil
case proto.RowValue_TYPE_BYTES: case datasource.RowValue_TYPE_BYTES:
return rv.BytesValue, nil return rv.BytesValue, nil
default: default:
return nil, fmt.Errorf("Unsupported row value %v from plugin", rv.Kind) return nil, fmt.Errorf("Unsupported row value %v from plugin", rv.Kind)
......
package tsdb package wrapper
import ( import (
"testing"
"github.com/grafana/grafana/pkg/log" "github.com/grafana/grafana/pkg/log"
"github.com/grafana/grafana/pkg/tsdb" "github.com/grafana/grafana/pkg/tsdb"
"github.com/grafana/grafana/pkg/tsdb/models" "github.com/grafana/grafana_plugin_model/go/datasource"
"testing"
) )
func TestMapTables(t *testing.T) { func TestMapTables(t *testing.T) {
dpw := NewDatasourcePluginWrapper(log.New("test-logger"), nil) dpw := NewDatasourcePluginWrapper(log.New("test-logger"), nil)
var qr = &proto.QueryResult{} var qr = &datasource.QueryResult{}
qr.Tables = append(qr.Tables, &proto.Table{ qr.Tables = append(qr.Tables, &datasource.Table{
Columns: []*proto.TableColumn{}, Columns: []*datasource.TableColumn{},
Rows: nil, Rows: nil,
}) })
want := []*tsdb.Table{{}} want := []*tsdb.Table{{}}
...@@ -28,16 +29,16 @@ func TestMapTables(t *testing.T) { ...@@ -28,16 +29,16 @@ func TestMapTables(t *testing.T) {
func TestMapTable(t *testing.T) { func TestMapTable(t *testing.T) {
dpw := NewDatasourcePluginWrapper(log.New("test-logger"), nil) dpw := NewDatasourcePluginWrapper(log.New("test-logger"), nil)
source := &proto.Table{ source := &datasource.Table{
Columns: []*proto.TableColumn{{Name: "column1"}, {Name: "column2"}}, Columns: []*datasource.TableColumn{{Name: "column1"}, {Name: "column2"}},
Rows: []*proto.TableRow{{ Rows: []*datasource.TableRow{{
Values: []*proto.RowValue{ Values: []*datasource.RowValue{
{ {
Kind: proto.RowValue_TYPE_BOOL, Kind: datasource.RowValue_TYPE_BOOL,
BoolValue: true, BoolValue: true,
}, },
{ {
Kind: proto.RowValue_TYPE_INT64, Kind: datasource.RowValue_TYPE_INT64,
Int64Value: 42, Int64Value: 42,
}, },
}, },
...@@ -71,37 +72,37 @@ func TestMapTable(t *testing.T) { ...@@ -71,37 +72,37 @@ func TestMapTable(t *testing.T) {
func TestMappingRowValue(t *testing.T) { func TestMappingRowValue(t *testing.T) {
dpw := NewDatasourcePluginWrapper(log.New("test-logger"), nil) dpw := NewDatasourcePluginWrapper(log.New("test-logger"), nil)
boolRowValue, _ := dpw.mapRowValue(&proto.RowValue{Kind: proto.RowValue_TYPE_BOOL, BoolValue: true}) boolRowValue, _ := dpw.mapRowValue(&datasource.RowValue{Kind: datasource.RowValue_TYPE_BOOL, BoolValue: true})
haveBool, ok := boolRowValue.(bool) haveBool, ok := boolRowValue.(bool)
if !ok || haveBool != true { if !ok || haveBool != true {
t.Fatalf("Expected true, was %s", haveBool) t.Fatalf("Expected true, was %s", haveBool)
} }
intRowValue, _ := dpw.mapRowValue(&proto.RowValue{Kind: proto.RowValue_TYPE_INT64, Int64Value: 42}) intRowValue, _ := dpw.mapRowValue(&datasource.RowValue{Kind: datasource.RowValue_TYPE_INT64, Int64Value: 42})
haveInt, ok := intRowValue.(int64) haveInt, ok := intRowValue.(int64)
if !ok || haveInt != 42 { if !ok || haveInt != 42 {
t.Fatalf("Expected %d, was %d", 42, haveInt) t.Fatalf("Expected %d, was %d", 42, haveInt)
} }
stringRowValue, _ := dpw.mapRowValue(&proto.RowValue{Kind: proto.RowValue_TYPE_STRING, StringValue: "grafana"}) stringRowValue, _ := dpw.mapRowValue(&datasource.RowValue{Kind: datasource.RowValue_TYPE_STRING, StringValue: "grafana"})
haveString, ok := stringRowValue.(string) haveString, ok := stringRowValue.(string)
if !ok || haveString != "grafana" { if !ok || haveString != "grafana" {
t.Fatalf("Expected %s, was %s", "grafana", haveString) t.Fatalf("Expected %s, was %s", "grafana", haveString)
} }
doubleRowValue, _ := dpw.mapRowValue(&proto.RowValue{Kind: proto.RowValue_TYPE_DOUBLE, DoubleValue: 1.5}) doubleRowValue, _ := dpw.mapRowValue(&datasource.RowValue{Kind: datasource.RowValue_TYPE_DOUBLE, DoubleValue: 1.5})
haveDouble, ok := doubleRowValue.(float64) haveDouble, ok := doubleRowValue.(float64)
if !ok || haveDouble != 1.5 { if !ok || haveDouble != 1.5 {
t.Fatalf("Expected %v, was %v", 1.5, haveDouble) t.Fatalf("Expected %v, was %v", 1.5, haveDouble)
} }
bytesRowValue, _ := dpw.mapRowValue(&proto.RowValue{Kind: proto.RowValue_TYPE_BYTES, BytesValue: []byte{66}}) bytesRowValue, _ := dpw.mapRowValue(&datasource.RowValue{Kind: datasource.RowValue_TYPE_BYTES, BytesValue: []byte{66}})
haveBytes, ok := bytesRowValue.([]byte) haveBytes, ok := bytesRowValue.([]byte)
if !ok || len(haveBytes) != 1 || haveBytes[0] != 66 { if !ok || len(haveBytes) != 1 || haveBytes[0] != 66 {
t.Fatalf("Expected %v, was %v", []byte{66}, haveBytes) t.Fatalf("Expected %v, was %v", []byte{66}, haveBytes)
} }
haveNil, _ := dpw.mapRowValue(&proto.RowValue{Kind: proto.RowValue_TYPE_NULL}) haveNil, _ := dpw.mapRowValue(&datasource.RowValue{Kind: datasource.RowValue_TYPE_NULL})
if haveNil != nil { if haveNil != nil {
t.Fatalf("Expected %v, was %v", nil, haveNil) t.Fatalf("Expected %v, was %v", nil, haveNil)
} }
......
...@@ -14,8 +14,9 @@ import ( ...@@ -14,8 +14,9 @@ import (
"github.com/grafana/grafana/pkg/log" "github.com/grafana/grafana/pkg/log"
"github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/models"
shared "github.com/grafana/grafana/pkg/plugins/datasource/tsdb" "github.com/grafana/grafana/pkg/plugins/datasource/wrapper"
"github.com/grafana/grafana/pkg/tsdb" "github.com/grafana/grafana/pkg/tsdb"
"github.com/grafana/grafana_plugin_model/go/datasource"
plugin "github.com/hashicorp/go-plugin" plugin "github.com/hashicorp/go-plugin"
) )
...@@ -92,7 +93,7 @@ func (p *DataSourcePlugin) spawnSubProcess() error { ...@@ -92,7 +93,7 @@ func (p *DataSourcePlugin) spawnSubProcess() error {
p.client = plugin.NewClient(&plugin.ClientConfig{ p.client = plugin.NewClient(&plugin.ClientConfig{
HandshakeConfig: handshakeConfig, HandshakeConfig: handshakeConfig,
Plugins: map[string]plugin.Plugin{p.Id: &shared.TsdbPluginImpl{}}, Plugins: map[string]plugin.Plugin{p.Id: &datasource.DatasourcePluginImpl{}},
Cmd: exec.Command(fullpath), Cmd: exec.Command(fullpath),
AllowedProtocols: []plugin.Protocol{plugin.ProtocolGRPC}, AllowedProtocols: []plugin.Protocol{plugin.ProtocolGRPC},
Logger: LogWrapper{Logger: p.log}, Logger: LogWrapper{Logger: p.log},
...@@ -108,10 +109,10 @@ func (p *DataSourcePlugin) spawnSubProcess() error { ...@@ -108,10 +109,10 @@ func (p *DataSourcePlugin) spawnSubProcess() error {
return err return err
} }
plugin := raw.(shared.TsdbPlugin) plugin := raw.(datasource.DatasourcePlugin)
tsdb.RegisterTsdbQueryEndpoint(p.Id, func(dsInfo *models.DataSource) (tsdb.TsdbQueryEndpoint, error) { tsdb.RegisterTsdbQueryEndpoint(p.Id, func(dsInfo *models.DataSource) (tsdb.TsdbQueryEndpoint, error) {
return shared.NewDatasourcePluginWrapper(p.log, plugin), nil return wrapper.NewDatasourcePluginWrapper(p.log, plugin), nil
}) })
return nil return nil
......
syntax = "proto3";
option go_package = "proto";
package plugins;
message TsdbQuery {
TimeRange timeRange = 1;
DatasourceInfo datasource = 2;
repeated Query queries = 3;
}
message Query {
string refId = 1;
int64 maxDataPoints = 2;
int64 intervalMs = 3;
string modelJson = 4;
}
message TimeRange {
string fromRaw = 1;
string toRaw = 2;
int64 fromEpochMs = 3;
int64 toEpochMs = 4;
}
message Response {
repeated QueryResult results = 1;
}
message QueryResult {
string error = 1;
string refId = 2;
string metaJson = 3;
repeated TimeSeries series = 4;
repeated Table tables = 5;
}
message Table {
repeated TableColumn columns = 1;
repeated TableRow rows = 2;
}
message TableColumn {
string name = 1;
}
message TableRow {
repeated RowValue values = 1;
}
message RowValue {
enum Kind {
// Field type null.
TYPE_NULL = 0;
// Field type double.
TYPE_DOUBLE = 1;
// Field type int64.
TYPE_INT64 = 2;
// Field type bool.
TYPE_BOOL = 3;
// Field type string.
TYPE_STRING = 4;
// Field type bytes.
TYPE_BYTES = 5;
};
Kind kind = 1;
double doubleValue = 2;
int64 int64Value = 3;
bool boolValue = 4;
string stringValue = 5;
bytes bytesValue = 6;
}
message DatasourceInfo {
int64 id = 1;
int64 orgId = 2;
string name = 3;
string type = 4;
string url = 5;
string jsonData = 6;
string secureJsonData = 7;
}
message TimeSeries {
string name = 1;
map<string, string> tags = 2;
repeated Point points = 3;
}
message Point {
int64 timestamp = 1;
double value = 2;
}
service TsdbPlugin {
rpc Query(TsdbQuery) returns (Response);
}
package datasource
import (
"context"
plugin "github.com/hashicorp/go-plugin"
"google.golang.org/grpc"
)
type DatasourcePlugin interface {
Query(ctx context.Context, req *DatasourceRequest) (*DatasourceResponse, error)
}
type DatasourcePluginImpl struct {
plugin.NetRPCUnsupportedPlugin
Plugin DatasourcePlugin
}
func (p *DatasourcePluginImpl) GRPCServer(s *grpc.Server) error {
RegisterDatasourcePluginServer(s, &GRPCServer{p.Plugin})
return nil
}
func (p *DatasourcePluginImpl) GRPCClient(c *grpc.ClientConn) (interface{}, error) {
return &GRPCClient{NewDatasourcePluginClient(c)}, nil
}
type GRPCClient struct {
DatasourcePluginClient
}
func (m *GRPCClient) Query(ctx context.Context, req *DatasourceRequest) (*DatasourceResponse, error) {
return m.DatasourcePluginClient.Query(ctx, req)
}
type GRPCServer struct {
DatasourcePlugin
}
func (m *GRPCServer) Query(ctx context.Context, req *DatasourceRequest) (*DatasourceResponse, error) {
return m.DatasourcePlugin.Query(ctx, req)
}
...@@ -435,10 +435,6 @@ ...@@ -435,10 +435,6 @@
"revisionTime": "2017-03-17T12:25:07Z" "revisionTime": "2017-03-17T12:25:07Z"
}, },
{ {
"path": "github.com/go-xorm/xor,m",
"revision": ""
},
{
"checksumSHA1": "xkwhf97yNV6tFwrOHCPeWtKW39E=", "checksumSHA1": "xkwhf97yNV6tFwrOHCPeWtKW39E=",
"path": "github.com/go-xorm/xorm", "path": "github.com/go-xorm/xorm",
"revision": "6687a2b4e824f4d87f2d65060ec5cb0d896dff1e", "revision": "6687a2b4e824f4d87f2d65060ec5cb0d896dff1e",
...@@ -487,6 +483,12 @@ ...@@ -487,6 +483,12 @@
"revisionTime": "2016-12-15T22:53:35Z" "revisionTime": "2016-12-15T22:53:35Z"
}, },
{ {
"checksumSHA1": "EtBErX/rtSQmC2z8fgl6WFBCt+E=",
"path": "github.com/grafana/grafana_plugin_model/go/datasource",
"revision": "50b475deb168a09c6b9be2658a230add915e913b",
"revisionTime": "2018-01-17T10:10:56Z"
},
{
"checksumSHA1": "0OUXdKhaE6TzpHevY0VFlAA5YJ8=", "checksumSHA1": "0OUXdKhaE6TzpHevY0VFlAA5YJ8=",
"path": "github.com/hashicorp/go-hclog", "path": "github.com/hashicorp/go-hclog",
"revision": "8105cc0a3736cc153a2025f5d0d91b80045fc9ff", "revision": "8105cc0a3736cc153a2025f5d0d91b80045fc9ff",
......
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