From c4fc6d03dd4f334ad42ac6703b5a128b87f149d0 Mon Sep 17 00:00:00 2001 From: yue9944882 <291271447@qq.com> Date: Sun, 3 Apr 2022 17:12:20 +0800 Subject: [PATCH 1/2] feat: kine fully upgrade Signed-off-by: yue9944882 <291271447@qq.com> --- pkg/builder/rest/rest.go | 15 +++++++++------ pkg/builder/rest/rest_subresource.go | 1 + pkg/experimental/storage/mysql/kine.go | 16 ++++++++++++---- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/pkg/builder/rest/rest.go b/pkg/builder/rest/rest.go index 8255f28..5c62aad 100644 --- a/pkg/builder/rest/rest.go +++ b/pkg/builder/rest/rest.go @@ -39,7 +39,7 @@ func New(obj resource.Object) ResourceHandlerProvider { ObjectTyper: scheme, TableConvertor: rest.NewDefaultTableConvertor(gvr.GroupResource()), } - return newStore(obj.New, obj.NewList, gvr, s, optsGetter, nil) + return newStore(scheme, obj.New, obj.NewList, gvr, s, optsGetter, nil) } } @@ -47,12 +47,12 @@ func New(obj resource.Object) ResourceHandlerProvider { func NewWithStrategy(obj resource.Object, s Strategy) ResourceHandlerProvider { return func(scheme *runtime.Scheme, optsGetter generic.RESTOptionsGetter) (rest.Storage, error) { gvr := obj.GetGroupVersionResource() - return newStore(obj.New, obj.NewList, gvr, s, optsGetter, nil) + return newStore(scheme, obj.New, obj.NewList, gvr, s, optsGetter, nil) } } // StoreFn defines a function which modifies the Store before it is initialized. -type StoreFn func(*genericregistry.Store, *generic.StoreOptions) +type StoreFn func(*runtime.Scheme, *genericregistry.Store, *generic.StoreOptions) // NewWithFn returns a new etcd backed request handler, applying the StoreFn to the Store. func NewWithFn(obj resource.Object, fn StoreFn) ResourceHandlerProvider { @@ -63,13 +63,15 @@ func NewWithFn(obj resource.Object, fn StoreFn) ResourceHandlerProvider { ObjectTyper: scheme, TableConvertor: rest.NewDefaultTableConvertor(gvr.GroupResource()), } - return newStore(obj.New, obj.NewList, gvr, s, optsGetter, fn) + return newStore(scheme, obj.New, obj.NewList, gvr, s, optsGetter, fn) } } // newStore returns a RESTStorage object that will work against API services. func newStore( - single, list func() runtime.Object, gvr schema.GroupVersionResource, + scheme *runtime.Scheme, + single, list func() runtime.Object, + gvr schema.GroupVersionResource, s Strategy, optsGetter generic.RESTOptionsGetter, fn StoreFn) (*genericregistry.Store, error) { store := &genericregistry.Store{ NewFunc: single, @@ -80,11 +82,12 @@ func newStore( CreateStrategy: s, UpdateStrategy: s, DeleteStrategy: s, + StorageVersioner: gvr.GroupVersion(), } options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: GetAttrs} if fn != nil { - fn(store, options) + fn(scheme, store, options) } if err := store.CompleteWithOptions(options); err != nil { return nil, err diff --git a/pkg/builder/rest/rest_subresource.go b/pkg/builder/rest/rest_subresource.go index 985e7d5..6f0df09 100644 --- a/pkg/builder/rest/rest_subresource.go +++ b/pkg/builder/rest/rest_subresource.go @@ -29,6 +29,7 @@ func NewSubResourceWithStrategy(parent resource.Object, subResource resource.Sub fullResourceName := parent.GetGroupVersionResource().Resource + "/" + subResource.SubResourceName() gvr := parent.GetGroupVersionResource().GroupVersion().WithResource(fullResourceName) return newStore( + scheme, parent.New, parent.NewList, gvr, diff --git a/pkg/experimental/storage/mysql/kine.go b/pkg/experimental/storage/mysql/kine.go index 96f411a..5e40911 100644 --- a/pkg/experimental/storage/mysql/kine.go +++ b/pkg/experimental/storage/mysql/kine.go @@ -4,6 +4,8 @@ package mysql import ( "context" "fmt" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" "time" "github.com/k3s-io/kine/pkg/endpoint" @@ -35,15 +37,19 @@ func NewMysqlStorageProvider(host string, port int32, username, password, databa port, database) - return func(s *genericregistry.Store, options *generic.StoreOptions) { + return func(scheme *runtime.Scheme, s *genericregistry.Store, options *generic.StoreOptions) { options.RESTOptions = &kineProxiedRESTOptionsGetter{ - dsn: dsn, + scheme: scheme, + dsn: dsn, + groupVersioner: s.StorageVersioner, } } } type kineProxiedRESTOptionsGetter struct { - dsn string + scheme *runtime.Scheme + dsn string + groupVersioner runtime.GroupVersioner } // GetRESTOptions implements RESTOptionsGetter interface. @@ -54,6 +60,8 @@ func (g *kineProxiedRESTOptionsGetter) GetRESTOptions(resource schema.GroupResou if err != nil { return generic.RESTOptions{}, err } + codec := serializer.NewCodecFactory(g.scheme). + CodecForVersions(nil, nil, g.groupVersioner, g.groupVersioner) restOptions := generic.RESTOptions{ ResourcePrefix: resource.String(), Decorator: genericregistry.StorageWithCacher(), @@ -61,11 +69,11 @@ func (g *kineProxiedRESTOptionsGetter) GetRESTOptions(resource schema.GroupResou DeleteCollectionWorkers: 1, CountMetricPollPeriod: time.Minute, StorageObjectCountTracker: request.NewStorageObjectCountTracker(context.Background().Done()), - StorageConfig: &storagebackend.ConfigForResource{ GroupResource: resource, Config: storagebackend.Config{ Prefix: "/kine/", + Codec: codec, Transport: storagebackend.TransportConfig{ ServerList: etcdConfig.Endpoints, TrustedCAFile: etcdConfig.TLSConfig.CAFile, From b92d8aa148655431188ab40e251a7079f0b85a38 Mon Sep 17 00:00:00 2001 From: yue9944882 <291271447@qq.com> Date: Sun, 3 Apr 2022 17:19:33 +0800 Subject: [PATCH 2/2] force json serializer Signed-off-by: yue9944882 <291271447@qq.com> --- pkg/experimental/storage/mysql/kine.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pkg/experimental/storage/mysql/kine.go b/pkg/experimental/storage/mysql/kine.go index 5e40911..69a1c3b 100644 --- a/pkg/experimental/storage/mysql/kine.go +++ b/pkg/experimental/storage/mysql/kine.go @@ -4,12 +4,13 @@ package mysql import ( "context" "fmt" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/serializer" "time" "github.com/k3s-io/kine/pkg/endpoint" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/apimachinery/pkg/runtime/serializer/json" "k8s.io/apiserver/pkg/registry/generic" genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" "k8s.io/apiserver/pkg/storage/storagebackend" @@ -60,8 +61,9 @@ func (g *kineProxiedRESTOptionsGetter) GetRESTOptions(resource schema.GroupResou if err != nil { return generic.RESTOptions{}, err } + s := json.NewSerializer(json.DefaultMetaFactory, g.scheme, g.scheme, false) codec := serializer.NewCodecFactory(g.scheme). - CodecForVersions(nil, nil, g.groupVersioner, g.groupVersioner) + CodecForVersions(s, s, g.groupVersioner, g.groupVersioner) restOptions := generic.RESTOptions{ ResourcePrefix: resource.String(), Decorator: genericregistry.StorageWithCacher(),