From 39e8bc0b98d8705f4548dc6ba4d09e11987d2a32 Mon Sep 17 00:00:00 2001 From: qiaozp <47812250+chivalryq@users.noreply.github.com> Date: Mon, 8 Nov 2021 23:13:04 +0800 Subject: [PATCH] add addon parameter openAPI schema (#2666) --- pkg/apiserver/rest/apis/v1/types.go | 3 +++ pkg/apiserver/rest/usecase/addon.go | 36 +++++++++++++++++++++++++++++ pkg/controller/utils/capability.go | 6 ++--- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/pkg/apiserver/rest/apis/v1/types.go b/pkg/apiserver/rest/apis/v1/types.go index 5bd90ecf5..6a547404d 100644 --- a/pkg/apiserver/rest/apis/v1/types.go +++ b/pkg/apiserver/rest/apis/v1/types.go @@ -115,6 +115,9 @@ type AddonElementFile struct { type DetailAddonResponse struct { AddonMeta + APISchema *openapi3.Schema `json:"schema"` + UISchema []*utils.UIParameter `json:"uiSchema"` + // More details about the addon, e.g. README Detail string `json:"detail,omitempty"` Definitions []AddonElementFile `json:"definitions"` diff --git a/pkg/apiserver/rest/usecase/addon.go b/pkg/apiserver/rest/usecase/addon.go index 2eadc5896..6dec1a338 100644 --- a/pkg/apiserver/rest/usecase/addon.go +++ b/pkg/apiserver/rest/usecase/addon.go @@ -2,9 +2,13 @@ package usecase import ( "context" + "cuelang.org/go/cue" "encoding/json" "errors" "fmt" + "github.com/getkin/kin-openapi/openapi3" + utils2 "github.com/oam-dev/kubevela/pkg/controller/utils" + "github.com/oam-dev/kubevela/pkg/utils/common" "net/url" "path" "path/filepath" @@ -473,11 +477,43 @@ func getAddonsFromGit(baseURL, dir, token string, detailed bool) ([]*apis.Detail } } + if detailed && addonRes.Parameters != "" { + err = genAddonAPISchema(addonRes) + if err != nil { + continue + } + // render default ui schema + addonRes.UISchema = renderDefaultUISchema(addonRes.APISchema) + } addons = append(addons, addonRes) } return addons, nil } +func genAddonAPISchema(addonRes *apis.DetailAddonResponse) error { + param, err := utils2.PrepareParameterCue(addonRes.Name, addonRes.Parameters) + if err != nil { + return err + } + var r cue.Runtime + cueInst, err := r.Compile("-", param) + if err != nil { + return err + } + data, err := common.GenOpenAPI(cueInst) + if err != nil { + log.Logger.Errorf("fail to generate openAPI json schema for addon: %s, err: %s", addonRes.Name, err) + return err + } + schema := &openapi3.Schema{} + if err := schema.UnmarshalJSON(data); err != nil { + log.Logger.Errorf("fail to unmarshal openAPI json schema for addon %s, err: %s", addonRes.Name, err) + return err + } + addonRes.APISchema = schema + return nil +} + func cutPathUntil(path []string, end string) ([]string, error) { for i, d := range path { if d == end { diff --git a/pkg/controller/utils/capability.go b/pkg/controller/utils/capability.go index 7b31e2992..192a066ac 100644 --- a/pkg/controller/utils/capability.go +++ b/pkg/controller/utils/capability.go @@ -420,7 +420,7 @@ func getOpenAPISchema(capability types.Capability, pd *packages.PackageDiscover) // generateOpenAPISchemaFromCapabilityParameter returns the parameter of a definition in cue.Value format func generateOpenAPISchemaFromCapabilityParameter(capability types.Capability, pd *packages.PackageDiscover) ([]byte, error) { - template, err := prepareParameterCue(capability.Name, capability.CueTemplate) + template, err := PrepareParameterCue(capability.Name, capability.CueTemplate) if err != nil { if errors.As(err, &ErrNoSectionParameterInCue{}) { // return OpenAPI with empty object parameter, making it possible to generate ConfigMap @@ -462,8 +462,8 @@ func GenerateOpenAPISchemaFromDefinition(definitionName, cueTemplate string) ([] return generateOpenAPISchemaFromCapabilityParameter(capability, nil) } -// prepareParameterCue cuts `parameter` section form definition .cue file -func prepareParameterCue(capabilityName, capabilityTemplate string) (string, error) { +// PrepareParameterCue cuts `parameter` section form definition .cue file +func PrepareParameterCue(capabilityName, capabilityTemplate string) (string, error) { var template string var withParameterFlag bool r := regexp.MustCompile(`[[:space:]]*parameter:[[:space:]]*`)