2019-08-14 18:08:34 +00:00
|
|
|
package converter
|
|
|
|
|
|
|
|
import (
|
2020-06-12 04:50:59 +00:00
|
|
|
"github.com/rancher/apiserver/pkg/types"
|
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"
|
2021-04-21 16:49:03 +00:00
|
|
|
apiextv1 "github.com/rancher/wrangler/pkg/generated/controllers/apiextensions.k8s.io/v1"
|
2020-01-31 05:37:59 +00:00
|
|
|
"github.com/rancher/wrangler/pkg/schemas"
|
2022-10-14 20:21:17 +00:00
|
|
|
v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
2019-08-14 18:08:34 +00:00
|
|
|
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": {
|
2020-08-10 19:43:05 +00:00
|
|
|
Type: "io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta",
|
|
|
|
Create: true,
|
|
|
|
Update: true,
|
2020-01-31 05:01:21 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
2021-04-21 16:49:03 +00:00
|
|
|
func AddCustomResources(crd apiextv1.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
|
|
|
|
}
|
|
|
|
|
2019-09-11 18:03:22 +00:00
|
|
|
group, kind := crd.Spec.Group, crd.Status.AcceptedNames.Kind
|
2019-08-14 18:08:34 +00:00
|
|
|
|
|
|
|
for _, version := range crd.Spec.Versions {
|
2021-04-21 16:49:03 +00:00
|
|
|
forVersion(&crd, group, kind, version, schemas)
|
2019-08-14 18:08:34 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2021-04-21 16:49:03 +00:00
|
|
|
func forVersion(crd *v1.CustomResourceDefinition, group, kind string, version v1.CustomResourceDefinitionVersion, schemasMap map[string]*types.APISchema) {
|
2019-08-14 18:08:34 +00:00
|
|
|
var versionColumns []table.Column
|
2021-04-21 16:49:03 +00:00
|
|
|
for _, col := range version.AdditionalPrinterColumns {
|
2019-08-14 18:08:34 +00:00
|
|
|
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
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2020-03-12 21:01:40 +00:00
|
|
|
id := GVKToVersionedSchemaID(schema.GroupVersionKind{
|
2019-09-11 18:03:22 +00:00
|
|
|
Group: group,
|
2021-04-21 16:49:03 +00:00
|
|
|
Version: version.Name,
|
2019-09-11 18:03:22 +00:00
|
|
|
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
|
|
|
|
}
|
2021-04-21 16:49:03 +00:00
|
|
|
if len(versionColumns) > 0 {
|
|
|
|
attributes.SetColumns(schema, versionColumns)
|
2019-08-16 18:40:42 +00:00
|
|
|
}
|
2021-04-21 16:49:03 +00:00
|
|
|
if version.Schema != nil && version.Schema.OpenAPIV3Schema != nil {
|
|
|
|
if fieldsSchema := modelV3ToSchema(id, crd.Spec.Versions[0].Schema.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
|
|
|
}
|