Skip to content

Commit 6ec7cc3

Browse files
authored
Merge pull request #64 from yue9944882/fix/parent-storage-stackoverflow
Fix: Parent storage stackoverflow
2 parents 9fe5ff1 + a40af94 commit 6ec7cc3

File tree

2 files changed

+67
-11
lines changed

2 files changed

+67
-11
lines changed

pkg/builder/builder_resource.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,10 @@ func (a *Server) withSubResourceIfExists(obj resource.Object, parentStorageProvi
192192
for _, sub := range sgs.GetArbitrarySubResources() {
193193
sub := sub
194194
subResourceGVR := parentGVR.GroupVersion().WithResource(parentGVR.Resource + "/" + sub.SubResourceName())
195-
a.forGroupVersionSubResource(subResourceGVR, parentStorageProvider, rest.ParentStaticHandlerProvider{Storage: sub}.Get)
195+
a.forGroupVersionSubResource(subResourceGVR, parentStorageProvider, rest.ParentStaticHandlerProvider{
196+
Storage: sub,
197+
ParentProvider: parentStorageProvider,
198+
}.Get)
196199
}
197200
}
198201
}

pkg/builder/rest/provider.go

Lines changed: 63 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ package rest
1919
import (
2020
"context"
2121

22-
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
22+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2323
"k8s.io/apimachinery/pkg/runtime"
2424
"k8s.io/apiserver/pkg/registry/generic"
2525
"k8s.io/apiserver/pkg/registry/rest"
@@ -44,26 +44,79 @@ func (p StaticHandlerProvider) Get(s *runtime.Scheme, g generic.RESTOptionsGette
4444
// storage plumbed in the context.
4545
type ParentStaticHandlerProvider struct {
4646
rest.Storage
47+
ParentProvider ResourceHandlerProvider
4748
}
4849

4950
// Get returns itself as the handler
5051
func (p ParentStaticHandlerProvider) Get(s *runtime.Scheme, g generic.RESTOptionsGetter) (rest.Storage, error) {
51-
if getter, isGetter := p.Storage.(rest.Getter); isGetter {
52-
return parentPlumbedStorageProvider{delegate: getter}, nil
52+
parentStorage, err := p.ParentProvider(s, g)
53+
if err != nil {
54+
return nil, err
55+
}
56+
getter, isGetter := p.Storage.(rest.Getter)
57+
updater, isUpdater := p.Storage.(rest.Updater)
58+
switch {
59+
case isGetter && isUpdater:
60+
return parentPlumbedStorageGetterUpdaterProvider{
61+
getter: getter,
62+
updater: updater,
63+
parentStorage: parentStorage,
64+
}, nil
65+
case isGetter:
66+
return parentPlumbedStorageGetterProvider{
67+
delegate: getter,
68+
parentStorage: parentStorage,
69+
}, nil
5370
}
5471
return p.Storage, nil
5572
}
5673

57-
var _ rest.Getter = &parentPlumbedStorageProvider{}
74+
var _ rest.Getter = &parentPlumbedStorageGetterProvider{}
75+
76+
type parentPlumbedStorageGetterProvider struct {
77+
delegate rest.Getter
78+
parentStorage rest.Storage
79+
}
80+
81+
func (p parentPlumbedStorageGetterProvider) New() runtime.Object {
82+
return p.parentStorage.New()
83+
}
84+
85+
func (p parentPlumbedStorageGetterProvider) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) {
86+
return p.delegate.Get(contextutil.WithParentStorage(ctx, p.parentStorage), name, options)
87+
}
88+
89+
var _ rest.Getter = &parentPlumbedStorageGetterUpdaterProvider{}
90+
var _ rest.Updater = &parentPlumbedStorageGetterUpdaterProvider{}
91+
92+
type parentPlumbedStorageGetterUpdaterProvider struct {
93+
getter rest.Getter
94+
updater rest.Updater
95+
parentStorage rest.Storage
96+
}
5897

59-
type parentPlumbedStorageProvider struct {
60-
delegate rest.Getter
98+
func (p parentPlumbedStorageGetterUpdaterProvider) New() runtime.Object {
99+
return p.parentStorage.New()
61100
}
62101

63-
func (p parentPlumbedStorageProvider) New() runtime.Object {
64-
return p.delegate.(rest.Storage).New()
102+
func (p parentPlumbedStorageGetterUpdaterProvider) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) {
103+
return p.getter.Get(contextutil.WithParentStorage(ctx, p.parentStorage), name, options)
65104
}
66105

67-
func (p parentPlumbedStorageProvider) Get(ctx context.Context, name string, options *v1.GetOptions) (runtime.Object, error) {
68-
return p.delegate.Get(contextutil.WithParentStorage(ctx, p.delegate.(rest.Storage)), name, options)
106+
func (p parentPlumbedStorageGetterUpdaterProvider) Update(
107+
ctx context.Context,
108+
name string,
109+
objInfo rest.UpdatedObjectInfo,
110+
createValidation rest.ValidateObjectFunc,
111+
updateValidation rest.ValidateObjectUpdateFunc,
112+
forceAllowCreate bool,
113+
options *metav1.UpdateOptions) (runtime.Object, bool, error) {
114+
return p.updater.Update(
115+
contextutil.WithParentStorage(ctx, p.parentStorage),
116+
name,
117+
objInfo,
118+
createValidation,
119+
updateValidation,
120+
forceAllowCreate,
121+
options)
69122
}

0 commit comments

Comments
 (0)