mirror of https://github.com/grafana/grafana
parent
011fdf7ab6
commit
5bd5713a52
@ -0,0 +1,81 @@ |
||||
package plugins |
||||
|
||||
import ( |
||||
"encoding/json" |
||||
"errors" |
||||
"os" |
||||
"path/filepath" |
||||
|
||||
"github.com/grafana/grafana/pkg/log" |
||||
) |
||||
|
||||
type PluginMeta struct { |
||||
Type string `json:"type"` |
||||
Name string `json:"name"` |
||||
} |
||||
|
||||
var ( |
||||
List []*PluginMeta |
||||
) |
||||
|
||||
type PluginScanner struct { |
||||
pluginPath string |
||||
errors []error |
||||
} |
||||
|
||||
func Scan(pluginDir string) error { |
||||
List = make([]*PluginMeta, 0) |
||||
|
||||
scanner := &PluginScanner{ |
||||
pluginPath: pluginDir, |
||||
} |
||||
|
||||
if err := filepath.Walk(pluginDir, scanner.walker); err != nil { |
||||
return err |
||||
} |
||||
|
||||
if len(scanner.errors) > 0 { |
||||
return errors.New("Some plugins failed to load") |
||||
} |
||||
|
||||
return nil |
||||
} |
||||
|
||||
func (scanner *PluginScanner) walker(path string, f os.FileInfo, err error) error { |
||||
if err != nil { |
||||
return err |
||||
} |
||||
|
||||
if f.IsDir() { |
||||
return nil |
||||
} |
||||
|
||||
if f.Name() == "plugin.json" { |
||||
pluginMeta, err := loadPluginMeta(path) |
||||
if err != nil { |
||||
log.Error(3, "Failed to load plugin json file: %v, err: %v", path, err) |
||||
scanner.errors = append(scanner.errors, err) |
||||
} else { |
||||
List = append(List, pluginMeta) |
||||
} |
||||
} |
||||
return nil |
||||
} |
||||
|
||||
func loadPluginMeta(path string) (*PluginMeta, error) { |
||||
reader, err := os.Open(path) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
defer reader.Close() |
||||
|
||||
jsonParser := json.NewDecoder(reader) |
||||
|
||||
pluginMeta := &PluginMeta{} |
||||
if err := jsonParser.Decode(pluginMeta); err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return pluginMeta, nil |
||||
} |
||||
@ -0,0 +1,19 @@ |
||||
package plugins |
||||
|
||||
import ( |
||||
"path/filepath" |
||||
"testing" |
||||
|
||||
. "github.com/smartystreets/goconvey/convey" |
||||
) |
||||
|
||||
func TestPluginScans(t *testing.T) { |
||||
|
||||
Convey("When scaning for plugins", t, func() { |
||||
path, _ := filepath.Abs("../../src/app/plugins") |
||||
err := Scan(path) |
||||
|
||||
So(err, ShouldBeNil) |
||||
So(len(List), ShouldEqual, 1) |
||||
}) |
||||
} |
||||
@ -0,0 +1,20 @@ |
||||
define([ |
||||
'angular', |
||||
], |
||||
function (angular) { |
||||
'use strict'; |
||||
|
||||
var module = angular.module('grafana.services'); |
||||
|
||||
module.factory('MyDataSource', function() { |
||||
|
||||
function MyDataSource(datasource) { |
||||
this.type = 'my_ds'; |
||||
this.datasource = datasource; |
||||
} |
||||
|
||||
return MyDataSource; |
||||
|
||||
}); |
||||
|
||||
}); |
||||
@ -0,0 +1,7 @@ |
||||
{ |
||||
"type": "datasource", |
||||
"name": "My Data source", |
||||
"keyName": "graphite" |
||||
"serviceName": "MyDataSource", |
||||
"editPartial": "./partials/edit.html", |
||||
} |
||||
Loading…
Reference in new issue