From 4cd2ebe186e31e7b23925e6635c8fa271105d88e Mon Sep 17 00:00:00 2001 From: Andres Martinez Gotor Date: Mon, 3 Feb 2025 11:45:17 +0100 Subject: [PATCH] Grafana Advisor: Automatically generate frontend types (#99807) * Grafana Advisor: Frontend types * fix bad merge --- apps/advisor/.gitignore | 1 + apps/advisor/kinds/check.cue | 29 +++--- .../apis/advisor/v0alpha1/check_status_gen.go | 48 +++++----- .../apis/advisor/v0alpha1/zz_openapi_gen.go | 92 +++++++++---------- .../pkg/app/checks/datasourcecheck/check.go | 10 +- .../pkg/app/checks/plugincheck/check.go | 10 +- .../pkg/app/checks/plugincheck/check_test.go | 20 ++-- apps/advisor/plugin/README.md | 7 ++ 8 files changed, 114 insertions(+), 103 deletions(-) create mode 100644 apps/advisor/.gitignore create mode 100644 apps/advisor/plugin/README.md diff --git a/apps/advisor/.gitignore b/apps/advisor/.gitignore new file mode 100644 index 00000000000..9e73bafbae8 --- /dev/null +++ b/apps/advisor/.gitignore @@ -0,0 +1 @@ +plugin/src \ No newline at end of file diff --git a/apps/advisor/kinds/check.cue b/apps/advisor/kinds/check.cue index cf1cfd58d39..fdf641abdf3 100644 --- a/apps/advisor/kinds/check.cue +++ b/apps/advisor/kinds/check.cue @@ -7,7 +7,7 @@ check: { versions: { "v0alpha1": { codegen: { - frontend: false + frontend: true backend: true } validation: { @@ -17,24 +17,27 @@ check: { ] } schema: { - spec: { + #Data: { // Generic data input that a check can receive data?: [string]: string } - status: { - report: { + #ReportError: { + // Severity of the error + severity: "high" | "low" + // Human readable reason for the error + reason: string + // Action to take to resolve the error + action: string + } + #Report: { // Number of elements analyzed count: int // List of errors - errors: [...{ - // Severity of the error - severity: "high" | "low" - // Human readable reason for the error - reason: string - // Action to take to resolve the error - action: string - }] - } + errors: [...#ReportError] + } + spec: #Data + status: { + report: #Report } } } diff --git a/apps/advisor/pkg/apis/advisor/v0alpha1/check_status_gen.go b/apps/advisor/pkg/apis/advisor/v0alpha1/check_status_gen.go index 057ed6c4b7e..ac73ee86ec4 100644 --- a/apps/advisor/pkg/apis/advisor/v0alpha1/check_status_gen.go +++ b/apps/advisor/pkg/apis/advisor/v0alpha1/check_status_gen.go @@ -2,6 +2,21 @@ package v0alpha1 +// +k8s:openapi-gen=true +type CheckReportError struct { + // Severity of the error + Severity CheckReportErrorSeverity `json:"severity"` + // Human readable reason for the error + Reason string `json:"reason"` + // Action to take to resolve the error + Action string `json:"action"` +} + +// NewCheckReportError creates a new CheckReportError object. +func NewCheckReportError() *CheckReportError { + return &CheckReportError{} +} + // +k8s:openapi-gen=true type CheckstatusOperatorState struct { // lastEvaluation is the ResourceVersion last evaluated @@ -37,6 +52,14 @@ func NewCheckStatus() *CheckStatus { } } +// +k8s:openapi-gen=true +type CheckReportErrorSeverity string + +const ( + CheckReportErrorSeverityHigh CheckReportErrorSeverity = "high" + CheckReportErrorSeverityLow CheckReportErrorSeverity = "low" +) + // +k8s:openapi-gen=true type CheckStatusOperatorStateState string @@ -46,35 +69,12 @@ const ( CheckStatusOperatorStateStateFailed CheckStatusOperatorStateState = "failed" ) -// +k8s:openapi-gen=true -type CheckStatusSeverity string - -const ( - CheckStatusSeverityHigh CheckStatusSeverity = "high" - CheckStatusSeverityLow CheckStatusSeverity = "low" -) - -// +k8s:openapi-gen=true -type CheckV0alpha1StatusReportErrors struct { - // Severity of the error - Severity CheckStatusSeverity `json:"severity"` - // Human readable reason for the error - Reason string `json:"reason"` - // Action to take to resolve the error - Action string `json:"action"` -} - -// NewCheckV0alpha1StatusReportErrors creates a new CheckV0alpha1StatusReportErrors object. -func NewCheckV0alpha1StatusReportErrors() *CheckV0alpha1StatusReportErrors { - return &CheckV0alpha1StatusReportErrors{} -} - // +k8s:openapi-gen=true type CheckV0alpha1StatusReport struct { // Number of elements analyzed Count int64 `json:"count"` // List of errors - Errors []CheckV0alpha1StatusReportErrors `json:"errors"` + Errors []CheckReportError `json:"errors"` } // NewCheckV0alpha1StatusReport creates a new CheckV0alpha1StatusReport object. diff --git a/apps/advisor/pkg/apis/advisor/v0alpha1/zz_openapi_gen.go b/apps/advisor/pkg/apis/advisor/v0alpha1/zz_openapi_gen.go index a78d033bb26..74ccb4861e6 100644 --- a/apps/advisor/pkg/apis/advisor/v0alpha1/zz_openapi_gen.go +++ b/apps/advisor/pkg/apis/advisor/v0alpha1/zz_openapi_gen.go @@ -12,13 +12,13 @@ import ( func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition { return map[string]common.OpenAPIDefinition{ - "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1.Check": schema_pkg_apis_advisor_v0alpha1_Check(ref), - "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1.CheckList": schema_pkg_apis_advisor_v0alpha1_CheckList(ref), - "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1.CheckSpec": schema_pkg_apis_advisor_v0alpha1_CheckSpec(ref), - "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1.CheckStatus": schema_pkg_apis_advisor_v0alpha1_CheckStatus(ref), - "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1.CheckV0alpha1StatusReport": schema_pkg_apis_advisor_v0alpha1_CheckV0alpha1StatusReport(ref), - "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1.CheckV0alpha1StatusReportErrors": schema_pkg_apis_advisor_v0alpha1_CheckV0alpha1StatusReportErrors(ref), - "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1.CheckstatusOperatorState": schema_pkg_apis_advisor_v0alpha1_CheckstatusOperatorState(ref), + "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1.Check": schema_pkg_apis_advisor_v0alpha1_Check(ref), + "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1.CheckList": schema_pkg_apis_advisor_v0alpha1_CheckList(ref), + "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1.CheckReportError": schema_pkg_apis_advisor_v0alpha1_CheckReportError(ref), + "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1.CheckSpec": schema_pkg_apis_advisor_v0alpha1_CheckSpec(ref), + "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1.CheckStatus": schema_pkg_apis_advisor_v0alpha1_CheckStatus(ref), + "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1.CheckV0alpha1StatusReport": schema_pkg_apis_advisor_v0alpha1_CheckV0alpha1StatusReport(ref), + "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1.CheckstatusOperatorState": schema_pkg_apis_advisor_v0alpha1_CheckstatusOperatorState(ref), } } @@ -117,6 +117,43 @@ func schema_pkg_apis_advisor_v0alpha1_CheckList(ref common.ReferenceCallback) co } } +func schema_pkg_apis_advisor_v0alpha1_CheckReportError(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "severity": { + SchemaProps: spec.SchemaProps{ + Description: "Severity of the error", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "reason": { + SchemaProps: spec.SchemaProps{ + Description: "Human readable reason for the error", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "action": { + SchemaProps: spec.SchemaProps{ + Description: "Action to take to resolve the error", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"severity", "reason", "action"}, + }, + }, + } +} + func schema_pkg_apis_advisor_v0alpha1_CheckSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -218,7 +255,7 @@ func schema_pkg_apis_advisor_v0alpha1_CheckV0alpha1StatusReport(ref common.Refer Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1.CheckV0alpha1StatusReportErrors"), + Ref: ref("github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1.CheckReportError"), }, }, }, @@ -229,44 +266,7 @@ func schema_pkg_apis_advisor_v0alpha1_CheckV0alpha1StatusReport(ref common.Refer }, }, Dependencies: []string{ - "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1.CheckV0alpha1StatusReportErrors"}, - } -} - -func schema_pkg_apis_advisor_v0alpha1_CheckV0alpha1StatusReportErrors(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "severity": { - SchemaProps: spec.SchemaProps{ - Description: "Severity of the error", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "reason": { - SchemaProps: spec.SchemaProps{ - Description: "Human readable reason for the error", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "action": { - SchemaProps: spec.SchemaProps{ - Description: "Action to take to resolve the error", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - }, - Required: []string{"severity", "reason", "action"}, - }, - }, + "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1.CheckReportError"}, } } diff --git a/apps/advisor/pkg/app/checks/datasourcecheck/check.go b/apps/advisor/pkg/app/checks/datasourcecheck/check.go index 8ff4c1a1dc3..5c5d7d8bdcc 100644 --- a/apps/advisor/pkg/app/checks/datasourcecheck/check.go +++ b/apps/advisor/pkg/app/checks/datasourcecheck/check.go @@ -49,13 +49,13 @@ func (c *check) Run(ctx context.Context, obj *advisor.CheckSpec) (*advisor.Check return nil, err } - dsErrs := []advisor.CheckV0alpha1StatusReportErrors{} + dsErrs := []advisor.CheckReportError{} for _, ds := range dss { // Data source UID validation err := util.ValidateUID(ds.UID) if err != nil { - dsErrs = append(dsErrs, advisor.CheckV0alpha1StatusReportErrors{ - Severity: advisor.CheckStatusSeverityLow, + dsErrs = append(dsErrs, advisor.CheckReportError{ + Severity: advisor.CheckReportErrorSeverityLow, Reason: fmt.Sprintf("Invalid UID '%s' for data source %s", ds.UID, ds.Name), Action: "Check the documentation for more information.", }) @@ -81,8 +81,8 @@ func (c *check) Run(ctx context.Context, obj *advisor.CheckSpec) (*advisor.Check continue } if resp.Status != backend.HealthStatusOk { - dsErrs = append(dsErrs, advisor.CheckV0alpha1StatusReportErrors{ - Severity: advisor.CheckStatusSeverityHigh, + dsErrs = append(dsErrs, advisor.CheckReportError{ + Severity: advisor.CheckReportErrorSeverityHigh, Reason: fmt.Sprintf("Health check failed for %s", ds.Name), Action: fmt.Sprintf( "Go to the data source configuration"+ diff --git a/apps/advisor/pkg/app/checks/plugincheck/check.go b/apps/advisor/pkg/app/checks/plugincheck/check.go index 793fc935946..8a20820f450 100644 --- a/apps/advisor/pkg/app/checks/plugincheck/check.go +++ b/apps/advisor/pkg/app/checks/plugincheck/check.go @@ -43,7 +43,7 @@ func (c *check) Type() string { func (c *check) Run(ctx context.Context, _ *advisor.CheckSpec) (*advisor.CheckV0alpha1StatusReport, error) { ps := c.PluginStore.Plugins(ctx) - errs := []advisor.CheckV0alpha1StatusReportErrors{} + errs := []advisor.CheckReportError{} for _, p := range ps { // Skip if it's a core plugin if p.IsCorePlugin() { @@ -56,8 +56,8 @@ func (c *check) Run(ctx context.Context, _ *advisor.CheckSpec) (*advisor.CheckV0 continue } if i.Status == "deprecated" { - errs = append(errs, advisor.CheckV0alpha1StatusReportErrors{ - Severity: advisor.CheckStatusSeverityHigh, + errs = append(errs, advisor.CheckReportError{ + Severity: advisor.CheckReportErrorSeverityHigh, Reason: fmt.Sprintf("Plugin deprecated: %s", p.ID), Action: "Check the documentation for recommended steps.", }) @@ -73,8 +73,8 @@ func (c *check) Run(ctx context.Context, _ *advisor.CheckSpec) (*advisor.CheckV0 continue } if hasUpdate(p, info) { - errs = append(errs, advisor.CheckV0alpha1StatusReportErrors{ - Severity: advisor.CheckStatusSeverityLow, + errs = append(errs, advisor.CheckReportError{ + Severity: advisor.CheckReportErrorSeverityLow, Reason: fmt.Sprintf("New version available for %s", p.ID), Action: fmt.Sprintf( "Go to the plugin admin page"+ diff --git a/apps/advisor/pkg/app/checks/plugincheck/check_test.go b/apps/advisor/pkg/app/checks/plugincheck/check_test.go index 3fa7f1b20cb..41c0705e904 100644 --- a/apps/advisor/pkg/app/checks/plugincheck/check_test.go +++ b/apps/advisor/pkg/app/checks/plugincheck/check_test.go @@ -21,12 +21,12 @@ func TestRun(t *testing.T) { pluginArchives map[string]*repo.PluginArchiveInfo pluginPreinstalled []string pluginManaged []string - expectedErrors []advisor.CheckV0alpha1StatusReportErrors + expectedErrors []advisor.CheckReportError }{ { name: "No plugins", plugins: []pluginstore.Plugin{}, - expectedErrors: []advisor.CheckV0alpha1StatusReportErrors{}, + expectedErrors: []advisor.CheckReportError{}, }, { name: "Deprecated plugin", @@ -39,9 +39,9 @@ func TestRun(t *testing.T) { pluginArchives: map[string]*repo.PluginArchiveInfo{ "plugin1": {Version: "1.0.0"}, }, - expectedErrors: []advisor.CheckV0alpha1StatusReportErrors{ + expectedErrors: []advisor.CheckReportError{ { - Severity: advisor.CheckStatusSeverityHigh, + Severity: advisor.CheckReportErrorSeverityHigh, Reason: "Plugin deprecated: plugin1", Action: "Check the documentation for recommended steps.", }, @@ -58,9 +58,9 @@ func TestRun(t *testing.T) { pluginArchives: map[string]*repo.PluginArchiveInfo{ "plugin2": {Version: "1.1.0"}, }, - expectedErrors: []advisor.CheckV0alpha1StatusReportErrors{ + expectedErrors: []advisor.CheckReportError{ { - Severity: advisor.CheckStatusSeverityLow, + Severity: advisor.CheckReportErrorSeverityLow, Reason: "New version available for plugin2", Action: "Go to the plugin admin page and upgrade to the latest version.", }, @@ -77,9 +77,9 @@ func TestRun(t *testing.T) { pluginArchives: map[string]*repo.PluginArchiveInfo{ "plugin2": {Version: "beta"}, }, - expectedErrors: []advisor.CheckV0alpha1StatusReportErrors{ + expectedErrors: []advisor.CheckReportError{ { - Severity: advisor.CheckStatusSeverityLow, + Severity: advisor.CheckReportErrorSeverityLow, Reason: "New version available for plugin2", Action: "Go to the plugin admin page and upgrade to the latest version.", }, @@ -97,7 +97,7 @@ func TestRun(t *testing.T) { "plugin3": {Version: "1.1.0"}, }, pluginPreinstalled: []string{"plugin3"}, - expectedErrors: []advisor.CheckV0alpha1StatusReportErrors{}, + expectedErrors: []advisor.CheckReportError{}, }, { name: "Managed plugin", @@ -111,7 +111,7 @@ func TestRun(t *testing.T) { "plugin4": {Version: "1.1.0"}, }, pluginManaged: []string{"plugin4"}, - expectedErrors: []advisor.CheckV0alpha1StatusReportErrors{}, + expectedErrors: []advisor.CheckReportError{}, }, } diff --git a/apps/advisor/plugin/README.md b/apps/advisor/plugin/README.md new file mode 100644 index 00000000000..5b9e2bc8744 --- /dev/null +++ b/apps/advisor/plugin/README.md @@ -0,0 +1,7 @@ +This folder contains the automatically generated types for the frontend that are used in the app plugin. + +To update the types: + +1. Make any necessary changes in the `kinds` directory +2. Run `make generate` +3. Copy the `plugin` directory to the frontend app: https://github.com/grafana/grafana-advisor-app/tree/main/src/plugin