mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
* Revert "solve comments and retrigger the test" This reverts commitf08d2d9eca
. * Revert "update api doc" This reverts commitcc09ceb853
. * Revert "remove post trim" This reverts commit46fe8ed596
. * Revert "fix typo" This reverts commit3b3ceee16e
. * Revert "Apply suggestions from code review" This reverts commit3b7f3b8e15
. * Revert "update comments" This reverts commitb9c6260876
. * Revert "update doc" This reverts commit8e4c4d7c93
. * Revert "remove feature toggle + add libraryPaneldefinition" This reverts commitd01cfcc2ed
. * fix some typos * Update public/app/features/dashboard/components/ShareModal/ShareExport.tsx Co-authored-by: Marcus Efraimsson <marcus.efraimsson@gmail.com> * Update docs/sources/dashboards/export-import.md Co-authored-by: achatterjee-grafana <70489351+achatterjee-grafana@users.noreply.github.com> * fix comments Co-authored-by: Marcus Efraimsson <marcus.efraimsson@gmail.com> Co-authored-by: achatterjee-grafana <70489351+achatterjee-grafana@users.noreply.github.com>
150 lines
3.5 KiB
Go
150 lines
3.5 KiB
Go
package schemaloader
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
|
|
"github.com/grafana/grafana"
|
|
"github.com/grafana/grafana/pkg/components/simplejson"
|
|
"github.com/grafana/grafana/pkg/schema"
|
|
"github.com/grafana/grafana/pkg/schema/load"
|
|
|
|
"github.com/grafana/grafana/pkg/infra/log"
|
|
"github.com/grafana/grafana/pkg/registry"
|
|
"github.com/grafana/grafana/pkg/setting"
|
|
)
|
|
|
|
func init() {
|
|
registry.Register(®istry.Descriptor{
|
|
Name: ServiceName,
|
|
Instance: &SchemaLoaderService{},
|
|
})
|
|
}
|
|
|
|
const ServiceName = "SchemaLoader"
|
|
|
|
var baseLoadPath load.BaseLoadPaths = load.BaseLoadPaths{
|
|
BaseCueFS: grafana.CoreSchema,
|
|
DistPluginCueFS: grafana.PluginSchema,
|
|
}
|
|
|
|
type RenderUser struct {
|
|
OrgID int64
|
|
UserID int64
|
|
OrgRole string
|
|
}
|
|
|
|
type SchemaLoaderService struct {
|
|
log log.Logger
|
|
DashFamily schema.VersionedCueSchema
|
|
Cfg *setting.Cfg `inject:""`
|
|
}
|
|
|
|
func (rs *SchemaLoaderService) Init() error {
|
|
rs.log = log.New("schemaloader")
|
|
var err error
|
|
rs.DashFamily, err = load.BaseDashboardFamily(baseLoadPath)
|
|
|
|
if err != nil {
|
|
return fmt.Errorf("failed to load dashboard cue schema from path %q: %w", baseLoadPath, err)
|
|
}
|
|
return nil
|
|
}
|
|
func (rs *SchemaLoaderService) IsDisabled() bool {
|
|
if rs.Cfg == nil {
|
|
return true
|
|
}
|
|
return !rs.Cfg.IsTrimDefaultsEnabled()
|
|
}
|
|
|
|
func (rs *SchemaLoaderService) DashboardApplyDefaults(input *simplejson.Json) (*simplejson.Json, error) {
|
|
val, _ := input.Map()
|
|
val = removeNils(val)
|
|
data, _ := json.Marshal(val)
|
|
dsSchema := schema.Find(rs.DashFamily, schema.Latest())
|
|
result, err := schema.ApplyDefaults(schema.Resource{Value: data}, dsSchema.CUE())
|
|
if err != nil {
|
|
return input, err
|
|
}
|
|
output, err := simplejson.NewJson([]byte(result.Value.(string)))
|
|
if err != nil {
|
|
return input, err
|
|
}
|
|
return output, nil
|
|
}
|
|
|
|
func (rs *SchemaLoaderService) DashboardTrimDefaults(input simplejson.Json) (simplejson.Json, error) {
|
|
val, _ := input.Map()
|
|
val = removeNils(val)
|
|
data, _ := json.Marshal(val)
|
|
|
|
dsSchema, err := schema.SearchAndValidate(rs.DashFamily, data)
|
|
if err != nil {
|
|
return input, err
|
|
}
|
|
// spew.Dump(dsSchema)
|
|
result, err := schema.TrimDefaults(schema.Resource{Value: data}, dsSchema.CUE())
|
|
if err != nil {
|
|
return input, err
|
|
}
|
|
output, err := simplejson.NewJson([]byte(result.Value.(string)))
|
|
if err != nil {
|
|
return input, err
|
|
}
|
|
return *output, nil
|
|
}
|
|
|
|
func removeNils(initialMap map[string]interface{}) map[string]interface{} {
|
|
withoutNils := map[string]interface{}{}
|
|
for key, value := range initialMap {
|
|
_, ok := value.(map[string]interface{})
|
|
if ok {
|
|
value = removeNils(value.(map[string]interface{}))
|
|
withoutNils[key] = value
|
|
continue
|
|
}
|
|
_, ok = value.([]interface{})
|
|
if ok {
|
|
value = removeNilArray(value.([]interface{}))
|
|
withoutNils[key] = value
|
|
continue
|
|
}
|
|
if value != nil {
|
|
if val, ok := value.(string); ok {
|
|
if val == "" {
|
|
continue
|
|
}
|
|
}
|
|
withoutNils[key] = value
|
|
}
|
|
}
|
|
return withoutNils
|
|
}
|
|
|
|
func removeNilArray(initialArray []interface{}) []interface{} {
|
|
withoutNils := []interface{}{}
|
|
for _, value := range initialArray {
|
|
_, ok := value.(map[string]interface{})
|
|
if ok {
|
|
value = removeNils(value.(map[string]interface{}))
|
|
withoutNils = append(withoutNils, value)
|
|
continue
|
|
}
|
|
_, ok = value.([]interface{})
|
|
if ok {
|
|
value = removeNilArray(value.([]interface{}))
|
|
withoutNils = append(withoutNils, value)
|
|
continue
|
|
}
|
|
if value != nil {
|
|
if val, ok := value.(string); ok {
|
|
if val == "" {
|
|
continue
|
|
}
|
|
}
|
|
withoutNils = append(withoutNils, value)
|
|
}
|
|
}
|
|
return withoutNils
|
|
}
|