From 5f5604be87b84b1026ce26ce5ca62d24f960202f Mon Sep 17 00:00:00 2001 From: yue9944882 <291271447@qq.com> Date: Tue, 8 Feb 2022 17:17:23 +0800 Subject: [PATCH] plumb parent ctx if applicable Signed-off-by: yue9944882 <291271447@qq.com> resend-feat: fix parent ctx Signed-off-by: yue9944882 <291271447@qq.com> --- pkg/builder/builder_resource.go | 2 +- pkg/builder/rest/provider.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/pkg/builder/builder_resource.go b/pkg/builder/builder_resource.go index 4a8fb67..7026058 100644 --- a/pkg/builder/builder_resource.go +++ b/pkg/builder/builder_resource.go @@ -192,7 +192,7 @@ func (a *Server) withSubResourceIfExists(obj resource.Object, parentStorageProvi for _, sub := range sgs.GetArbitrarySubResources() { sub := sub subResourceGVR := parentGVR.GroupVersion().WithResource(parentGVR.Resource + "/" + sub.SubResourceName()) - a.forGroupVersionSubResource(subResourceGVR, parentStorageProvider, rest.StaticHandlerProvider{Storage: sub}.Get) + a.forGroupVersionSubResource(subResourceGVR, parentStorageProvider, rest.ParentStaticHandlerProvider{Storage: sub}.Get) } } } diff --git a/pkg/builder/rest/provider.go b/pkg/builder/rest/provider.go index a5a6169..ca92c37 100644 --- a/pkg/builder/rest/provider.go +++ b/pkg/builder/rest/provider.go @@ -17,10 +17,14 @@ limitations under the License. package rest import ( + "context" + + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" "sigs.k8s.io/apiserver-runtime/internal/sample-apiserver/pkg/apiserver" + contextutil "sigs.k8s.io/apiserver-runtime/pkg/util/context" ) // ResourceHandlerProvider provides a request handler for a resource @@ -35,3 +39,31 @@ type StaticHandlerProvider struct { // TODO: privatize func (p StaticHandlerProvider) Get(s *runtime.Scheme, g generic.RESTOptionsGetter) (rest.Storage, error) { return p.Storage, nil } + +// ParentStaticHandlerProvider returns itself as the request handler, but with the parent +// storage plumbed in the context. +type ParentStaticHandlerProvider struct { + rest.Storage +} + +// Get returns itself as the handler +func (p ParentStaticHandlerProvider) Get(s *runtime.Scheme, g generic.RESTOptionsGetter) (rest.Storage, error) { + if getter, isGetter := p.Storage.(rest.Getter); isGetter { + return parentPlumbedStorageProvider{delegate: getter}, nil + } + return p.Storage, nil +} + +var _ rest.Getter = &parentPlumbedStorageProvider{} + +type parentPlumbedStorageProvider struct { + delegate rest.Getter +} + +func (p parentPlumbedStorageProvider) New() runtime.Object { + return p.delegate.(rest.Storage).New() +} + +func (p parentPlumbedStorageProvider) Get(ctx context.Context, name string, options *v1.GetOptions) (runtime.Object, error) { + return p.delegate.Get(contextutil.WithParentStorage(ctx, p.delegate.(rest.Storage)), name, options) +}