Commit 9f2af718 by Artur Kondas Committed by GitHub

Provisioning: Validate that dashboard providers have unique names (#22898)

Co-authored-by: Arve Knudsen <arve.knudsen@gmail.com>
Co-authored-by: Marcus Efraimsson <marcus.efraimsson@gmail.com>
Co-authored-by: bergquist <carl.bergquist@gmail.com>
parent f1559368
...@@ -40,7 +40,7 @@ func (cr *configReader) parseConfigs(file os.FileInfo) ([]*DashboardsAsConfig, e ...@@ -40,7 +40,7 @@ func (cr *configReader) parseConfigs(file os.FileInfo) ([]*DashboardsAsConfig, e
} }
if v1 != nil { if v1 != nil {
return v1.mapToDashboardAsConfig(), nil return v1.mapToDashboardsAsConfig()
} }
} else { } else {
var v0 []*DashboardsAsConfigV0 var v0 []*DashboardsAsConfigV0
...@@ -51,7 +51,7 @@ func (cr *configReader) parseConfigs(file os.FileInfo) ([]*DashboardsAsConfig, e ...@@ -51,7 +51,7 @@ func (cr *configReader) parseConfigs(file os.FileInfo) ([]*DashboardsAsConfig, e
if v0 != nil { if v0 != nil {
cr.log.Warn("[Deprecated] the dashboard provisioning config is outdated. please upgrade", "filename", filename) cr.log.Warn("[Deprecated] the dashboard provisioning config is outdated. please upgrade", "filename", filename)
return mapV0ToDashboardAsConfig(v0), nil return mapV0ToDashboardsAsConfig(v0)
} }
} }
......
package dashboards package dashboards
import ( import (
"github.com/grafana/grafana/pkg/services/provisioning/values" "fmt"
"time" "time"
"github.com/grafana/grafana/pkg/components/simplejson" "github.com/grafana/grafana/pkg/components/simplejson"
"github.com/grafana/grafana/pkg/services/dashboards"
"github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/services/dashboards"
"github.com/grafana/grafana/pkg/services/provisioning/values"
) )
type DashboardsAsConfig struct { type DashboardsAsConfig struct {
...@@ -73,10 +73,16 @@ func createDashboardJson(data *simplejson.Json, lastModified time.Time, cfg *Das ...@@ -73,10 +73,16 @@ func createDashboardJson(data *simplejson.Json, lastModified time.Time, cfg *Das
return dash, nil return dash, nil
} }
func mapV0ToDashboardAsConfig(v0 []*DashboardsAsConfigV0) []*DashboardsAsConfig { func mapV0ToDashboardsAsConfig(v0 []*DashboardsAsConfigV0) ([]*DashboardsAsConfig, error) {
var r []*DashboardsAsConfig var r []*DashboardsAsConfig
seen := make(map[string]bool)
for _, v := range v0 { for _, v := range v0 {
if _, ok := seen[v.Name]; ok {
return nil, fmt.Errorf("dashboard name %q is not unique", v.Name)
}
seen[v.Name] = true
r = append(r, &DashboardsAsConfig{ r = append(r, &DashboardsAsConfig{
Name: v.Name, Name: v.Name,
Type: v.Type, Type: v.Type,
...@@ -91,13 +97,19 @@ func mapV0ToDashboardAsConfig(v0 []*DashboardsAsConfigV0) []*DashboardsAsConfig ...@@ -91,13 +97,19 @@ func mapV0ToDashboardAsConfig(v0 []*DashboardsAsConfigV0) []*DashboardsAsConfig
}) })
} }
return r return r, nil
} }
func (dc *DashboardAsConfigV1) mapToDashboardAsConfig() []*DashboardsAsConfig { func (dc *DashboardAsConfigV1) mapToDashboardsAsConfig() ([]*DashboardsAsConfig, error) {
var r []*DashboardsAsConfig var r []*DashboardsAsConfig
seen := make(map[string]bool)
for _, v := range dc.Providers { for _, v := range dc.Providers {
if _, ok := seen[v.Name.Value()]; ok {
return nil, fmt.Errorf("dashboard name %q is not unique", v.Name.Value())
}
seen[v.Name.Value()] = true
r = append(r, &DashboardsAsConfig{ r = append(r, &DashboardsAsConfig{
Name: v.Name.Value(), Name: v.Name.Value(),
Type: v.Type.Value(), Type: v.Type.Value(),
...@@ -112,5 +124,5 @@ func (dc *DashboardAsConfigV1) mapToDashboardAsConfig() []*DashboardsAsConfig { ...@@ -112,5 +124,5 @@ func (dc *DashboardAsConfigV1) mapToDashboardAsConfig() []*DashboardsAsConfig {
}) })
} }
return r return r, nil
} }
...@@ -75,6 +75,7 @@ func (ps *provisioningServiceImpl) Run(ctx context.Context) error { ...@@ -75,6 +75,7 @@ func (ps *provisioningServiceImpl) Run(ctx context.Context) error {
err := ps.ProvisionDashboards() err := ps.ProvisionDashboards()
if err != nil { if err != nil {
ps.log.Error("Failed to provision dashboard", "error", err) ps.log.Error("Failed to provision dashboard", "error", err)
return err
} }
for { for {
......
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