mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Kinds: Generate JSON report (#59742)
* Kinds: Generate JSON report * Kinds: Add Validate/Write support for JSON report * Kinds: Report format * Kinds: Report new line * Kinds: Use kindsys.SomeKindMeta to generate the report * Move kinds report generation to the end * Re-structure kinds report JSON output * Make prettier to ignore kinds json report * Minor on kinds report generation * Fix toggles_gen test
This commit is contained in:
parent
8e77a42741
commit
61cd9eeb24
@ -30,3 +30,6 @@ theme.dark.generated.json
|
|||||||
public/api-spec.json
|
public/api-spec.json
|
||||||
public/api-merged.json
|
public/api-merged.json
|
||||||
public/openapi3.json
|
public/openapi3.json
|
||||||
|
|
||||||
|
# Generated Kinds report
|
||||||
|
kinds/report.json
|
||||||
|
1
Makefile
1
Makefile
@ -70,6 +70,7 @@ gen-cue: ## Do all CUE/Thema code generation
|
|||||||
go generate ./kinds/gen.go
|
go generate ./kinds/gen.go
|
||||||
go generate ./pkg/framework/coremodel
|
go generate ./pkg/framework/coremodel
|
||||||
go generate ./public/app/plugins/gen.go
|
go generate ./public/app/plugins/gen.go
|
||||||
|
go generate ./kinds/report.go
|
||||||
|
|
||||||
gen-go: $(WIRE) gen-cue
|
gen-go: $(WIRE) gen-cue
|
||||||
@echo "generate go files"
|
@echo "generate go files"
|
||||||
|
97
kinds/report.go
Normal file
97
kinds/report.go
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
//go:build ignore
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
|
//go:generate go run report.go
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/grafana/codejen"
|
||||||
|
"github.com/grafana/grafana/pkg/kindsys"
|
||||||
|
"github.com/grafana/grafana/pkg/registry/corekind"
|
||||||
|
)
|
||||||
|
|
||||||
|
const reportFileName = "report.json"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
report := buildKindStateReport()
|
||||||
|
reportJSON := elsedie(json.MarshalIndent(report, "", " "))("error generating json output")
|
||||||
|
|
||||||
|
path := filepath.Join(kindsys.DeclParentPath, reportFileName)
|
||||||
|
file := codejen.NewFile(path, reportJSON, reportJenny{})
|
||||||
|
filesystem := elsedie(file.ToFS())("error building in-memory file system")
|
||||||
|
|
||||||
|
cwd := elsedie(os.Getwd())("error getting working directory")
|
||||||
|
groot := filepath.Dir(cwd)
|
||||||
|
|
||||||
|
if _, set := os.LookupEnv("CODEGEN_VERIFY"); set {
|
||||||
|
if err := filesystem.Verify(context.Background(), groot); err != nil {
|
||||||
|
die(fmt.Errorf("generated code is out of sync with inputs:\n%s\nrun `make gen-cue` to regenerate", err))
|
||||||
|
}
|
||||||
|
} else if err := filesystem.Write(context.Background(), groot); err != nil {
|
||||||
|
die(fmt.Errorf("error while writing generated code to disk:\n%s", err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type KindStateReport struct {
|
||||||
|
Core []kindsys.CoreStructuredProperties `json:"core"`
|
||||||
|
Raw []kindsys.RawProperties `json:"raw"`
|
||||||
|
Composable []kindsys.ComposableProperties `json:"composable"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func emptyKindStateReport() KindStateReport {
|
||||||
|
return KindStateReport{
|
||||||
|
Core: make([]kindsys.CoreStructuredProperties, 0),
|
||||||
|
Raw: make([]kindsys.RawProperties, 0),
|
||||||
|
Composable: make([]kindsys.ComposableProperties, 0),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildKindStateReport() KindStateReport {
|
||||||
|
r := emptyKindStateReport()
|
||||||
|
b := corekind.NewBase(nil)
|
||||||
|
|
||||||
|
for _, k := range b.All() {
|
||||||
|
switch props := k.Props().(type) {
|
||||||
|
case kindsys.CoreStructuredProperties:
|
||||||
|
r.Core = append(r.Core, props)
|
||||||
|
case kindsys.RawProperties:
|
||||||
|
r.Raw = append(r.Raw, props)
|
||||||
|
case kindsys.ComposableProperties:
|
||||||
|
r.Composable = append(r.Composable, props)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
type reportJenny struct{}
|
||||||
|
|
||||||
|
func (reportJenny) JennyName() string {
|
||||||
|
return "ReportJenny"
|
||||||
|
}
|
||||||
|
|
||||||
|
func elsedie[T any](t T, err error) func(msg string) T {
|
||||||
|
if err != nil {
|
||||||
|
return func(msg string) T {
|
||||||
|
fmt.Fprintf(os.Stderr, "%s: %s\n", msg, err)
|
||||||
|
os.Exit(1)
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return func(msg string) T {
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func die(err error) {
|
||||||
|
fmt.Fprint(os.Stderr, err, "\n")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
54
kinds/report.json
Normal file
54
kinds/report.json
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"core": [
|
||||||
|
{
|
||||||
|
"name": "Dashboard",
|
||||||
|
"pluralName": "Dashboards",
|
||||||
|
"machineName": "dashboard",
|
||||||
|
"pluralMachineName": "dashboards",
|
||||||
|
"lineageIsGroup": false,
|
||||||
|
"maturity": "merged",
|
||||||
|
"currentVersion": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Playlist",
|
||||||
|
"pluralName": "Playlists",
|
||||||
|
"machineName": "playlist",
|
||||||
|
"pluralMachineName": "playlists",
|
||||||
|
"lineageIsGroup": false,
|
||||||
|
"maturity": "merged",
|
||||||
|
"currentVersion": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Team",
|
||||||
|
"pluralName": "Teams",
|
||||||
|
"machineName": "team",
|
||||||
|
"pluralMachineName": "teams",
|
||||||
|
"lineageIsGroup": false,
|
||||||
|
"maturity": "merged",
|
||||||
|
"currentVersion": [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"raw": [
|
||||||
|
{
|
||||||
|
"name": "SVG",
|
||||||
|
"pluralName": "SVGs",
|
||||||
|
"machineName": "svg",
|
||||||
|
"pluralMachineName": "svgs",
|
||||||
|
"lineageIsGroup": false,
|
||||||
|
"maturity": "merged",
|
||||||
|
"extensions": [
|
||||||
|
"svg"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"composable": []
|
||||||
|
}
|
@ -41,6 +41,10 @@ func (m Maturity) Less(om Maturity) bool {
|
|||||||
return maturityIdx(m) < maturityIdx(om)
|
return maturityIdx(m) < maturityIdx(om)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m Maturity) String() string {
|
||||||
|
return string(m)
|
||||||
|
}
|
||||||
|
|
||||||
// Interface describes a Grafana kind object: a Go representation of the definition of
|
// Interface describes a Grafana kind object: a Go representation of the definition of
|
||||||
// one of Grafana's categories of kinds.
|
// one of Grafana's categories of kinds.
|
||||||
type Interface interface {
|
type Interface interface {
|
||||||
|
@ -12,14 +12,19 @@ import (
|
|||||||
"github.com/grafana/thema"
|
"github.com/grafana/thema"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// DeclParentPath is the path, relative to the repository root, where
|
||||||
|
// each child directory is expected to contain directories with .cue files,
|
||||||
|
// declaring one kind.
|
||||||
|
var DeclParentPath = "kinds"
|
||||||
|
|
||||||
// CoreStructuredDeclParentPath is the path, relative to the repository root, where
|
// CoreStructuredDeclParentPath is the path, relative to the repository root, where
|
||||||
// each child directory is expected to contain .cue files declaring one
|
// each child directory is expected to contain .cue files declaring one
|
||||||
// CoreStructured kind.
|
// CoreStructured kind.
|
||||||
var CoreStructuredDeclParentPath = filepath.Join("kinds", "structured")
|
var CoreStructuredDeclParentPath = filepath.Join(DeclParentPath, "structured")
|
||||||
|
|
||||||
// RawDeclParentPath is the path, relative to the repository root, where each child
|
// RawDeclParentPath is the path, relative to the repository root, where each child
|
||||||
// directory is expected to contain .cue files declaring one Raw kind.
|
// directory is expected to contain .cue files declaring one Raw kind.
|
||||||
var RawDeclParentPath = filepath.Join("kinds", "raw")
|
var RawDeclParentPath = filepath.Join(DeclParentPath, "raw")
|
||||||
|
|
||||||
// GoCoreKindParentPath is the path, relative to the repository root, to the directory
|
// GoCoreKindParentPath is the path, relative to the repository root, to the directory
|
||||||
// containing one directory per kind, full of generated Go kind output: types and bindings.
|
// containing one directory per kind, full of generated Go kind output: types and bindings.
|
||||||
|
Loading…
Reference in New Issue
Block a user