// newCodecFactory is a helper for testing that allows a different metafactory to be specified. func newCodecFactory(scheme *runtime.Scheme, serializers []serializerType) CodecFactory { decoders := make([]runtime.Decoder, 0, len(serializers)) accepts := []string{} alreadyAccepted := make(map[string]struct{}) var legacySerializer runtime.Serializer for _, d := range serializers { decoders = append(decoders, d.Serializer) for _, mediaType := range d.AcceptContentTypes { if _, ok := alreadyAccepted[mediaType]; ok { continue } alreadyAccepted[mediaType] = struct{}{} accepts = append(accepts, mediaType) if mediaType == "application/json" { legacySerializer = d.Serializer } } } if legacySerializer == nil { legacySerializer = serializers[0].Serializer } streamAccepts := []string{} alreadyAccepted = make(map[string]struct{}) for _, d := range serializers { if len(d.StreamContentType) == 0 { continue } for _, mediaType := range d.AcceptStreamContentTypes { if _, ok := alreadyAccepted[mediaType]; ok { continue } alreadyAccepted[mediaType] = struct{}{} streamAccepts = append(streamAccepts, mediaType) } } return CodecFactory{ scheme: scheme, serializers: serializers, universal: recognizer.NewDecoder(decoders...), accepts: accepts, streamingAccepts: streamAccepts, legacySerializer: legacySerializer, } }
// StorageCodec returns the codec for the API version to store in etcd, as set by the // KUBE_TEST_API_STORAGE_TYPE env var. func (g TestGroup) StorageCodec() runtime.Codec { s := storageSerializer.Serializer if s == nil { return api.Codecs.LegacyCodec(g.externalGroupVersion) } // etcd2 only supports string data - we must wrap any result before returning // TODO: remove for etcd3 / make parameterizable if !storageSerializer.EncodesAsText { s = runtime.NewBase64Serializer(s) } ds := recognizer.NewDecoder(s, api.Codecs.UniversalDeserializer()) return api.Codecs.CodecForVersions(s, ds, unversioned.GroupVersions{g.externalGroupVersion}, nil) }