Commit 7a8b3c41 by Torkel Ödegaard

feat(apps): lots of progress

parent 60e7c6d1
......@@ -22,6 +22,7 @@ func GetAppPlugins(c *middleware.Context) Response {
Enabled: app.Enabled,
Pinned: app.Pinned,
Module: app.Module,
Info: app.Info,
}
}
......
package dtos
import "github.com/grafana/grafana/pkg/plugins"
type AppPlugin struct {
Name string `json:"name"`
Type string `json:"type"`
Enabled bool `json:"enabled"`
Pinned bool `json:"pinned"`
Module string `json:"module"`
Info *plugins.PluginInfo `json:"info"`
JsonData map[string]interface{} `json:"jsonData"`
}
......@@ -5,13 +5,13 @@ import (
)
type PluginInfo struct {
Author PluginAuthor `json:"author"`
Author PluginInfoLink `json:"author"`
Description string `json:"description"`
Homepage string `json:"homepage"`
Links []PluginInfoLink `json:"links"`
Logos PluginLogos `json:"logos"`
}
type PluginAuthor struct {
type PluginInfoLink struct {
Name string `json:"name"`
Url string `json:"url"`
}
......
package plugins
import (
"bytes"
"encoding/json"
"errors"
"io"
"os"
"path"
"path/filepath"
"strings"
"text/template"
"github.com/grafana/grafana/pkg/log"
"github.com/grafana/grafana/pkg/models"
......@@ -118,6 +121,28 @@ func addPublicContent(public *PublicContent, currentDir string) {
}
}
func interpolatePluginJson(reader io.Reader) (io.Reader, error) {
buf := new(bytes.Buffer)
buf.ReadFrom(reader)
jsonStr := buf.String() //
tmpl, err := template.New("json").Parse(jsonStr)
if err != nil {
return nil, err
}
data := map[string]interface{}{
"PluginPublicRoot": "HAHAHA",
}
var resultBuffer bytes.Buffer
if err := tmpl.ExecuteTemplate(&resultBuffer, "json", data); err != nil {
return nil, err
}
return bytes.NewReader(resultBuffer.Bytes()), nil
}
func (scanner *PluginScanner) loadPluginJson(pluginJsonFilePath string) error {
currentDir := filepath.Dir(pluginJsonFilePath)
reader, err := os.Open(pluginJsonFilePath)
......@@ -128,7 +153,6 @@ func (scanner *PluginScanner) loadPluginJson(pluginJsonFilePath string) error {
defer reader.Close()
jsonParser := json.NewDecoder(reader)
pluginJson := make(map[string]interface{})
if err := jsonParser.Decode(&pluginJson); err != nil {
return err
......@@ -139,9 +163,16 @@ func (scanner *PluginScanner) loadPluginJson(pluginJsonFilePath string) error {
return errors.New("Did not find pluginType property in plugin.json")
}
reader.Seek(0, 0)
if newReader, err := interpolatePluginJson(reader); err != nil {
return err
} else {
jsonParser = json.NewDecoder(newReader)
}
if pluginType == "datasource" {
p := DataSourcePlugin{}
reader.Seek(0, 0)
if err := jsonParser.Decode(&p); err != nil {
return err
}
......
......@@ -18,5 +18,18 @@ func TestPluginScans(t *testing.T) {
So(err, ShouldBeNil)
So(len(DataSources), ShouldBeGreaterThan, 1)
So(len(Panels), ShouldBeGreaterThan, 1)
})
Convey("When reading app plugin definition", t, func() {
setting.Cfg = ini.Empty()
sec, _ := setting.Cfg.NewSection("plugin.app-test")
sec.NewKey("path", "../../tests/app-plugin-json")
err := Init()
So(err, ShouldBeNil)
So(len(Apps), ShouldBeGreaterThan, 0)
So(Apps["app-test"].Info.Logos.Large, ShouldEqual, "plugins/app-exampl/img/logo_large.png")
})
}
......@@ -6,8 +6,20 @@
</topnav>
<div class="page-container" style="background: transparent; border: 0;">
<div class="apps-side-box">
<img class="apps-ide-box-logo" src="{{ctrl.appModel.info.logos.large}}">
</img>
<ul class="app-side-box-links">
<li ng-repeat="link in ctrl.appModel.info.links">
<a href="{{link.url}}">{{link.name}}</a>
</li>
</ul>
</div>
<div class="page-wide" ng-init="ctrl.init()">
<h2>{{ctrl.appModel.name}}</h2>
<em>
{{ctrl.appModel.info.description}}
</em>
<form name="editForm">
<div class="tight-form">
......@@ -24,6 +36,5 @@
<app-config-loader></app-config-loader>
</form>
</div>
</div>
{
"pluginType": "app",
"name": "App Example",
"type": "app-test",
"plugins": [],
"css": {
"light": "plugin.dark.css",
"dark": "plugin.light.css"
},
"module": "app",
"pages": [
{"name": "Example1", "url": "/app-example", "reqRole": "Editor"}
],
"public": {
"urlFragment": "app-example",
"path": "./public"
},
"info": {
"description": "Example Grafana App",
"author": {
"name": "Raintank Inc.",
"url": "http://raintank.io"
},
"keywords": ["example"],
"logos": {
"small": "{{.PluginPublicRoot}}/img/logo_small.png",
"large": "{{.PluginPublicRoot}}/logo_large.png"
},
"links": [
{"name": "Project site", "url": "http://project.com"},
{"name": "License & Terms", "url": "http://license.com"}
],
"version": "1.0.0",
"updated": "2015-02-10"
},
"dependencies": {
"grafanaVersion": "2.6.x",
"plugins": [
{"type": "datasource", "id": "graphite", "name": "Graphite", "version": "1.0.0"},
{"type": "panel", "id": "graph", "name": "Graph", "version": "1.0.0"}
]
}
}
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