From 5b108acb3830e6a88f92a5b5c0fa637af8bc14e9 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Wed, 24 Feb 2016 21:45:30 -0800 Subject: [PATCH 1/2] fix ParameterCodec for thirdparty resource --- pkg/master/master.go | 2 +- pkg/registry/thirdpartyresourcedata/codec.go | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/pkg/master/master.go b/pkg/master/master.go index 1f4d7ae24b7..5692301e8c9 100644 --- a/pkg/master/master.go +++ b/pkg/master/master.go @@ -639,7 +639,7 @@ func (m *Master) thirdpartyapi(group, kind, version string) *apiserver.APIGroupV OptionsExternalVersion: &optionsExternalVersion, Serializer: thirdpartyresourcedata.NewNegotiatedSerializer(api.Codecs, kind, externalVersion, internalVersion), - ParameterCodec: api.ParameterCodec, + ParameterCodec: thirdpartyresourcedata.NewThirdPartyParameterCodec(api.ParameterCodec), Context: m.RequestContextMapper, diff --git a/pkg/registry/thirdpartyresourcedata/codec.go b/pkg/registry/thirdpartyresourcedata/codec.go index 5ca3943d381..0a5db75ccfc 100644 --- a/pkg/registry/thirdpartyresourcedata/codec.go +++ b/pkg/registry/thirdpartyresourcedata/codec.go @@ -21,12 +21,14 @@ import ( "encoding/json" "fmt" "io" + "net/url" "strings" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/unversioned" apiutil "k8s.io/kubernetes/pkg/api/util" + "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/runtime" @@ -364,3 +366,19 @@ func (t *thirdPartyResourceDataCreator) New(kind unversioned.GroupVersionKind) ( return t.delegate.New(kind) } } + +func NewThirdPartyParameterCodec(p runtime.ParameterCodec) runtime.ParameterCodec { + return &thirdPartyParameterCodec{p} +} + +type thirdPartyParameterCodec struct { + delegate runtime.ParameterCodec +} + +func (t *thirdPartyParameterCodec) DecodeParameters(parameters url.Values, from unversioned.GroupVersion, into runtime.Object) error { + return t.delegate.DecodeParameters(parameters, v1.SchemeGroupVersion, into) +} + +func (t *thirdPartyParameterCodec) EncodeParameters(obj runtime.Object, to unversioned.GroupVersion) (url.Values, error) { + return t.delegate.EncodeParameters(obj, v1.SchemeGroupVersion) +} From 4adb110516f12f87496bd7ea30c4e103625f0876 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Wed, 24 Feb 2016 22:07:54 -0800 Subject: [PATCH 2/2] adding a unit test --- pkg/master/master_test.go | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/pkg/master/master_test.go b/pkg/master/master_test.go index 132f45caacc..fb014a860ec 100644 --- a/pkg/master/master_test.go +++ b/pkg/master/master_test.go @@ -568,8 +568,7 @@ func testInstallThirdPartyAPIListVersion(t *testing.T, version string) { } if len(list.Items) != len(test.items) { - t.Errorf("unexpected length: %d vs %d", len(list.Items), len(test.items)) - return + t.Fatalf("unexpected length: %d vs %d", len(list.Items), len(test.items)) } // The order of elements in LIST is not guaranteed. mapping := make(map[string]int) @@ -715,8 +714,7 @@ func testInstallThirdPartyAPIPostForVersion(t *testing.T, version string) { resp, err := http.Post(server.URL+"/apis/company.com/"+version+"/namespaces/default/foos", "application/json", bytes.NewBuffer(data)) if !assert.NoError(err) { - t.Errorf("unexpected error: %v", err) - return + t.Fatalf("unexpected error: %v", err) } assert.Equal(http.StatusCreated, resp.StatusCode) @@ -829,6 +827,39 @@ func httpDelete(url string) (*http.Response, error) { return client.Do(req) } +func TestInstallThirdPartyAPIListOptions(t *testing.T) { + for _, version := range versionsToTest { + testInstallThirdPartyAPIListOptionsForVersion(t, version) + } +} + +func testInstallThirdPartyAPIListOptionsForVersion(t *testing.T, version string) { + _, etcdserver, server, assert := initThirdParty(t, version) + // TODO: Uncomment when fix #19254 + // defer server.Close() + defer etcdserver.Terminate(t) + + // send a GET request with query parameter + resp, err := httpGetWithRV(server.URL + "/apis/company.com/" + version + "/namespaces/default/foos") + if !assert.NoError(err) { + t.Fatalf("unexpected error: %v", err) + } + assert.Equal(http.StatusOK, resp.StatusCode) +} + +func httpGetWithRV(url string) (*http.Response, error) { + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return nil, err + } + q := req.URL.Query() + // resourceversion is part of a ListOptions + q.Add("resourceversion", "0") + req.URL.RawQuery = q.Encode() + client := &http.Client{} + return client.Do(req) +} + func TestInstallThirdPartyResourceRemove(t *testing.T) { for _, version := range versionsToTest { testInstallThirdPartyResourceRemove(t, version)