mirror of
https://github.com/kubevela/kubevela.git
synced 2026-08-19 04:26:39 +00:00
add addon parameter openAPI schema (#2666)
This commit is contained in:
@@ -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"`
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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:]]*`)
|
||||
|
||||
Reference in New Issue
Block a user