Files
grafana/pkg/cmd/grafana-cli/commands/scuemata_validation_command.go
Dimitris Sotirakis bfcf82f861 Scuemata: Add grafana-cli command to validate resources against scuemata (#33852)
* Add validate-resource cli command

* Fixes according to reviewer's comments
2021-05-18 10:30:13 +03:00

81 lines
1.9 KiB
Go

package commands
import (
"fmt"
"os"
"path/filepath"
"github.com/grafana/grafana/pkg/cmd/grafana-cli/utils"
"github.com/grafana/grafana/pkg/schema"
"github.com/grafana/grafana/pkg/schema/load"
)
var paths = load.GetDefaultLoadPaths()
func (cmd Command) validateScuemataBasics(c utils.CommandLine) error {
if err := validateScuemata(paths, load.BaseDashboardFamily); err != nil {
return err
}
if err := validateScuemata(paths, load.DistDashboardFamily); err != nil {
return err
}
return nil
}
func (cmd Command) validateResources(c utils.CommandLine) error {
resource := c.String("dashboard")
b, err := os.Open(filepath.Clean(resource))
if err != nil {
return err
}
if err := validateResources(b, paths, load.BaseDashboardFamily); err != nil {
return err
}
if err := validateResources(b, paths, load.DistDashboardFamily); err != nil {
return err
}
return nil
}
func validateResources(resource interface{}, p load.BaseLoadPaths, loader func(p load.BaseLoadPaths) (schema.VersionedCueSchema, error)) error {
dash, err := loader(p)
if err != nil {
return fmt.Errorf("error while loading dashboard scuemata, err: %w", err)
}
// Validate checks that the resource is correct with respect to the schema.
if resource != nil {
err = dash.Validate(schema.Resource{Value: resource})
if err != nil {
return fmt.Errorf("failed validation: %w", err)
}
}
return nil
}
func validateScuemata(p load.BaseLoadPaths, loader func(p load.BaseLoadPaths) (schema.VersionedCueSchema, error)) error {
dash, err := loader(p)
if err != nil {
return fmt.Errorf("error while loading dashboard scuemata, err: %w", err)
}
// Check that a CUE value exists.
cueValue := dash.CUE()
if !cueValue.Exists() {
return fmt.Errorf("cue value for schema does not exist")
}
// Check CUE validity.
if err := cueValue.Validate(); err != nil {
return fmt.Errorf("all schema should be valid with respect to basic CUE rules, %w", err)
}
return nil
}