steve/pkg/schema/converter/openapiv3.go
2021-04-27 17:08:38 -07:00

93 lines
2.4 KiB
Go

package converter
import (
"github.com/rancher/apiserver/pkg/types"
"github.com/rancher/wrangler/pkg/schemas"
v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
)
func modelV3ToSchema(name string, k *v1.JSONSchemaProps, schemasMap map[string]*types.APISchema) *types.APISchema {
s := types.APISchema{
Schema: &schemas.Schema{
ID: name,
ResourceFields: map[string]schemas.Field{},
Attributes: map[string]interface{}{},
Description: k.Description,
},
}
for fieldName, schemaField := range k.Properties {
s.ResourceFields[fieldName] = toResourceField(name+"."+fieldName, schemaField, schemasMap)
}
for _, fieldName := range k.Required {
if f, ok := s.ResourceFields[fieldName]; ok {
f.Required = true
s.ResourceFields[fieldName] = f
}
}
if existing, ok := schemasMap[s.ID]; ok && len(existing.Attributes) > 0 {
s.Attributes = existing.Attributes
}
schemasMap[s.ID] = &s
for k, v := range s.ResourceFields {
if types.ReservedFields[k] {
s.ResourceFields["_"+k] = v
delete(s.ResourceFields, k)
}
}
return &s
}
func toResourceField(name string, schema v1.JSONSchemaProps, schemasMap map[string]*types.APISchema) schemas.Field {
f := schemas.Field{
Description: schema.Description,
Nullable: true,
Create: true,
Update: true,
}
var itemSchema *v1.JSONSchemaProps
if schema.Items != nil {
if schema.Items.Schema != nil {
itemSchema = schema.Items.Schema
} else if len(schema.Items.JSONSchemas) > 0 {
itemSchema = &schema.Items.JSONSchemas[0]
}
}
switch schema.Type {
case "array":
if itemSchema == nil {
f.Type = "array[json]"
} else if itemSchema.Type == "object" {
f.Type = "array[" + name + "]"
modelV3ToSchema(name, itemSchema, schemasMap)
} else {
f.Type = "array[" + itemSchema.Type + "]"
}
case "object":
if schema.AdditionalProperties != nil && schema.AdditionalProperties.Schema != nil && schema.AdditionalProperties.Schema.Type == "object" {
f.Type = "map[" + name + "]"
modelV3ToSchema(name, schema.AdditionalProperties.Schema, schemasMap)
} else if schema.AdditionalProperties != nil && schema.AdditionalProperties.Schema != nil {
f.Type = "map[" + schema.AdditionalProperties.Schema.Type + "]"
} else {
f.Type = name
modelV3ToSchema(name, &schema, schemasMap)
}
case "number":
f.Type = "int"
default:
f.Type = schema.Type
}
if f.Type == "" {
f.Type = "json"
}
return f
}