add addon parameter openAPI schema (#2666)

This commit is contained in:
qiaozp
2021-11-08 10:13:04 -05:00
committed by GitHub
parent 976da6f35a
commit 39e8bc0b98
3 changed files with 42 additions and 3 deletions
+3
View File
@@ -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"`
+36
View File
@@ -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 {
+3 -3
View File
@@ -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:]]*`)