mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
This commit fixes the following golint warnings: pkg/bus/bus.go:64:9: if block ends with a return statement, so drop this else and outdent its block pkg/bus/bus.go:84:9: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:137:10: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:177:9: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:183:10: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:199:9: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:208:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) pkg/components/dynmap/dynmap.go:236:9: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:242:10: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:257:9: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:263:10: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:278:9: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:284:10: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:299:9: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:331:9: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:350:9: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:356:10: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:366:12: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:390:9: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:396:10: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:405:12: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:427:9: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:433:10: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:442:12: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:459:9: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:465:10: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:474:12: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:491:9: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:497:10: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:506:12: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:523:9: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:529:10: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:538:12: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:555:9: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:561:10: if block ends with a return statement, so drop this else and outdent its block pkg/components/dynmap/dynmap.go:570:12: if block ends with a return statement, so drop this else and outdent its block pkg/login/ldap.go:55:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) pkg/login/ldap_test.go:372:10: if block ends with a return statement, so drop this else and outdent its block pkg/middleware/middleware_test.go:213:12: if block ends with a return statement, so drop this else and outdent its block pkg/plugins/dashboard_importer.go:153:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) pkg/plugins/dashboards_updater.go:39:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) pkg/plugins/dashboards_updater.go:121:10: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) pkg/plugins/plugins.go:210:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) pkg/plugins/plugins.go:235:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) pkg/services/alerting/eval_context.go:111:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) pkg/services/alerting/notifier.go:92:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) pkg/services/alerting/notifier.go:98:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) pkg/services/alerting/notifier.go:122:10: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) pkg/services/alerting/rule.go:108:10: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) pkg/services/alerting/rule.go:118:10: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) pkg/services/alerting/rule.go:121:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) pkg/services/alerting/notifiers/telegram.go:94:10: if block ends with a return statement, so drop this else and outdent its block pkg/services/sqlstore/annotation.go:34:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) pkg/services/sqlstore/annotation.go:99:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) pkg/services/sqlstore/dashboard_test.go:107:13: if block ends with a return statement, so drop this else and outdent its block pkg/services/sqlstore/plugin_setting.go:78:10: if block ends with a return statement, so drop this else and outdent its block pkg/services/sqlstore/preferences.go:91:10: if block ends with a return statement, so drop this else and outdent its block pkg/services/sqlstore/user.go:50:10: if block ends with a return statement, so drop this else and outdent its block pkg/services/sqlstore/migrator/migrator.go:106:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) pkg/services/sqlstore/migrator/postgres_dialect.go:48:10: if block ends with a return statement, so drop this else and outdent its block pkg/tsdb/time_range.go:59:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) pkg/tsdb/time_range.go:67:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) pkg/tsdb/cloudwatch/metric_find_query.go:225:9: if block ends with a return statement, so drop this else and outdent its block pkg/util/filepath.go:68:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
187 lines
4.3 KiB
Go
187 lines
4.3 KiB
Go
package plugins
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"regexp"
|
|
|
|
"github.com/grafana/grafana/pkg/bus"
|
|
"github.com/grafana/grafana/pkg/components/simplejson"
|
|
m "github.com/grafana/grafana/pkg/models"
|
|
"github.com/grafana/grafana/pkg/services/dashboards"
|
|
)
|
|
|
|
type ImportDashboardCommand struct {
|
|
Dashboard *simplejson.Json
|
|
Path string
|
|
Inputs []ImportDashboardInput
|
|
Overwrite bool
|
|
|
|
OrgId int64
|
|
User *m.SignedInUser
|
|
PluginId string
|
|
Result *PluginDashboardInfoDTO
|
|
}
|
|
|
|
type ImportDashboardInput struct {
|
|
Type string `json:"type"`
|
|
PluginId string `json:"pluginId"`
|
|
Name string `json:"name"`
|
|
Value string `json:"value"`
|
|
}
|
|
|
|
type DashboardInputMissingError struct {
|
|
VariableName string
|
|
}
|
|
|
|
func (e DashboardInputMissingError) Error() string {
|
|
return fmt.Sprintf("Dashboard input variable: %v missing from import command", e.VariableName)
|
|
}
|
|
|
|
func init() {
|
|
bus.AddHandler("plugins", ImportDashboard)
|
|
}
|
|
|
|
func ImportDashboard(cmd *ImportDashboardCommand) error {
|
|
var dashboard *m.Dashboard
|
|
var err error
|
|
|
|
if cmd.PluginId != "" {
|
|
if dashboard, err = loadPluginDashboard(cmd.PluginId, cmd.Path); err != nil {
|
|
return err
|
|
}
|
|
} else {
|
|
dashboard = m.NewDashboardFromJson(cmd.Dashboard)
|
|
}
|
|
|
|
evaluator := &DashTemplateEvaluator{
|
|
template: dashboard.Data,
|
|
inputs: cmd.Inputs,
|
|
}
|
|
|
|
generatedDash, err := evaluator.Eval()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
saveCmd := m.SaveDashboardCommand{
|
|
Dashboard: generatedDash,
|
|
OrgId: cmd.OrgId,
|
|
UserId: cmd.User.UserId,
|
|
Overwrite: cmd.Overwrite,
|
|
PluginId: cmd.PluginId,
|
|
FolderId: dashboard.FolderId,
|
|
}
|
|
|
|
dto := &dashboards.SaveDashboardDTO{
|
|
OrgId: cmd.OrgId,
|
|
Dashboard: saveCmd.GetDashboardModel(),
|
|
Overwrite: saveCmd.Overwrite,
|
|
User: cmd.User,
|
|
}
|
|
|
|
savedDash, err := dashboards.NewService().ImportDashboard(dto)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
cmd.Result = &PluginDashboardInfoDTO{
|
|
PluginId: cmd.PluginId,
|
|
Title: savedDash.Title,
|
|
Path: cmd.Path,
|
|
Revision: savedDash.Data.Get("revision").MustInt64(1),
|
|
ImportedUri: "db/" + savedDash.Slug,
|
|
ImportedUrl: savedDash.GetUrl(),
|
|
ImportedRevision: dashboard.Data.Get("revision").MustInt64(1),
|
|
Imported: true,
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
type DashTemplateEvaluator struct {
|
|
template *simplejson.Json
|
|
inputs []ImportDashboardInput
|
|
variables map[string]string
|
|
result *simplejson.Json
|
|
varRegex *regexp.Regexp
|
|
}
|
|
|
|
func (this *DashTemplateEvaluator) findInput(varName string, varType string) *ImportDashboardInput {
|
|
|
|
for _, input := range this.inputs {
|
|
if varType == input.Type && (input.Name == varName || input.Name == "*") {
|
|
return &input
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (this *DashTemplateEvaluator) Eval() (*simplejson.Json, error) {
|
|
this.result = simplejson.New()
|
|
this.variables = make(map[string]string)
|
|
this.varRegex, _ = regexp.Compile(`(\$\{.+\})`)
|
|
|
|
// check that we have all inputs we need
|
|
for _, inputDef := range this.template.Get("__inputs").MustArray() {
|
|
inputDefJson := simplejson.NewFromAny(inputDef)
|
|
inputName := inputDefJson.Get("name").MustString()
|
|
inputType := inputDefJson.Get("type").MustString()
|
|
input := this.findInput(inputName, inputType)
|
|
|
|
if input == nil {
|
|
return nil, &DashboardInputMissingError{VariableName: inputName}
|
|
}
|
|
|
|
this.variables["${"+inputName+"}"] = input.Value
|
|
}
|
|
|
|
return simplejson.NewFromAny(this.evalObject(this.template)), nil
|
|
}
|
|
|
|
func (this *DashTemplateEvaluator) evalValue(source *simplejson.Json) interface{} {
|
|
|
|
sourceValue := source.Interface()
|
|
|
|
switch v := sourceValue.(type) {
|
|
case string:
|
|
interpolated := this.varRegex.ReplaceAllStringFunc(v, func(match string) string {
|
|
replacement, exists := this.variables[match]
|
|
if exists {
|
|
return replacement
|
|
}
|
|
return match
|
|
})
|
|
return interpolated
|
|
case bool:
|
|
return v
|
|
case json.Number:
|
|
return v
|
|
case map[string]interface{}:
|
|
return this.evalObject(source)
|
|
case []interface{}:
|
|
array := make([]interface{}, 0)
|
|
for _, item := range v {
|
|
array = append(array, this.evalValue(simplejson.NewFromAny(item)))
|
|
}
|
|
return array
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (this *DashTemplateEvaluator) evalObject(source *simplejson.Json) interface{} {
|
|
result := make(map[string]interface{})
|
|
|
|
for key, value := range source.MustMap() {
|
|
if key == "__inputs" {
|
|
continue
|
|
}
|
|
result[key] = this.evalValue(simplejson.NewFromAny(value))
|
|
}
|
|
|
|
return result
|
|
}
|