diff --git a/cmd/libs/go2idl/client-gen/generators/generator_for_group.go b/cmd/libs/go2idl/client-gen/generators/generator_for_group.go index afc4064efe4..21437a4e8b9 100644 --- a/cmd/libs/go2idl/client-gen/generators/generator_for_group.go +++ b/cmd/libs/go2idl/client-gen/generators/generator_for_group.go @@ -204,7 +204,8 @@ func setConfigDefaults(config *$.Config|raw$) error { config.GroupVersion = ©GroupVersion //} - config.Codec = $.codecs|raw$.LegacyCodec(*config.GroupVersion) + config.NegotiatedSerializer = $.codecs|raw$ + if config.QPS == 0 { config.QPS = 5 } @@ -232,11 +233,7 @@ func setConfigDefaults(config *$.Config|raw$) error { config.GroupVersion = ©GroupVersion //} - codec, ok := $.codecs|raw$.SerializerForFileExtension("json") - if !ok { - return $.Errorf|raw$("unable to find serializer for JSON") - } - config.Codec = codec + config.NegotiatedSerializer = $.codecs|raw$ if config.QPS == 0 { config.QPS = 5 diff --git a/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/test_internalclientset/typed/testgroup.k8s.io/unversioned/testgroup_client.go b/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/test_internalclientset/typed/testgroup.k8s.io/unversioned/testgroup_client.go index 56d08722b3e..f870a64d889 100644 --- a/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/test_internalclientset/typed/testgroup.k8s.io/unversioned/testgroup_client.go +++ b/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/test_internalclientset/typed/testgroup.k8s.io/unversioned/testgroup_client.go @@ -80,7 +80,8 @@ func setConfigDefaults(config *restclient.Config) error { config.GroupVersion = ©GroupVersion //} - config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion) + config.NegotiatedSerializer = api.Codecs + if config.QPS == 0 { config.QPS = 5 } diff --git a/pkg/api/testapi/testapi.go b/pkg/api/testapi/testapi.go index bbbe0367e98..8bec17e33e3 100644 --- a/pkg/api/testapi/testapi.go +++ b/pkg/api/testapi/testapi.go @@ -45,13 +45,14 @@ import ( ) var ( - Groups = make(map[string]TestGroup) - Default TestGroup - Autoscaling TestGroup - Batch TestGroup - Extensions TestGroup - Apps TestGroup - Federation TestGroup + Groups = make(map[string]TestGroup) + Default TestGroup + Autoscaling TestGroup + Batch TestGroup + Extensions TestGroup + Apps TestGroup + Federation TestGroup + NegotiatedSerializer = api.Codecs ) type TestGroup struct { diff --git a/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/batch_client.go b/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/batch_client.go index e42c2d84a6e..58b67ceda07 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/batch_client.go +++ b/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/batch_client.go @@ -80,7 +80,8 @@ func setConfigDefaults(config *restclient.Config) error { config.GroupVersion = ©GroupVersion //} - config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion) + config.NegotiatedSerializer = api.Codecs + if config.QPS == 0 { config.QPS = 5 } diff --git a/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/core_client.go b/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/core_client.go index 9250a2261b5..41aee4cf654 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/core_client.go +++ b/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/core_client.go @@ -155,7 +155,8 @@ func setConfigDefaults(config *restclient.Config) error { config.GroupVersion = ©GroupVersion //} - config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion) + config.NegotiatedSerializer = api.Codecs + if config.QPS == 0 { config.QPS = 5 } diff --git a/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/extensions_client.go b/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/extensions_client.go index d8b97a05ed9..5c979161256 100644 --- a/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/extensions_client.go +++ b/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/extensions_client.go @@ -110,7 +110,8 @@ func setConfigDefaults(config *restclient.Config) error { config.GroupVersion = ©GroupVersion //} - config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion) + config.NegotiatedSerializer = api.Codecs + if config.QPS == 0 { config.QPS = 5 } diff --git a/pkg/client/clientset_generated/release_1_2/typed/core/v1/core_client.go b/pkg/client/clientset_generated/release_1_2/typed/core/v1/core_client.go index 886d556b5dd..6c2874e386d 100644 --- a/pkg/client/clientset_generated/release_1_2/typed/core/v1/core_client.go +++ b/pkg/client/clientset_generated/release_1_2/typed/core/v1/core_client.go @@ -149,7 +149,8 @@ func setConfigDefaults(config *restclient.Config) error { config.GroupVersion = ©GroupVersion //} - config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion) + config.NegotiatedSerializer = api.Codecs + if config.QPS == 0 { config.QPS = 5 } diff --git a/pkg/client/clientset_generated/release_1_2/typed/extensions/v1beta1/extensions_client.go b/pkg/client/clientset_generated/release_1_2/typed/extensions/v1beta1/extensions_client.go index af3348a3357..86cc6a9ce27 100644 --- a/pkg/client/clientset_generated/release_1_2/typed/extensions/v1beta1/extensions_client.go +++ b/pkg/client/clientset_generated/release_1_2/typed/extensions/v1beta1/extensions_client.go @@ -114,7 +114,8 @@ func setConfigDefaults(config *restclient.Config) error { config.GroupVersion = ©GroupVersion //} - config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion) + config.NegotiatedSerializer = api.Codecs + if config.QPS == 0 { config.QPS = 5 } diff --git a/pkg/client/clientset_generated/release_1_3/typed/core/v1/core_client.go b/pkg/client/clientset_generated/release_1_3/typed/core/v1/core_client.go index c6b0cfbfe22..6c2874e386d 100644 --- a/pkg/client/clientset_generated/release_1_3/typed/core/v1/core_client.go +++ b/pkg/client/clientset_generated/release_1_3/typed/core/v1/core_client.go @@ -17,7 +17,6 @@ limitations under the License. package v1 import ( - fmt "fmt" api "k8s.io/kubernetes/pkg/api" registered "k8s.io/kubernetes/pkg/apimachinery/registered" restclient "k8s.io/kubernetes/pkg/client/restclient" @@ -150,11 +149,7 @@ func setConfigDefaults(config *restclient.Config) error { config.GroupVersion = ©GroupVersion //} - codec, ok := api.Codecs.SerializerForFileExtension("json") - if !ok { - return fmt.Errorf("unable to find serializer for JSON") - } - config.Codec = codec + config.NegotiatedSerializer = api.Codecs if config.QPS == 0 { config.QPS = 5 diff --git a/pkg/client/clientset_generated/release_1_3/typed/extensions/v1beta1/extensions_client.go b/pkg/client/clientset_generated/release_1_3/typed/extensions/v1beta1/extensions_client.go index ebbe0a2f8b5..86cc6a9ce27 100644 --- a/pkg/client/clientset_generated/release_1_3/typed/extensions/v1beta1/extensions_client.go +++ b/pkg/client/clientset_generated/release_1_3/typed/extensions/v1beta1/extensions_client.go @@ -17,7 +17,6 @@ limitations under the License. package v1beta1 import ( - fmt "fmt" api "k8s.io/kubernetes/pkg/api" registered "k8s.io/kubernetes/pkg/apimachinery/registered" restclient "k8s.io/kubernetes/pkg/client/restclient" @@ -115,11 +114,7 @@ func setConfigDefaults(config *restclient.Config) error { config.GroupVersion = ©GroupVersion //} - codec, ok := api.Codecs.SerializerForFileExtension("json") - if !ok { - return fmt.Errorf("unable to find serializer for JSON") - } - config.Codec = codec + config.NegotiatedSerializer = api.Codecs if config.QPS == 0 { config.QPS = 5 diff --git a/pkg/client/restclient/client.go b/pkg/client/restclient/client.go index b66884f91ab..aab02d8b8dc 100644 --- a/pkg/client/restclient/client.go +++ b/pkg/client/restclient/client.go @@ -63,7 +63,7 @@ type RESTClient struct { // NewRESTClient creates a new RESTClient. This client performs generic REST functions // such as Get, Put, Post, and Delete on specified paths. Codec controls encoding and // decoding of responses from the server. -func NewRESTClient(baseURL *url.URL, versionedAPIPath string, config ContentConfig, maxQPS float32, maxBurst int, rateLimiter flowcontrol.RateLimiter, client *http.Client) *RESTClient { +func NewRESTClient(baseURL *url.URL, versionedAPIPath string, config ContentConfig, maxQPS float32, maxBurst int, rateLimiter flowcontrol.RateLimiter, client *http.Client) (*RESTClient, error) { base := *baseURL if !strings.HasSuffix(base.Path, "/") { base.Path += "/" @@ -90,7 +90,7 @@ func NewRESTClient(baseURL *url.URL, versionedAPIPath string, config ContentConf contentConfig: config, Throttle: throttle, Client: client, - } + }, nil } // GetRateLimiter returns rate limier for a given client, or nil if it's called on a nil client @@ -122,7 +122,8 @@ func readExpBackoffConfig() BackoffManager { // Verb begins a request with a verb (GET, POST, PUT, DELETE). // // Example usage of RESTClient's request building interface: -// c := NewRESTClient(url, codec) +// c, err := NewRESTClient(...) +// if err != nil { ... } // resp, err := c.Verb("GET"). // Path("pods"). // SelectorParam("labels", "area=staging"). diff --git a/pkg/client/restclient/config.go b/pkg/client/restclient/config.go index c1928de0818..5ecfe061a38 100644 --- a/pkg/client/restclient/config.go +++ b/pkg/client/restclient/config.go @@ -130,9 +130,15 @@ type ContentConfig struct { // a RESTClient directly. When initializing a Client, will be set with the default // code version. GroupVersion *unversioned.GroupVersion + // NegotiatedSerializer is used for obtaining encoders and decoders for multiple + // supported media types. + NegotiatedSerializer runtime.NegotiatedSerializer + // Codec specifies the encoding and decoding behavior for runtime.Objects passed // to a RESTClient or Client. Required when initializing a RESTClient, optional // when initializing a Client. + // + // DEPRECATED: Please use NegotiatedSerializer instead. Codec runtime.Codec } @@ -144,8 +150,8 @@ func RESTClientFor(config *Config) (*RESTClient, error) { if config.GroupVersion == nil { return nil, fmt.Errorf("GroupVersion is required when initializing a RESTClient") } - if config.Codec == nil { - return nil, fmt.Errorf("Codec is required when initializing a RESTClient") + if config.NegotiatedSerializer == nil { + return nil, fmt.Errorf("NegotiatedSerializer is required when initializing a RESTClient") } baseURL, versionedAPIPath, err := defaultServerUrlFor(config) @@ -163,16 +169,14 @@ func RESTClientFor(config *Config) (*RESTClient, error) { httpClient = &http.Client{Transport: transport} } - client := NewRESTClient(baseURL, versionedAPIPath, config.ContentConfig, config.QPS, config.Burst, config.RateLimiter, httpClient) - - return client, nil + return NewRESTClient(baseURL, versionedAPIPath, config.ContentConfig, config.QPS, config.Burst, config.RateLimiter, httpClient) } // UnversionedRESTClientFor is the same as RESTClientFor, except that it allows // the config.Version to be empty. func UnversionedRESTClientFor(config *Config) (*RESTClient, error) { - if config.Codec == nil { - return nil, fmt.Errorf("Codec is required when initializing a RESTClient") + if config.NegotiatedSerializer == nil { + return nil, fmt.Errorf("NeogitatedSerializer is required when initializing a RESTClient") } baseURL, versionedAPIPath, err := defaultServerUrlFor(config) @@ -196,8 +200,7 @@ func UnversionedRESTClientFor(config *Config) (*RESTClient, error) { versionConfig.GroupVersion = &v } - client := NewRESTClient(baseURL, versionedAPIPath, versionConfig, config.QPS, config.Burst, config.RateLimiter, httpClient) - return client, nil + return NewRESTClient(baseURL, versionedAPIPath, versionConfig, config.QPS, config.Burst, config.RateLimiter, httpClient) } // SetKubernetesDefaults sets default values on the provided client config for accessing the diff --git a/pkg/client/restclient/config_test.go b/pkg/client/restclient/config_test.go index 1a1dd422b4f..029e64253ba 100644 --- a/pkg/client/restclient/config_test.go +++ b/pkg/client/restclient/config_test.go @@ -87,13 +87,13 @@ func TestSetKubernetesDefaultsUserAgent(t *testing.T) { } func TestRESTClientRequires(t *testing.T) { - if _, err := RESTClientFor(&Config{Host: "127.0.0.1", ContentConfig: ContentConfig{Codec: testapi.Default.Codec()}}); err == nil { + if _, err := RESTClientFor(&Config{Host: "127.0.0.1", ContentConfig: ContentConfig{NegotiatedSerializer: testapi.NegotiatedSerializer}}); err == nil { t.Errorf("unexpected non-error") } if _, err := RESTClientFor(&Config{Host: "127.0.0.1", ContentConfig: ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}); err == nil { t.Errorf("unexpected non-error") } - if _, err := RESTClientFor(&Config{Host: "127.0.0.1", ContentConfig: ContentConfig{GroupVersion: testapi.Default.GroupVersion(), Codec: testapi.Default.Codec()}}); err != nil { + if _, err := RESTClientFor(&Config{Host: "127.0.0.1", ContentConfig: ContentConfig{GroupVersion: testapi.Default.GroupVersion(), NegotiatedSerializer: testapi.NegotiatedSerializer}}); err != nil { t.Errorf("unexpected error: %v", err) } } diff --git a/pkg/client/restclient/request_test.go b/pkg/client/restclient/request_test.go index 31f2f9fcf5e..b194b37778d 100644 --- a/pkg/client/restclient/request_test.go +++ b/pkg/client/restclient/request_test.go @@ -1308,5 +1308,9 @@ func testRESTClient(t testing.TB, srv *httptest.Server) *RESTClient { } } versionedAPIPath := testapi.Default.ResourcePath("", "", "") - return NewRESTClient(baseURL, versionedAPIPath, ContentConfig{GroupVersion: testapi.Default.GroupVersion(), Codec: testapi.Default.Codec()}, 0, 0, nil, nil) + client, err := NewRESTClient(baseURL, versionedAPIPath, ContentConfig{GroupVersion: testapi.Default.GroupVersion(), Codec: testapi.Default.Codec()}, 0, 0, nil, nil) + if err != nil { + t.Fatalf("failed to create a client: %v", err) + } + return client } diff --git a/pkg/client/unversioned/apps.go b/pkg/client/unversioned/apps.go index a6612d75a93..c81c53d84ee 100644 --- a/pkg/client/unversioned/apps.go +++ b/pkg/client/unversioned/apps.go @@ -72,6 +72,7 @@ func setAppsDefaults(config *restclient.Config) error { //} config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion) + config.NegotiatedSerializer = api.Codecs if config.QPS == 0 { config.QPS = 5 } diff --git a/pkg/client/unversioned/autoscaling.go b/pkg/client/unversioned/autoscaling.go index c3ec1981030..7566042544f 100644 --- a/pkg/client/unversioned/autoscaling.go +++ b/pkg/client/unversioned/autoscaling.go @@ -73,6 +73,7 @@ func setAutoscalingDefaults(config *restclient.Config) error { //} config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion) + config.NegotiatedSerializer = api.Codecs if config.QPS == 0 { config.QPS = 5 } diff --git a/pkg/client/unversioned/batch.go b/pkg/client/unversioned/batch.go index a432e4c789c..b9f30fa8d06 100644 --- a/pkg/client/unversioned/batch.go +++ b/pkg/client/unversioned/batch.go @@ -73,6 +73,7 @@ func setBatchDefaults(config *restclient.Config) error { //} config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion) + config.NegotiatedSerializer = api.Codecs if config.QPS == 0 { config.QPS = 5 } diff --git a/pkg/client/unversioned/extensions.go b/pkg/client/unversioned/extensions.go index 5db86dbb838..c741390a462 100644 --- a/pkg/client/unversioned/extensions.go +++ b/pkg/client/unversioned/extensions.go @@ -127,6 +127,7 @@ func setExtensionsDefaults(config *restclient.Config) error { //} config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion) + config.NegotiatedSerializer = api.Codecs if config.QPS == 0 { config.QPS = 5 } diff --git a/pkg/client/unversioned/helper.go b/pkg/client/unversioned/helper.go index a81307c34c9..0f2d6694597 100644 --- a/pkg/client/unversioned/helper.go +++ b/pkg/client/unversioned/helper.go @@ -231,6 +231,9 @@ func SetKubernetesDefaults(config *restclient.Config) error { // TODO: Unconditionally set the config.Version, until we fix the config. copyGroupVersion := g.GroupVersion config.GroupVersion = ©GroupVersion + if config.NegotiatedSerializer == nil { + config.NegotiatedSerializer = api.Codecs + } if config.Codec == nil { config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion) } diff --git a/pkg/client/unversioned/helper_test.go b/pkg/client/unversioned/helper_test.go index 1d506ff9763..80660a6d056 100644 --- a/pkg/client/unversioned/helper_test.go +++ b/pkg/client/unversioned/helper_test.go @@ -40,8 +40,9 @@ func TestSetKubernetesDefaults(t *testing.T) { restclient.Config{ APIPath: "/api", ContentConfig: restclient.ContentConfig{ - GroupVersion: testapi.Default.GroupVersion(), - Codec: testapi.Default.Codec(), + GroupVersion: testapi.Default.GroupVersion(), + Codec: testapi.Default.Codec(), + NegotiatedSerializer: testapi.NegotiatedSerializer, }, QPS: 5, Burst: 10, @@ -125,7 +126,7 @@ func TestHelperGetServerAPIVersions(t *testing.T) { w.Write(output) })) defer server.Close() - got, err := restclient.ServerAPIVersions(&restclient.Config{Host: server.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Group: "invalid version", Version: "one"}, Codec: testapi.Default.Codec()}}) + got, err := restclient.ServerAPIVersions(&restclient.Config{Host: server.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Group: "invalid version", Version: "one"}, NegotiatedSerializer: testapi.NegotiatedSerializer}}) if err != nil { t.Fatalf("unexpected encoding error: %v", err) } diff --git a/pkg/client/unversioned/remotecommand/remotecommand_test.go b/pkg/client/unversioned/remotecommand/remotecommand_test.go index 84b16219d9e..5bc8b1101cc 100644 --- a/pkg/client/unversioned/remotecommand/remotecommand_test.go +++ b/pkg/client/unversioned/remotecommand/remotecommand_test.go @@ -212,7 +212,10 @@ func TestStream(t *testing.T) { server := httptest.NewServer(fakeServer(t, name, exec, testCase.Stdin, testCase.Stdout, testCase.Stderr, testCase.Error, testCase.Tty, testCase.MessageCount, testCase.ServerProtocols)) url, _ := url.ParseRequestURI(server.URL) - c := restclient.NewRESTClient(url, "", restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Group: "x"}}, -1, -1, nil, nil) + c, err := restclient.NewRESTClient(url, "", restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Group: "x"}}, -1, -1, nil, nil) + if err != nil { + t.Fatalf("failed to create a client: %v", err) + } req := c.Post().Resource("testing") if exec {