1
0
mirror of https://github.com/rancher/steve.git synced 2025-04-27 19:05:09 +00:00
steve/pkg/schema/converter/crd.go

105 lines
2.7 KiB
Go
Raw Normal View History

2019-08-14 18:08:34 +00:00
package converter
import (
2019-09-11 21:05:00 +00:00
"github.com/rancher/steve/pkg/attributes"
2020-01-31 05:37:59 +00:00
"github.com/rancher/steve/pkg/schema/table"
"github.com/rancher/steve/pkg/schemaserver/types"
2019-08-14 18:08:34 +00:00
"github.com/rancher/wrangler-api/pkg/generated/controllers/apiextensions.k8s.io/v1beta1"
2020-01-31 05:37:59 +00:00
"github.com/rancher/wrangler/pkg/schemas"
2019-08-14 18:08:34 +00:00
beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
)
2020-01-31 05:01:21 +00:00
var (
2020-01-31 05:37:59 +00:00
staticFields = map[string]schemas.Field{
2020-01-31 05:01:21 +00:00
"apiVersion": {
Type: "string",
},
"kind": {
Type: "string",
},
"metadata": {
Type: "io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta",
},
}
)
2020-01-31 05:37:59 +00:00
func AddCustomResources(crd v1beta1.CustomResourceDefinitionClient, schemas map[string]*types.APISchema) error {
2019-08-14 18:08:34 +00:00
crds, err := crd.List(metav1.ListOptions{})
if err != nil {
return nil
}
for _, crd := range crds.Items {
if crd.Status.AcceptedNames.Plural == "" {
continue
}
var columns []table.Column
for _, col := range crd.Spec.AdditionalPrinterColumns {
columns = append(columns, table.Column{
Name: col.Name,
Field: col.JSONPath,
Type: col.Type,
})
}
group, kind := crd.Spec.Group, crd.Status.AcceptedNames.Kind
2019-08-14 18:08:34 +00:00
if crd.Spec.Version != "" {
2020-01-31 05:01:21 +00:00
forVersion(&crd, group, crd.Spec.Version, kind, schemas, crd.Spec.AdditionalPrinterColumns, columns)
2019-08-14 18:08:34 +00:00
}
for _, version := range crd.Spec.Versions {
2020-01-31 05:01:21 +00:00
forVersion(&crd, group, version.Name, kind, schemas, crd.Spec.AdditionalPrinterColumns, columns)
2019-08-14 18:08:34 +00:00
}
}
return nil
}
2020-01-31 05:37:59 +00:00
func forVersion(crd *beta1.CustomResourceDefinition, group, version, kind string, schemasMap map[string]*types.APISchema, columnDefs []beta1.CustomResourceColumnDefinition, columns []table.Column) {
2019-08-14 18:08:34 +00:00
var versionColumns []table.Column
for _, col := range columnDefs {
versionColumns = append(versionColumns, table.Column{
2019-08-14 18:16:37 +00:00
Name: col.Name,
Field: col.JSONPath,
Type: col.Type,
Format: col.Format,
2019-08-14 18:08:34 +00:00
})
}
if len(versionColumns) == 0 {
versionColumns = columns
}
id := GVKToVersionedSchemaID(schema.GroupVersionKind{
Group: group,
Version: version,
Kind: kind,
2019-08-14 18:08:34 +00:00
})
2020-01-31 05:37:59 +00:00
schema := schemasMap[id]
2019-08-14 18:08:34 +00:00
if schema == nil {
return
}
2019-08-16 18:40:42 +00:00
if len(columns) > 0 {
attributes.SetColumns(schema, columns)
}
2020-01-31 05:01:21 +00:00
if crd.Spec.Validation != nil && crd.Spec.Validation.OpenAPIV3Schema != nil {
2020-01-31 05:37:59 +00:00
if fieldsSchema := modelV3ToSchema(id, crd.Spec.Validation.OpenAPIV3Schema, schemasMap); fieldsSchema != nil {
2020-01-31 05:01:21 +00:00
for k, v := range staticFields {
fieldsSchema.ResourceFields[k] = v
}
for k, v := range fieldsSchema.ResourceFields {
if schema.ResourceFields == nil {
2020-01-31 05:37:59 +00:00
schema.ResourceFields = map[string]schemas.Field{}
2020-01-31 05:01:21 +00:00
}
if _, ok := schema.ResourceFields[k]; !ok {
schema.ResourceFields[k] = v
}
}
}
}
2019-08-14 18:08:34 +00:00
}