1
0
mirror of https://github.com/rancher/steve.git synced 2025-07-04 10:36:40 +00:00
steve/pkg/resources/common/dynamiccolumns.go

105 lines
2.4 KiB
Go
Raw Normal View History

2020-01-31 05:37:59 +00:00
package common
import (
2020-03-26 20:58:39 +00:00
"context"
2020-02-08 20:04:20 +00:00
"fmt"
2020-01-31 05:37:59 +00:00
"github.com/rancher/apiserver/pkg/types"
2020-01-31 05:37:59 +00:00
"github.com/rancher/steve/pkg/attributes"
2020-02-08 20:04:20 +00:00
"github.com/rancher/wrangler/pkg/ratelimit"
"k8s.io/apimachinery/pkg/apis/meta/internalversion"
2020-01-31 05:37:59 +00:00
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/runtime/serializer"
"k8s.io/client-go/rest"
)
type DynamicColumns struct {
client *rest.RESTClient
}
2020-02-08 20:04:20 +00:00
type ColumnDefinition struct {
metav1.TableColumnDefinition `json:",inline"`
Field string `json:"field,omitempty"`
}
2020-01-31 05:37:59 +00:00
func NewDynamicColumns(config *rest.Config) (*DynamicColumns, error) {
c, err := newClient(config)
if err != nil {
return nil, err
}
return &DynamicColumns{
client: c,
}, nil
}
2020-03-26 20:58:39 +00:00
func (d *DynamicColumns) SetColumns(ctx context.Context, schema *types.APISchema) error {
2020-01-31 05:37:59 +00:00
if attributes.Columns(schema) != nil {
return nil
}
gvr := attributes.GVR(schema)
if gvr.Resource == "" {
return nil
}
r := d.client.Get()
if gvr.Group == "" {
r.Prefix("api")
} else {
r.Prefix("apis", gvr.Group)
}
r.Prefix(gvr.Version)
r.Prefix(gvr.Resource)
2020-02-08 20:04:20 +00:00
r.VersionedParams(&metav1.ListOptions{
Limit: 1,
}, metav1.ParameterCodec)
2020-01-31 05:37:59 +00:00
2020-03-26 20:58:39 +00:00
obj, err := r.Do(ctx).Get()
2020-01-31 05:37:59 +00:00
if err != nil {
attributes.SetTable(schema, false)
2020-02-08 20:04:20 +00:00
return nil
2020-01-31 05:37:59 +00:00
}
t, ok := obj.(*metav1.Table)
if !ok {
return nil
}
2020-02-08 20:04:20 +00:00
if len(t.ColumnDefinitions) > 0 {
var cols []ColumnDefinition
for i, colDef := range t.ColumnDefinitions {
cols = append(cols, ColumnDefinition{
TableColumnDefinition: colDef,
Field: fmt.Sprintf("$.metadata.fields[%d]", i),
})
}
2020-01-31 05:37:59 +00:00
attributes.SetColumns(schema, cols)
}
return nil
}
func newClient(config *rest.Config) (*rest.RESTClient, error) {
scheme := runtime.NewScheme()
2020-02-08 20:04:20 +00:00
if err := internalversion.AddToScheme(scheme); err != nil {
return nil, err
}
2020-01-31 05:37:59 +00:00
if err := metav1.AddMetaToScheme(scheme); err != nil {
return nil, err
}
if err := metav1beta1.AddMetaToScheme(scheme); err != nil {
return nil, err
}
config = rest.CopyConfig(config)
2020-02-08 20:04:20 +00:00
config.RateLimiter = ratelimit.None
2020-01-31 05:37:59 +00:00
config.UserAgent = rest.DefaultKubernetesUserAgent()
2020-02-08 20:04:20 +00:00
config.AcceptContentTypes = "application/json;as=Table;v=v1;g=meta.k8s.io"
2020-01-31 05:37:59 +00:00
config.GroupVersion = &schema.GroupVersion{}
config.NegotiatedSerializer = serializer.NewCodecFactory(scheme)
config.APIPath = "/"
return rest.RESTClientFor(config)
}