@@ -30,6 +30,8 @@ import (
30
30
"k8s.io/apiserver/pkg/apis/example"
31
31
exampleinstall "k8s.io/apiserver/pkg/apis/example/install"
32
32
examplev1 "k8s.io/apiserver/pkg/apis/example/v1"
33
+ "k8s.io/apiserver/pkg/apis/example2"
34
+ example2install "k8s.io/apiserver/pkg/apis/example2/install"
33
35
"k8s.io/apiserver/pkg/storage/storagebackend"
34
36
"k8s.io/apiserver/pkg/util/version"
35
37
)
@@ -52,6 +54,7 @@ func init() {
52
54
)
53
55
54
56
exampleinstall .Install (scheme )
57
+ example2install .Install (scheme )
55
58
}
56
59
57
60
type fakeNegotiater struct {
@@ -107,28 +110,144 @@ func (n *fakeNegotiater) DecoderToVersion(serializer runtime.Decoder, gv runtime
107
110
return n .serializer
108
111
}
109
112
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
+ }
122
117
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 )
126
122
}
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
+ },
129
204
}
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
+ })
132
251
}
133
252
}
134
253
0 commit comments