@@ -198,3 +198,83 @@ func (s base64Serializer) Decode(data []byte, defaults *unversioned.GroupVersion
198
198
}
199
199
return s .Serializer .Decode (out [:n ], defaults , into )
200
200
}
201
+
202
+ var (
203
+ // InternalGroupVersioner will always prefer the internal version for a given group version kind.
204
+ InternalGroupVersioner GroupVersioner = internalGroupVersioner {}
205
+ // DisabledGroupVersioner will reject all kinds passed to it.
206
+ DisabledGroupVersioner GroupVersioner = disabledGroupVersioner {}
207
+ )
208
+
209
+ type internalGroupVersioner struct {}
210
+
211
+ // KindForGroupVersionKinds returns an internal Kind if one is found, or converts the first provided kind to the internal version.
212
+ func (internalGroupVersioner ) KindForGroupVersionKinds (kinds []unversioned.GroupVersionKind ) (unversioned.GroupVersionKind , bool ) {
213
+ for _ , kind := range kinds {
214
+ if kind .Version == APIVersionInternal {
215
+ return kind , true
216
+ }
217
+ }
218
+ for _ , kind := range kinds {
219
+ return unversioned.GroupVersionKind {Group : kind .Group , Version : APIVersionInternal , Kind : kind .Kind }, true
220
+ }
221
+ return unversioned.GroupVersionKind {}, false
222
+ }
223
+
224
+ type disabledGroupVersioner struct {}
225
+
226
+ // KindForGroupVersionKinds returns false for any input.
227
+ func (disabledGroupVersioner ) KindForGroupVersionKinds (kinds []unversioned.GroupVersionKind ) (unversioned.GroupVersionKind , bool ) {
228
+ return unversioned.GroupVersionKind {}, false
229
+ }
230
+
231
+ // GroupVersioners implements GroupVersioner and resolves to the first exact match for any kind.
232
+ type GroupVersioners []GroupVersioner
233
+
234
+ // KindForGroupVersionKinds returns the first match of any of the group versioners, or false if no match occured.
235
+ func (gvs GroupVersioners ) KindForGroupVersionKinds (kinds []unversioned.GroupVersionKind ) (unversioned.GroupVersionKind , bool ) {
236
+ for _ , gv := range gvs {
237
+ target , ok := gv .KindForGroupVersionKinds (kinds )
238
+ if ! ok {
239
+ continue
240
+ }
241
+ return target , true
242
+ }
243
+ return unversioned.GroupVersionKind {}, false
244
+ }
245
+
246
+ // Assert that unversioned.GroupVersion and GroupVersions implement GroupVersioner
247
+ var _ GroupVersioner = unversioned.GroupVersion {}
248
+ var _ GroupVersioner = unversioned.GroupVersions {}
249
+ var _ GroupVersioner = multiGroupVersioner {}
250
+
251
+ type multiGroupVersioner struct {
252
+ target unversioned.GroupVersion
253
+ acceptedGroupKinds []unversioned.GroupKind
254
+ }
255
+
256
+ // NewMultiGroupVersioner returns the provided group version for any kind that matches one of the provided group kinds.
257
+ // Kind may be empty in the provided group kind, in which case any kind will match.
258
+ func NewMultiGroupVersioner (gv unversioned.GroupVersion , groupKinds ... unversioned.GroupKind ) GroupVersioner {
259
+ if len (groupKinds ) == 0 || (len (groupKinds ) == 1 && groupKinds [0 ].Group == gv .Group ) {
260
+ return gv
261
+ }
262
+ return multiGroupVersioner {target : gv , acceptedGroupKinds : groupKinds }
263
+ }
264
+
265
+ // KindForGroupVersionKinds returns the target group version if any kind matches any of the original group kinds. It will
266
+ // use the originating kind where possible.
267
+ func (v multiGroupVersioner ) KindForGroupVersionKinds (kinds []unversioned.GroupVersionKind ) (unversioned.GroupVersionKind , bool ) {
268
+ for _ , src := range kinds {
269
+ for _ , kind := range v .acceptedGroupKinds {
270
+ if kind .Group != src .Group {
271
+ continue
272
+ }
273
+ if len (kind .Kind ) > 0 && kind .Kind != src .Kind {
274
+ continue
275
+ }
276
+ return v .target .WithKind (src .Kind ), true
277
+ }
278
+ }
279
+ return unversioned.GroupVersionKind {}, false
280
+ }
0 commit comments