Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove EncodeToStream(..., []unversioned.GroupVersion) #27192

Merged
merged 1 commit into from
Jun 19, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion pkg/api/serialization_proto_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ func TestUniversalDeserializer(t *testing.T) {
t.Fatal(mediaType)
}
buf := &bytes.Buffer{}
if err := e.EncodeToStream(expected, buf); err != nil {
if err := e.Encode(expected, buf); err != nil {
t.Fatalf("%s: %v", mediaType, err)
}
obj, _, err := d.Decode(buf.Bytes(), &unversioned.GroupVersionKind{Kind: "Pod", Version: "v1"}, nil)
Expand Down
6 changes: 3 additions & 3 deletions pkg/api/serialization_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ func TestObjectWatchFraming(t *testing.T) {

// write a single object through the framer and back out
obj := &bytes.Buffer{}
if err := s.EncodeToStream(v1secret, obj); err != nil {
if err := s.Encode(v1secret, obj); err != nil {
t.Fatal(err)
}
out := &bytes.Buffer{}
Expand All @@ -330,13 +330,13 @@ func TestObjectWatchFraming(t *testing.T) {

// write a watch event through and back out
obj = &bytes.Buffer{}
if err := embedded.EncodeToStream(v1secret, obj); err != nil {
if err := embedded.Encode(v1secret, obj); err != nil {
t.Fatal(err)
}
event := &versioned.Event{Type: string(watch.Added)}
event.Object.Raw = obj.Bytes()
obj = &bytes.Buffer{}
if err := s.EncodeToStream(event, obj); err != nil {
if err := s.Encode(event, obj); err != nil {
t.Fatal(err)
}
out = &bytes.Buffer{}
Expand Down
8 changes: 4 additions & 4 deletions pkg/apiserver/apiserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -255,9 +255,9 @@ type stripVersionEncoder struct {
serializer runtime.Serializer
}

func (c stripVersionEncoder) EncodeToStream(obj runtime.Object, w io.Writer, overrides ...unversioned.GroupVersion) error {
func (c stripVersionEncoder) Encode(obj runtime.Object, w io.Writer) error {
buf := bytes.NewBuffer([]byte{})
err := c.encoder.EncodeToStream(obj, buf, overrides...)
err := c.encoder.Encode(obj, buf)
if err != nil {
return err
}
Expand All @@ -268,7 +268,7 @@ func (c stripVersionEncoder) EncodeToStream(obj runtime.Object, w io.Writer, ove
gvk.Group = ""
gvk.Version = ""
roundTrippedObj.GetObjectKind().SetGroupVersionKind(*gvk)
return c.serializer.EncodeToStream(roundTrippedObj, w)
return c.serializer.Encode(roundTrippedObj, w)
}

// StripVersionNegotiatedSerializer will return stripVersionEncoder when
Expand Down Expand Up @@ -443,7 +443,7 @@ func writeNegotiated(s runtime.NegotiatedSerializer, gv unversioned.GroupVersion
w.WriteHeader(statusCode)

encoder := s.EncoderForVersion(serializer, gv)
if err := encoder.EncodeToStream(object, w); err != nil {
if err := encoder.Encode(object, w); err != nil {
errorJSONFatal(err, encoder, w)
}
}
Expand Down
47 changes: 45 additions & 2 deletions pkg/apiserver/apiserver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2372,7 +2372,7 @@ func TestCreateChecksDecode(t *testing.T) {
client := http.Client{}

simple := &api.Pod{}
data, err := runtime.Encode(codec, simple, testGroupVersion)
data, err := runtime.Encode(testCodec, simple)
if err != nil {
t.Errorf("unexpected error: %v", err)
}
Expand Down Expand Up @@ -2598,7 +2598,7 @@ func TestUpdateChecksDecode(t *testing.T) {
client := http.Client{}

simple := &api.Pod{}
data, err := runtime.Encode(codec, simple, testGroupVersion)
data, err := runtime.Encode(testCodec, simple)
if err != nil {
t.Errorf("unexpected error: %v", err)
}
Expand Down Expand Up @@ -3293,3 +3293,46 @@ func readBodyOrDie(r io.Reader) []byte {
}
return body
}

// BenchmarkUpdateProtobuf measures the cost of processing an update on the server in proto
func BenchmarkUpdateProtobuf(b *testing.B) {
items := benchmarkItems()

simpleStorage := &SimpleRESTStorage{}
handler := handle(map[string]rest.Storage{"simples": simpleStorage})
server := httptest.NewServer(handler)
defer server.Close()
client := http.Client{}

dest, _ := url.Parse(server.URL)
dest.Path = "/" + prefix + "/" + newGroupVersion.Group + "/" + newGroupVersion.Version + "/namespaces/foo/simples/bar"
dest.RawQuery = ""

info, _ := api.Codecs.SerializerForMediaType("application/vnd.kubernetes.protobuf", nil)
e := api.Codecs.EncoderForVersion(info.Serializer, newGroupVersion)
data, err := runtime.Encode(e, &items[0])
if err != nil {
b.Fatal(err)
}

b.ResetTimer()
for i := 0; i < b.N; i++ {
request, err := http.NewRequest("PUT", dest.String(), bytes.NewReader(data))
if err != nil {
b.Fatalf("unexpected error: %v", err)
}
request.Header.Set("Accept", "application/vnd.kubernetes.protobuf")
request.Header.Set("Content-Type", "application/vnd.kubernetes.protobuf")
response, err := client.Do(request)
if err != nil {
b.Fatalf("unexpected error: %v", err)
}
if response.StatusCode != http.StatusBadRequest {
body, _ := ioutil.ReadAll(response.Body)
b.Fatalf("Unexpected response %#v\n%s", response, body)
}
_, _ = ioutil.ReadAll(response.Body)
response.Body.Close()
}
b.StopTimer()
}
6 changes: 3 additions & 3 deletions pkg/apiserver/watch.go
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ func (s *WatchServer) ServeHTTP(w http.ResponseWriter, req *http.Request) {

obj := event.Object
s.fixup(obj)
if err := s.embeddedEncoder.EncodeToStream(obj, buf); err != nil {
if err := s.embeddedEncoder.Encode(obj, buf); err != nil {
// unexpected error
utilruntime.HandleError(fmt.Errorf("unable to encode watch object: %v", err))
return
Expand Down Expand Up @@ -235,7 +235,7 @@ func (s *WatchServer) HandleWS(ws *websocket.Conn) {
}
obj := event.Object
s.fixup(obj)
if err := s.embeddedEncoder.EncodeToStream(obj, buf); err != nil {
if err := s.embeddedEncoder.Encode(obj, buf); err != nil {
// unexpected error
utilruntime.HandleError(fmt.Errorf("unable to encode watch object: %v", err))
return
Expand All @@ -248,7 +248,7 @@ func (s *WatchServer) HandleWS(ws *websocket.Conn) {

// the internal event will be versioned by the encoder
*internalEvent = versioned.InternalEvent(event)
if err := s.encoder.EncodeToStream(internalEvent, streamBuf); err != nil {
if err := s.encoder.Encode(internalEvent, streamBuf); err != nil {
// encoding error
utilruntime.HandleError(fmt.Errorf("unable to encode event: %v", err))
s.watching.Stop()
Expand Down
4 changes: 2 additions & 2 deletions pkg/client/typed/dynamic/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -253,8 +253,8 @@ func (dynamicCodec) Decode(data []byte, gvk *unversioned.GroupVersionKind, obj r
return obj, gvk, nil
}

func (dynamicCodec) EncodeToStream(obj runtime.Object, w io.Writer, overrides ...unversioned.GroupVersion) error {
return runtime.UnstructuredJSONScheme.EncodeToStream(obj, w, overrides...)
func (dynamicCodec) Encode(obj runtime.Object, w io.Writer) error {
return runtime.UnstructuredJSONScheme.Encode(obj, w)
}

// paramaterCodec is a codec converts an API object to query
Expand Down
4 changes: 2 additions & 2 deletions pkg/client/typed/dynamic/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ func TestDelete(t *testing.T) {
}

w.Header().Set("Content-Type", runtime.ContentTypeJSON)
runtime.UnstructuredJSONScheme.EncodeToStream(statusOK, w)
runtime.UnstructuredJSONScheme.Encode(statusOK, w)
})
if err != nil {
t.Errorf("unexpected error when creating client: %v", err)
Expand Down Expand Up @@ -284,7 +284,7 @@ func TestDeleteCollection(t *testing.T) {
}

w.Header().Set("Content-Type", runtime.ContentTypeJSON)
runtime.UnstructuredJSONScheme.EncodeToStream(statusOK, w)
runtime.UnstructuredJSONScheme.Encode(statusOK, w)
})
if err != nil {
t.Errorf("unexpected error when creating client: %v", err)
Expand Down
6 changes: 3 additions & 3 deletions pkg/registry/thirdpartyresourcedata/codec.go
Original file line number Diff line number Diff line change
Expand Up @@ -483,10 +483,10 @@ func encodeToJSON(obj *extensions.ThirdPartyResourceData, stream io.Writer) erro
return encoder.Encode(objMap)
}

func (t *thirdPartyResourceDataEncoder) EncodeToStream(obj runtime.Object, stream io.Writer, overrides ...unversioned.GroupVersion) (err error) {
func (t *thirdPartyResourceDataEncoder) Encode(obj runtime.Object, stream io.Writer) (err error) {
switch obj := obj.(type) {
case *versioned.InternalEvent:
return t.delegate.EncodeToStream(obj, stream, overrides...)
return t.delegate.Encode(obj, stream)
case *extensions.ThirdPartyResourceData:
return encodeToJSON(obj, stream)
case *extensions.ThirdPartyResourceDataList:
Expand All @@ -504,7 +504,7 @@ func (t *thirdPartyResourceDataEncoder) EncodeToStream(obj runtime.Object, strea
fmt.Fprintf(stream, template, t.gvk.Kind+"List", gv.String(), strings.Join(dataStrings, ","))
return nil
case *unversioned.Status, *unversioned.APIResourceList:
return t.delegate.EncodeToStream(obj, stream, overrides...)
return t.delegate.Encode(obj, stream)
default:
return fmt.Errorf("unexpected object to encode: %#v", obj)
}
Expand Down
10 changes: 5 additions & 5 deletions pkg/runtime/codec.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,10 @@ func NewCodec(e Encoder, d Decoder) Codec {
}

// Encode is a convenience wrapper for encoding to a []byte from an Encoder
func Encode(e Encoder, obj Object, overrides ...unversioned.GroupVersion) ([]byte, error) {
func Encode(e Encoder, obj Object) ([]byte, error) {
// TODO: reuse buffer
buf := &bytes.Buffer{}
if err := e.EncodeToStream(obj, buf, overrides...); err != nil {
if err := e.Encode(obj, buf); err != nil {
return nil, err
}
return buf.Bytes(), nil
Expand Down Expand Up @@ -98,7 +98,7 @@ type NoopEncoder struct {

var _ Serializer = NoopEncoder{}

func (n NoopEncoder) EncodeToStream(obj Object, w io.Writer, overrides ...unversioned.GroupVersion) error {
func (n NoopEncoder) Encode(obj Object, w io.Writer) error {
return fmt.Errorf("encoding is not allowed for this codec: %v", reflect.TypeOf(n.Decoder))
}

Expand Down Expand Up @@ -181,9 +181,9 @@ func NewBase64Serializer(s Serializer) Serializer {
return &base64Serializer{s}
}

func (s base64Serializer) EncodeToStream(obj Object, stream io.Writer, overrides ...unversioned.GroupVersion) error {
func (s base64Serializer) Encode(obj Object, stream io.Writer) error {
e := base64.NewEncoder(base64.StdEncoding, stream)
err := s.Serializer.EncodeToStream(obj, e, overrides...)
err := s.Serializer.Encode(obj, e)
e.Close()
return err
}
Expand Down
4 changes: 2 additions & 2 deletions pkg/runtime/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,10 +113,10 @@ func FieldPtr(v reflect.Value, fieldName string, dest interface{}) error {

// EncodeList ensures that each object in an array is converted to a Unknown{} in serialized form.
// TODO: accept a content type.
func EncodeList(e Encoder, objects []Object, overrides ...unversioned.GroupVersion) error {
func EncodeList(e Encoder, objects []Object) error {
var errs []error
for i := range objects {
data, err := Encode(e, objects[i], overrides...)
data, err := Encode(e, objects[i])
if err != nil {
errs = append(errs, err)
continue
Expand Down
7 changes: 3 additions & 4 deletions pkg/runtime/interfaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,9 @@ const (
)

type Encoder interface {
// EncodeToStream writes an object to a stream. Override versions may be provided for each group
// that enforce a certain versioning. Implementations may return errors if the versions are incompatible,
// or if no conversion is defined.
EncodeToStream(obj Object, stream io.Writer, overrides ...unversioned.GroupVersion) error
// Encode writes an object to a stream. Implementations may return errors if the versions are
// incompatible, or if no conversion is defined.
Encode(obj Object, w io.Writer) error
}

type Decoder interface {
Expand Down
4 changes: 2 additions & 2 deletions pkg/runtime/serializer/codec_factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -339,15 +339,15 @@ type DirectCodec struct {
}

// EncodeToStream does not do conversion. It sets the gvk during serialization. overrides are ignored.
func (c DirectCodec) EncodeToStream(obj runtime.Object, stream io.Writer, overrides ...unversioned.GroupVersion) error {
func (c DirectCodec) Encode(obj runtime.Object, stream io.Writer) error {
gvks, _, err := c.ObjectTyper.ObjectKinds(obj)
if err != nil {
return err
}
kind := obj.GetObjectKind()
oldGVK := kind.GroupVersionKind()
kind.SetGroupVersionKind(gvks[0])
err = c.Serializer.EncodeToStream(obj, stream, overrides...)
err = c.Serializer.Encode(obj, stream)
kind.SetGroupVersionKind(oldGVK)
return err
}
Expand Down
27 changes: 12 additions & 15 deletions pkg/runtime/serializer/codec_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -250,31 +250,28 @@ func TestTypes(t *testing.T) {
}

func TestVersionedEncoding(t *testing.T) {
s, codec := GetTestScheme()
out, err := runtime.Encode(codec, &TestType1{}, unversioned.GroupVersion{Version: "v2"})
s, _ := GetTestScheme()
cf := newCodecFactory(s, newSerializersForScheme(s, testMetaFactory{}))
encoder, _ := cf.SerializerForFileExtension("json")

codec := cf.CodecForVersions(encoder, nil, []unversioned.GroupVersion{{Version: "v2"}}, nil)
out, err := runtime.Encode(codec, &TestType1{})
if err != nil {
t.Fatal(err)
}
if string(out) != `{"myVersionKey":"v2","myKindKey":"TestType1"}`+"\n" {
t.Fatal(string(out))
}
_, err = runtime.Encode(codec, &TestType1{}, unversioned.GroupVersion{Version: "v3"})
if err == nil {
t.Fatal(err)
}

cf := newCodecFactory(s, newSerializersForScheme(s, testMetaFactory{}))
encoder, _ := cf.SerializerForFileExtension("json")

// codec that is unversioned uses the target version
unversionedCodec := cf.CodecForVersions(encoder, nil, nil, nil)
_, err = runtime.Encode(unversionedCodec, &TestType1{}, unversioned.GroupVersion{Version: "v3"})
if err == nil || !runtime.IsNotRegisteredError(err) {
codec = cf.CodecForVersions(encoder, nil, []unversioned.GroupVersion{{Version: "v3"}}, nil)
_, err = runtime.Encode(codec, &TestType1{})
if err == nil {
t.Fatal(err)
}

// unversioned encode with no versions is written directly to wire
out, err = runtime.Encode(unversionedCodec, &TestType1{})
codec = cf.CodecForVersions(encoder, nil, nil, nil)
out, err = runtime.Encode(codec, &TestType1{})
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -426,7 +423,7 @@ func TestDirectCodec(t *testing.T) {
}
directEncoder := df.EncoderForVersion(serializer, ignoredGV)
directDecoder := df.DecoderToVersion(serializer, ignoredGV)
out, err := runtime.Encode(directEncoder, &ExternalTestType1{}, ignoredGV)
out, err := runtime.Encode(directEncoder, &ExternalTestType1{})
if err != nil {
t.Fatal(err)
}
Expand Down
4 changes: 2 additions & 2 deletions pkg/runtime/serializer/json/json.go
Original file line number Diff line number Diff line change
Expand Up @@ -159,8 +159,8 @@ func (s *Serializer) Decode(originalData []byte, gvk *unversioned.GroupVersionKi
return obj, actual, nil
}

// EncodeToStream serializes the provided object to the given writer. Overrides is ignored.
func (s *Serializer) EncodeToStream(obj runtime.Object, w io.Writer, overrides ...unversioned.GroupVersion) error {
// Encode serializes the provided object to the given writer.
func (s *Serializer) Encode(obj runtime.Object, w io.Writer) error {
if s.yaml {
json, err := json.Marshal(obj)
if err != nil {
Expand Down
8 changes: 4 additions & 4 deletions pkg/runtime/serializer/protobuf/protobuf.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,8 +165,8 @@ func (s *Serializer) Decode(originalData []byte, gvk *unversioned.GroupVersionKi
return unmarshalToObject(s.typer, s.creater, &actual, into, unk.Raw)
}

// EncodeToStream serializes the provided object to the given writer. Overrides is ignored.
func (s *Serializer) EncodeToStream(obj runtime.Object, w io.Writer, overrides ...unversioned.GroupVersion) error {
// Encode serializes the provided object to the given writer.
func (s *Serializer) Encode(obj runtime.Object, w io.Writer) error {
var unk runtime.Unknown
kind := obj.GetObjectKind().GroupVersionKind()
unk = runtime.Unknown{
Expand Down Expand Up @@ -388,8 +388,8 @@ func unmarshalToObject(typer runtime.ObjectTyper, creater runtime.ObjectCreater,
return obj, actual, nil
}

// EncodeToStream serializes the provided object to the given writer. Overrides is ignored.
func (s *RawSerializer) EncodeToStream(obj runtime.Object, w io.Writer, overrides ...unversioned.GroupVersion) error {
// Encode serializes the provided object to the given writer. Overrides is ignored.
func (s *RawSerializer) Encode(obj runtime.Object, w io.Writer) error {
switch t := obj.(type) {
case bufferedMarshaller:
// this path performs a single allocation during write but requires the caller to implement
Expand Down
8 changes: 4 additions & 4 deletions pkg/runtime/serializer/streaming/streaming.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ import (
// Encoder is a runtime.Encoder on a stream.
type Encoder interface {
// Encode will write the provided object to the stream or return an error. It obeys the same
// contract as runtime.Encoder.
Encode(obj runtime.Object, overrides ...unversioned.GroupVersion) error
// contract as runtime.VersionedEncoder.
Encode(obj runtime.Object) error
}

// Decoder is a runtime.Decoder from a stream.
Expand Down Expand Up @@ -127,8 +127,8 @@ func NewEncoder(w io.Writer, e runtime.Encoder) Encoder {
}

// Encode writes the provided object to the nested writer.
func (e *encoder) Encode(obj runtime.Object, overrides ...unversioned.GroupVersion) error {
if err := e.encoder.EncodeToStream(obj, e.buf, overrides...); err != nil {
func (e *encoder) Encode(obj runtime.Object) error {
if err := e.encoder.Encode(obj, e.buf); err != nil {
return err
}
_, err := e.writer.Write(e.buf.Bytes())
Expand Down