Skip to content

Commit

Permalink
Merge pull request #62 from yue9944882/feat/storage-provider
Browse files Browse the repository at this point in the history
Resend: Feat - Plumb parent storage for arbitrary subresource
  • Loading branch information
k8s-ci-robot committed Feb 8, 2022
2 parents 0163317 + 5f5604b commit 9fe5ff1
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 1 deletion.
2 changes: 1 addition & 1 deletion pkg/builder/builder_resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
}
32 changes: 32 additions & 0 deletions pkg/builder/rest/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
}

0 comments on commit 9fe5ff1

Please sign in to comment.