1
0
mirror of https://github.com/rancher/steve.git synced 2025-06-26 23:07:26 +00:00
steve/pkg/schema/converter/discovery.go

96 lines
2.5 KiB
Go
Raw Normal View History

2019-08-13 23:36:03 +00:00
package converter
import (
"strings"
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/schemaserver/types"
2019-08-13 23:36:03 +00:00
"github.com/rancher/wrangler/pkg/merr"
2020-01-31 05:37:59 +00:00
"github.com/rancher/wrangler/pkg/schemas"
2019-08-13 23:36:03 +00:00
"github.com/sirupsen/logrus"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/discovery"
)
2019-08-16 18:40:42 +00:00
var (
preferredGroups = map[string]string{
"extensions": "apps",
}
)
2020-01-31 05:37:59 +00:00
func AddDiscovery(client discovery.DiscoveryInterface, schemasMap map[string]*types.APISchema) error {
2019-08-13 23:36:03 +00:00
logrus.Info("Refreshing all schemas")
2019-08-16 18:40:42 +00:00
groups, resourceLists, err := client.ServerGroupsAndResources()
2020-01-31 05:37:59 +00:00
if gd, ok := err.(*discovery.ErrGroupDiscoveryFailed); ok {
logrus.Errorf("Failed to read API for groups %v", gd.Groups)
} else if err != nil {
2019-08-13 23:36:03 +00:00
return err
}
2019-08-16 18:40:42 +00:00
versions := indexVersions(groups)
2019-08-13 23:36:03 +00:00
var errs []error
for _, resourceList := range resourceLists {
gv, err := schema.ParseGroupVersion(resourceList.GroupVersion)
if err != nil {
errs = append(errs, err)
}
2020-01-31 05:37:59 +00:00
if err := refresh(gv, versions, resourceList, schemasMap); err != nil {
2019-08-13 23:36:03 +00:00
errs = append(errs, err)
}
}
return merr.NewErrors(errs...)
}
2019-08-16 18:40:42 +00:00
func indexVersions(groups []*metav1.APIGroup) map[string]string {
result := map[string]string{}
for _, group := range groups {
result[group.Name] = group.PreferredVersion.Version
}
return result
}
2020-01-31 05:37:59 +00:00
func refresh(gv schema.GroupVersion, groupToPreferredVersion map[string]string, resources *metav1.APIResourceList, schemasMap map[string]*types.APISchema) error {
2019-08-13 23:36:03 +00:00
for _, resource := range resources.APIResources {
if strings.Contains(resource.Name, "/") {
continue
}
gvk := schema.GroupVersionKind{
Group: gv.Group,
Version: gv.Version,
Kind: resource.Kind,
}
gvr := gvk.GroupVersion().WithResource(resource.Name)
logrus.Infof("APIVersion %s/%s Kind %s", gvk.Group, gvk.Version, gvk.Kind)
2020-01-31 05:37:59 +00:00
schema := schemasMap[GVKToSchemaID(gvk)]
2019-08-13 23:36:03 +00:00
if schema == nil {
2020-01-31 05:37:59 +00:00
schema = &types.APISchema{
Schema: &schemas.Schema{
ID: GVKToSchemaID(gvk),
},
2019-08-13 23:36:03 +00:00
}
attributes.SetGVK(schema, gvk)
}
schema.PluralName = GVRToPluralName(gvr)
2019-08-13 23:36:03 +00:00
attributes.SetAPIResource(schema, resource)
2019-08-16 18:40:42 +00:00
if preferredVersion := groupToPreferredVersion[gv.Group]; preferredVersion != "" && preferredVersion != gv.Version {
attributes.SetPreferredVersion(schema, preferredVersion)
}
if group := preferredGroups[gv.Group]; group != "" {
attributes.SetPreferredGroup(schema, group)
}
2019-08-13 23:36:03 +00:00
2020-01-31 05:37:59 +00:00
schemasMap[schema.ID] = schema
2019-08-13 23:36:03 +00:00
}
return nil
}