Skip to content

Commit 0000000

Browse files
xuzhenglunpull[bot]
authored andcommitted
add test coverage for cohabitating resources in StroageFactory
1 parent 76797a3 commit 0000000

File tree

2 files changed

+140
-19
lines changed

2 files changed

+140
-19
lines changed

staging/src/k8s.io/apiserver/pkg/apis/example2/install/install.go

+2
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@ import (
2222
"k8s.io/apimachinery/pkg/runtime"
2323
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
2424
"k8s.io/apiserver/pkg/apis/example"
25+
"k8s.io/apiserver/pkg/apis/example2"
2526
example2v1 "k8s.io/apiserver/pkg/apis/example2/v1"
2627
)
2728

2829
// Install registers the API group and adds types to a scheme
2930
func Install(scheme *runtime.Scheme) {
3031
utilruntime.Must(example.AddToScheme(scheme))
32+
utilruntime.Must(example2.AddToScheme(scheme))
3133
utilruntime.Must(example2v1.AddToScheme(scheme))
3234
utilruntime.Must(scheme.SetVersionPriority(example2v1.SchemeGroupVersion))
3335
}

staging/src/k8s.io/apiserver/pkg/server/storage/storage_factory_test.go

+138-19
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ import (
3030
"k8s.io/apiserver/pkg/apis/example"
3131
exampleinstall "k8s.io/apiserver/pkg/apis/example/install"
3232
examplev1 "k8s.io/apiserver/pkg/apis/example/v1"
33+
"k8s.io/apiserver/pkg/apis/example2"
34+
example2install "k8s.io/apiserver/pkg/apis/example2/install"
3335
"k8s.io/apiserver/pkg/storage/storagebackend"
3436
"k8s.io/apiserver/pkg/util/version"
3537
)
@@ -52,6 +54,7 @@ func init() {
5254
)
5355

5456
exampleinstall.Install(scheme)
57+
example2install.Install(scheme)
5558
}
5659

5760
type fakeNegotiater struct {
@@ -107,28 +110,144 @@ func (n *fakeNegotiater) DecoderToVersion(serializer runtime.Decoder, gv runtime
107110
return n.serializer
108111
}
109112

110-
func TestConfigurableStorageFactory(t *testing.T) {
111-
ns := &fakeNegotiater{types: []string{"test/test"}}
112-
f := NewDefaultStorageFactory(storagebackend.Config{}, "test/test", ns, NewDefaultResourceEncodingConfig(scheme), NewResourceConfig(), nil)
113-
f.AddCohabitatingResources(example.Resource("test"), schema.GroupResource{Resource: "test2", Group: "2"})
114-
called := false
115-
testEncoderChain := func(e runtime.Encoder) runtime.Encoder {
116-
called = true
117-
return e
118-
}
119-
f.AddSerializationChains(testEncoderChain, nil, example.Resource("test"))
120-
f.SetEtcdLocation(example.Resource("*"), []string{"/server2"})
121-
f.SetEtcdPrefix(example.Resource("test"), "/prefix_for_test")
113+
type newStorageCodecFn func(opts StorageCodecConfig) (codec runtime.Codec, encodeVersioner runtime.GroupVersioner, err error)
114+
type newStorageCodecRecorder struct {
115+
opt StorageCodecConfig
116+
}
122117

123-
config, err := f.NewConfig(example.Resource("test"), nil)
124-
if err != nil {
125-
t.Fatal(err)
118+
func (c *newStorageCodecRecorder) Decorators(f newStorageCodecFn) newStorageCodecFn {
119+
return func(opts StorageCodecConfig) (codec runtime.Codec, encodeVersioner runtime.GroupVersioner, err error) {
120+
c.opt = opts
121+
return f(opts)
126122
}
127-
if config.Prefix != "/prefix_for_test" || !reflect.DeepEqual(config.Transport.ServerList, []string{"/server2"}) {
128-
t.Errorf("unexpected config %#v", config)
123+
}
124+
125+
func TestConfigurableStorageFactory(t *testing.T) {
126+
var emptyResource schema.GroupResource
127+
128+
testCases := []struct {
129+
name string
130+
enabledResources []schema.GroupVersionResource
131+
overrideResource schema.GroupResource
132+
cohabitatingResources []schema.GroupResource
133+
resourceForConfig schema.GroupResource
134+
exampleForConfig runtime.Object
135+
wantStorageVersion schema.GroupVersion
136+
}{
137+
{
138+
name: "config resource is primary cohabitating resources",
139+
enabledResources: []schema.GroupVersionResource{
140+
example.Resource("replicasets").WithVersion("v1"),
141+
example2.Resource("replicasets").WithVersion("v1"),
142+
},
143+
cohabitatingResources: []schema.GroupResource{example.Resource("replicasets"), example2.Resource("replicasets")},
144+
resourceForConfig: example.Resource("replicasets"),
145+
exampleForConfig: &example.ReplicaSet{},
146+
wantStorageVersion: schema.GroupVersion{Group: example.GroupName, Version: "v1"},
147+
},
148+
{
149+
name: "config resource is secondary cohabitating resources",
150+
enabledResources: []schema.GroupVersionResource{
151+
example.Resource("replicasets").WithVersion("v1"),
152+
example2.Resource("replicasets").WithVersion("v1"),
153+
},
154+
cohabitatingResources: []schema.GroupResource{example.Resource("replicasets"), example2.Resource("replicasets")},
155+
resourceForConfig: example2.Resource("replicasets"),
156+
exampleForConfig: &example.ReplicaSet{},
157+
wantStorageVersion: schema.GroupVersion{Group: example.GroupName, Version: "v1"},
158+
},
159+
{
160+
name: "config resource is primary cohabitating resources and not enabled",
161+
enabledResources: []schema.GroupVersionResource{
162+
// example.Resource("replicasets").WithVersion("v1"), // <- disabled
163+
example2.Resource("replicasets").WithVersion("v1"),
164+
},
165+
cohabitatingResources: []schema.GroupResource{example.Resource("replicasets"), example2.Resource("replicasets")},
166+
resourceForConfig: example.Resource("replicasets"),
167+
exampleForConfig: &example.ReplicaSet{},
168+
wantStorageVersion: schema.GroupVersion{Group: example2.GroupName, Version: "v1"},
169+
},
170+
{
171+
name: "config resource is secondary cohabitating resources and not enabled",
172+
enabledResources: []schema.GroupVersionResource{
173+
example.Resource("replicasets").WithVersion("v1"),
174+
// example2.Resource("replicasets").WithVersion("v1"), // <- disabled
175+
},
176+
cohabitatingResources: []schema.GroupResource{example.Resource("replicasets"), example2.Resource("replicasets")},
177+
resourceForConfig: example2.Resource("replicasets"),
178+
exampleForConfig: &example.ReplicaSet{},
179+
wantStorageVersion: schema.GroupVersion{Group: example.GroupName, Version: "v1"},
180+
},
181+
{
182+
name: "override config for one resource of group",
183+
enabledResources: []schema.GroupVersionResource{
184+
example.Resource("replicasets").WithVersion("v1"),
185+
example2.Resource("replicasets").WithVersion("v1"),
186+
},
187+
overrideResource: example.Resource("replicasets"),
188+
resourceForConfig: example.Resource("replicasets"),
189+
exampleForConfig: &example.ReplicaSet{},
190+
wantStorageVersion: schema.GroupVersion{Group: example.GroupName, Version: "v1"},
191+
},
192+
{
193+
name: "override config for all resource of group",
194+
enabledResources: []schema.GroupVersionResource{
195+
example.Resource("replicasets").WithVersion("v1"),
196+
example2.Resource("replicasets").WithVersion("v1"),
197+
},
198+
cohabitatingResources: []schema.GroupResource{example.Resource("replicasets"), example2.Resource("replicasets")},
199+
overrideResource: example.Resource("*"),
200+
resourceForConfig: example.Resource("replicasets"),
201+
exampleForConfig: &example.ReplicaSet{},
202+
wantStorageVersion: schema.GroupVersion{Group: example.GroupName, Version: "v1"},
203+
},
129204
}
130-
if !called {
131-
t.Errorf("expected encoder chain to be called")
205+
206+
for _, test := range testCases {
207+
t.Run(test.name, func(t *testing.T) {
208+
ns := &fakeNegotiater{types: []string{"test/test"}}
209+
resourceConfig := NewResourceConfig()
210+
resourceConfig.EnableResources(test.enabledResources...)
211+
212+
f := NewDefaultStorageFactory(storagebackend.Config{}, "test/test", ns, NewDefaultResourceEncodingConfig(scheme), resourceConfig, nil)
213+
214+
encoderChainCalled := false
215+
recorder := newStorageCodecRecorder{}
216+
217+
f.newStorageCodecFn = recorder.Decorators(f.newStorageCodecFn)
218+
f.AddCohabitatingResources(test.cohabitatingResources...)
219+
220+
if test.overrideResource != emptyResource {
221+
testEncoderChain := func(e runtime.Encoder) runtime.Encoder {
222+
encoderChainCalled = true
223+
return e
224+
}
225+
226+
f.SetEtcdLocation(test.overrideResource, []string{"/server2"})
227+
f.AddSerializationChains(testEncoderChain, nil, test.overrideResource)
228+
f.SetEtcdPrefix(test.overrideResource, "/prefix_for_test")
229+
}
230+
231+
config, err := f.NewConfig(test.resourceForConfig, test.exampleForConfig)
232+
if err != nil {
233+
t.Fatal(err)
234+
}
235+
236+
// check override resources config
237+
if test.overrideResource != emptyResource {
238+
if config.Prefix != "/prefix_for_test" || !reflect.DeepEqual(config.Transport.ServerList, []string{"/server2"}) {
239+
t.Errorf("unexpected config %#v", config)
240+
}
241+
if !encoderChainCalled {
242+
t.Errorf("expected encoder chain to be called")
243+
}
244+
}
245+
246+
// check cohabitating resources config
247+
if recorder.opt.StorageVersion != test.wantStorageVersion {
248+
t.Errorf("unexpected encoding version %#v, but expected %#v", recorder.opt.StorageVersion, test.wantStorageVersion)
249+
}
250+
})
132251
}
133252
}
134253

0 commit comments

Comments
 (0)