Merge pull request #18022 from deads2k/gv-request

Auto commit by PR queue bot
This commit is contained in:
k8s-merge-robot 2015-12-05 22:38:40 -08:00
commit c6b59353e1
14 changed files with 85 additions and 61 deletions

View File

@ -38,6 +38,7 @@ import (
apierrors "k8s.io/kubernetes/pkg/api/errors" apierrors "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/client/record" "k8s.io/kubernetes/pkg/client/record"
client "k8s.io/kubernetes/pkg/client/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller"
@ -423,7 +424,7 @@ containers:
} }
func runReplicationControllerTest(c *client.Client) { func runReplicationControllerTest(c *client.Client) {
clientAPIVersion := c.APIVersion() clientAPIVersion := c.APIVersion().String()
data, err := ioutil.ReadFile("cmd/integration/" + clientAPIVersion + "-controller.json") data, err := ioutil.ReadFile("cmd/integration/" + clientAPIVersion + "-controller.json")
if err != nil { if err != nil {
glog.Fatalf("Unexpected error: %v", err) glog.Fatalf("Unexpected error: %v", err)
@ -462,7 +463,7 @@ func runReplicationControllerTest(c *client.Client) {
func runAPIVersionsTest(c *client.Client) { func runAPIVersionsTest(c *client.Client) {
v, err := c.ServerAPIVersions() v, err := c.ServerAPIVersions()
clientVersion := c.APIVersion() clientVersion := c.APIVersion().String()
if err != nil { if err != nil {
glog.Fatalf("Failed to get api versions: %v", err) glog.Fatalf("Failed to get api versions: %v", err)
} }
@ -541,7 +542,7 @@ func runSelfLinkTestOnNamespace(c *client.Client, namespace string) {
func runAtomicPutTest(c *client.Client) { func runAtomicPutTest(c *client.Client) {
svcBody := api.Service{ svcBody := api.Service{
TypeMeta: unversioned.TypeMeta{ TypeMeta: unversioned.TypeMeta{
APIVersion: c.APIVersion(), APIVersion: c.APIVersion().String(),
}, },
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "atomicservice", Name: "atomicservice",
@ -623,7 +624,7 @@ func runPatchTest(c *client.Client) {
resource := "services" resource := "services"
svcBody := api.Service{ svcBody := api.Service{
TypeMeta: unversioned.TypeMeta{ TypeMeta: unversioned.TypeMeta{
APIVersion: c.APIVersion(), APIVersion: c.APIVersion().String(),
}, },
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: name, Name: name,
@ -647,12 +648,12 @@ func runPatchTest(c *client.Client) {
glog.Fatalf("Failed creating patchservice: %v", err) glog.Fatalf("Failed creating patchservice: %v", err)
} }
patchBodies := map[string]map[api.PatchType]struct { patchBodies := map[unversioned.GroupVersion]map[api.PatchType]struct {
AddLabelBody []byte AddLabelBody []byte
RemoveLabelBody []byte RemoveLabelBody []byte
RemoveAllLabelsBody []byte RemoveAllLabelsBody []byte
}{ }{
"v1": { v1.SchemeGroupVersion: {
api.JSONPatchType: { api.JSONPatchType: {
[]byte(`[{"op":"add","path":"/metadata/labels","value":{"foo":"bar","baz":"qux"}}]`), []byte(`[{"op":"add","path":"/metadata/labels","value":{"foo":"bar","baz":"qux"}}]`),
[]byte(`[{"op":"remove","path":"/metadata/labels/foo"}]`), []byte(`[{"op":"remove","path":"/metadata/labels/foo"}]`),

View File

@ -0,0 +1,20 @@
/*
Copyright 2014 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package unversioned
// SchemeGroupVersion is group version used to register these objects
var SchemeGroupVersion = GroupVersion{Group: "", Version: ""}

View File

@ -72,7 +72,7 @@ func (c *deployments) Delete(name string, options *api.DeleteOptions) error {
if options == nil { if options == nil {
return c.client.Delete().Namespace(c.ns).Resource("deployments").Name(name).Do().Error() return c.client.Delete().Namespace(c.ns).Resource("deployments").Name(name).Do().Error()
} }
body, err := api.Scheme.EncodeToVersion(options, c.client.APIVersion()) body, err := api.Scheme.EncodeToVersion(options, c.client.APIVersion().String())
if err != nil { if err != nil {
return err return err
} }

View File

@ -187,7 +187,7 @@ func (e *events) Delete(name string) error {
// Returns the appropriate field selector based on the API version being used to communicate with the server. // Returns the appropriate field selector based on the API version being used to communicate with the server.
// The returned field selector can be used with List and Watch to filter desired events. // The returned field selector can be used with List and Watch to filter desired events.
func (e *events) GetFieldSelector(involvedObjectName, involvedObjectNamespace, involvedObjectKind, involvedObjectUID *string) fields.Selector { func (e *events) GetFieldSelector(involvedObjectName, involvedObjectNamespace, involvedObjectKind, involvedObjectUID *string) fields.Selector {
apiVersion := e.client.APIVersion() apiVersion := e.client.APIVersion().String()
field := fields.Set{} field := fields.Set{}
if involvedObjectName != nil { if involvedObjectName != nil {
field[getInvolvedObjectNameFieldLabel(apiVersion)] = *involvedObjectName field[getInvolvedObjectNameFieldLabel(apiVersion)] = *involvedObjectName

View File

@ -50,23 +50,23 @@ type RESTClient struct {
} }
func (c *RESTClient) Get() *unversioned.Request { func (c *RESTClient) Get() *unversioned.Request {
return unversioned.NewRequest(c, "GET", &url.URL{Host: "localhost"}, testapi.Default.Version(), c.Codec) return unversioned.NewRequest(c, "GET", &url.URL{Host: "localhost"}, *testapi.Default.GroupVersion(), c.Codec)
} }
func (c *RESTClient) Put() *unversioned.Request { func (c *RESTClient) Put() *unversioned.Request {
return unversioned.NewRequest(c, "PUT", &url.URL{Host: "localhost"}, testapi.Default.Version(), c.Codec) return unversioned.NewRequest(c, "PUT", &url.URL{Host: "localhost"}, *testapi.Default.GroupVersion(), c.Codec)
} }
func (c *RESTClient) Patch(_ api.PatchType) *unversioned.Request { func (c *RESTClient) Patch(_ api.PatchType) *unversioned.Request {
return unversioned.NewRequest(c, "PATCH", &url.URL{Host: "localhost"}, testapi.Default.Version(), c.Codec) return unversioned.NewRequest(c, "PATCH", &url.URL{Host: "localhost"}, *testapi.Default.GroupVersion(), c.Codec)
} }
func (c *RESTClient) Post() *unversioned.Request { func (c *RESTClient) Post() *unversioned.Request {
return unversioned.NewRequest(c, "POST", &url.URL{Host: "localhost"}, testapi.Default.Version(), c.Codec) return unversioned.NewRequest(c, "POST", &url.URL{Host: "localhost"}, *testapi.Default.GroupVersion(), c.Codec)
} }
func (c *RESTClient) Delete() *unversioned.Request { func (c *RESTClient) Delete() *unversioned.Request {
return unversioned.NewRequest(c, "DELETE", &url.URL{Host: "localhost"}, testapi.Default.Version(), c.Codec) return unversioned.NewRequest(c, "DELETE", &url.URL{Host: "localhost"}, *testapi.Default.GroupVersion(), c.Codec)
} }
func (c *RESTClient) Do(req *http.Request) (*http.Response, error) { func (c *RESTClient) Do(req *http.Request) (*http.Response, error) {

View File

@ -397,7 +397,7 @@ func RESTClientFor(config *Config) (*RESTClient, error) {
return nil, err return nil, err
} }
client := NewRESTClient(baseURL, config.GroupVersion.String(), config.Codec, config.QPS, config.Burst) client := NewRESTClient(baseURL, *config.GroupVersion, config.Codec, config.QPS, config.Burst)
transport, err := TransportFor(config) transport, err := TransportFor(config)
if err != nil { if err != nil {
@ -422,7 +422,7 @@ func UnversionedRESTClientFor(config *Config) (*RESTClient, error) {
return nil, err return nil, err
} }
client := NewRESTClient(baseURL, "", config.Codec, config.QPS, config.Burst) client := NewRESTClient(baseURL, unversioned.SchemeGroupVersion, config.Codec, config.QPS, config.Burst)
transport, err := TransportFor(config) transport, err := TransportFor(config)
if err != nil { if err != nil {

View File

@ -73,7 +73,7 @@ func (c *horizontalPodAutoscalers) Delete(name string, options *api.DeleteOption
if options == nil { if options == nil {
return c.client.Delete().Namespace(c.ns).Resource("horizontalPodAutoscalers").Name(name).Do().Error() return c.client.Delete().Namespace(c.ns).Resource("horizontalPodAutoscalers").Name(name).Do().Error()
} }
body, err := api.Scheme.EncodeToVersion(options, c.client.APIVersion()) body, err := api.Scheme.EncodeToVersion(options, c.client.APIVersion().String())
if err != nil { if err != nil {
return err return err
} }

View File

@ -84,7 +84,7 @@ func (c *ingress) Delete(name string, options *api.DeleteOptions) (err error) {
return c.r.Delete().Namespace(c.ns).Resource("ingresses").Name(name).Do().Error() return c.r.Delete().Namespace(c.ns).Resource("ingresses").Name(name).Do().Error()
} }
body, err := api.Scheme.EncodeToVersion(options, c.r.APIVersion()) body, err := api.Scheme.EncodeToVersion(options, c.r.APIVersion().String())
if err != nil { if err != nil {
return err return err
} }

View File

@ -71,7 +71,7 @@ func (c *podTemplates) Delete(name string, options *api.DeleteOptions) error {
if options == nil { if options == nil {
return c.r.Delete().Namespace(c.ns).Resource("podTemplates").Name(name).Do().Error() return c.r.Delete().Namespace(c.ns).Resource("podTemplates").Name(name).Do().Error()
} }
body, err := api.Scheme.EncodeToVersion(options, c.r.APIVersion()) body, err := api.Scheme.EncodeToVersion(options, c.r.APIVersion().String())
if err != nil { if err != nil {
return err return err
} }

View File

@ -74,7 +74,7 @@ func (c *pods) Delete(name string, options *api.DeleteOptions) error {
if options == nil { if options == nil {
return c.r.Delete().Namespace(c.ns).Resource("pods").Name(name).Do().Error() return c.r.Delete().Namespace(c.ns).Resource("pods").Name(name).Do().Error()
} }
body, err := api.Scheme.EncodeToVersion(options, c.r.APIVersion()) body, err := api.Scheme.EncodeToVersion(options, c.r.APIVersion().String())
if err != nil { if err != nil {
return err return err
} }

View File

@ -28,6 +28,7 @@ import (
"testing" "testing"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned"
client "k8s.io/kubernetes/pkg/client/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/util/httpstream" "k8s.io/kubernetes/pkg/util/httpstream"
"k8s.io/kubernetes/pkg/util/httpstream/spdy" "k8s.io/kubernetes/pkg/util/httpstream/spdy"
@ -189,7 +190,7 @@ func TestRequestExecuteRemoteCommand(t *testing.T) {
server := httptest.NewServer(fakeExecServer(t, i, testCase.Stdin, testCase.Stdout, testCase.Stderr, testCase.Error, testCase.Tty, testCase.MessageCount)) server := httptest.NewServer(fakeExecServer(t, i, testCase.Stdin, testCase.Stdout, testCase.Stderr, testCase.Error, testCase.Tty, testCase.MessageCount))
url, _ := url.ParseRequestURI(server.URL) url, _ := url.ParseRequestURI(server.URL)
c := client.NewRESTClient(url, "x", nil, -1, -1) c := client.NewRESTClient(url, unversioned.GroupVersion{Group: "x"}, nil, -1, -1)
req := c.Post().Resource("testing") req := c.Post().Resource("testing")
req.SetHeader(httpstream.HeaderProtocolVersion, StreamProtocolV2Name) req.SetHeader(httpstream.HeaderProtocolVersion, StreamProtocolV2Name)
req.Param("command", "ls") req.Param("command", "ls")
@ -271,7 +272,7 @@ func TestRequestAttachRemoteCommand(t *testing.T) {
server := httptest.NewServer(fakeExecServer(t, i, testCase.Stdin, testCase.Stdout, testCase.Stderr, testCase.Error, testCase.Tty, 1)) server := httptest.NewServer(fakeExecServer(t, i, testCase.Stdin, testCase.Stdout, testCase.Stderr, testCase.Error, testCase.Tty, 1))
url, _ := url.ParseRequestURI(server.URL) url, _ := url.ParseRequestURI(server.URL)
c := client.NewRESTClient(url, "x", nil, -1, -1) c := client.NewRESTClient(url, unversioned.GroupVersion{Group: "x"}, nil, -1, -1)
req := c.Post().Resource("testing") req := c.Post().Resource("testing")
conf := &client.Config{ conf := &client.Config{

View File

@ -32,6 +32,7 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/api/validation"
"k8s.io/kubernetes/pkg/client/metrics" "k8s.io/kubernetes/pkg/client/metrics"
"k8s.io/kubernetes/pkg/conversion/queryparams" "k8s.io/kubernetes/pkg/conversion/queryparams"
@ -99,7 +100,7 @@ type Request struct {
selector labels.Selector selector labels.Selector
timeout time.Duration timeout time.Duration
apiVersion string groupVersion unversioned.GroupVersion
// output // output
err error err error
@ -111,15 +112,14 @@ type Request struct {
} }
// NewRequest creates a new request helper object for accessing runtime.Objects on a server. // NewRequest creates a new request helper object for accessing runtime.Objects on a server.
func NewRequest(client HTTPClient, verb string, baseURL *url.URL, apiVersion string, func NewRequest(client HTTPClient, verb string, baseURL *url.URL, groupVersion unversioned.GroupVersion, codec runtime.Codec) *Request {
codec runtime.Codec) *Request {
return &Request{ return &Request{
client: client, client: client,
verb: verb, verb: verb,
baseURL: baseURL, baseURL: baseURL,
path: baseURL.Path, path: baseURL.Path,
apiVersion: apiVersion, groupVersion: groupVersion,
codec: codec, codec: codec,
} }
} }
@ -308,25 +308,25 @@ func (r resourceTypeToFieldMapping) filterField(resourceType, field, value strin
return fMapping.filterField(field, value) return fMapping.filterField(field, value)
} }
type versionToResourceToFieldMapping map[string]resourceTypeToFieldMapping type versionToResourceToFieldMapping map[unversioned.GroupVersion]resourceTypeToFieldMapping
func (v versionToResourceToFieldMapping) filterField(apiVersion, resourceType, field, value string) (newField, newValue string, err error) { func (v versionToResourceToFieldMapping) filterField(groupVersion unversioned.GroupVersion, resourceType, field, value string) (newField, newValue string, err error) {
rMapping, ok := v[apiVersion] rMapping, ok := v[groupVersion]
if !ok { if !ok {
glog.Warningf("Field selector: %v - %v - %v - %v: need to check if this is versioned correctly.", apiVersion, resourceType, field, value) glog.Warningf("Field selector: %v - %v - %v - %v: need to check if this is versioned correctly.", groupVersion, resourceType, field, value)
return field, value, nil return field, value, nil
} }
newField, newValue, err = rMapping.filterField(resourceType, field, value) newField, newValue, err = rMapping.filterField(resourceType, field, value)
if err != nil { if err != nil {
// This is only a warning until we find and fix all of the client's usages. // This is only a warning until we find and fix all of the client's usages.
glog.Warningf("Field selector: %v - %v - %v - %v: need to check if this is versioned correctly.", apiVersion, resourceType, field, value) glog.Warningf("Field selector: %v - %v - %v - %v: need to check if this is versioned correctly.", groupVersion, resourceType, field, value)
return field, value, nil return field, value, nil
} }
return newField, newValue, nil return newField, newValue, nil
} }
var fieldMappings = versionToResourceToFieldMapping{ var fieldMappings = versionToResourceToFieldMapping{
"v1": resourceTypeToFieldMapping{ v1.SchemeGroupVersion: resourceTypeToFieldMapping{
"nodes": clientFieldNameToAPIVersionFieldName{ "nodes": clientFieldNameToAPIVersionFieldName{
ObjectNameField: ObjectNameField, ObjectNameField: ObjectNameField,
NodeUnschedulable: NodeUnschedulable, NodeUnschedulable: NodeUnschedulable,
@ -371,13 +371,13 @@ func (r *Request) FieldsSelectorParam(s fields.Selector) *Request {
return r return r
} }
s2, err := s.Transform(func(field, value string) (newField, newValue string, err error) { s2, err := s.Transform(func(field, value string) (newField, newValue string, err error) {
return fieldMappings.filterField(r.apiVersion, r.resource, field, value) return fieldMappings.filterField(r.groupVersion, r.resource, field, value)
}) })
if err != nil { if err != nil {
r.err = err r.err = err
return r return r
} }
return r.setParam(unversioned.FieldSelectorQueryParam(r.apiVersion), s2.String()) return r.setParam(unversioned.FieldSelectorQueryParam(r.groupVersion.String()), s2.String())
} }
// LabelsSelectorParam adds the given selector as a query parameter // LabelsSelectorParam adds the given selector as a query parameter
@ -391,7 +391,7 @@ func (r *Request) LabelsSelectorParam(s labels.Selector) *Request {
if s.Empty() { if s.Empty() {
return r return r
} }
return r.setParam(unversioned.LabelSelectorQueryParam(r.apiVersion), s.String()) return r.setParam(unversioned.LabelSelectorQueryParam(r.groupVersion.String()), s.String())
} }
// UintParam creates a query parameter with the given value. // UintParam creates a query parameter with the given value.
@ -417,7 +417,7 @@ func (r *Request) VersionedParams(obj runtime.Object, convertor runtime.ObjectCo
if r.err != nil { if r.err != nil {
return r return r
} }
versioned, err := convertor.ConvertToVersion(obj, r.apiVersion) versioned, err := convertor.ConvertToVersion(obj, r.groupVersion.String())
if err != nil { if err != nil {
r.err = err r.err = err
return r return r
@ -431,14 +431,14 @@ func (r *Request) VersionedParams(obj runtime.Object, convertor runtime.ObjectCo
for _, value := range v { for _, value := range v {
// TODO: Move it to setParam method, once we get rid of // TODO: Move it to setParam method, once we get rid of
// FieldSelectorParam & LabelSelectorParam methods. // FieldSelectorParam & LabelSelectorParam methods.
if k == unversioned.LabelSelectorQueryParam(r.apiVersion) && value == "" { if k == unversioned.LabelSelectorQueryParam(r.groupVersion.String()) && value == "" {
// Don't set an empty selector for backward compatibility. // Don't set an empty selector for backward compatibility.
// Since there is no way to get the difference between empty // Since there is no way to get the difference between empty
// and unspecified string, we don't set it to avoid having // and unspecified string, we don't set it to avoid having
// labelSelector= param in every request. // labelSelector= param in every request.
continue continue
} }
if k == unversioned.FieldSelectorQueryParam(r.apiVersion) { if k == unversioned.FieldSelectorQueryParam(r.groupVersion.String()) {
if value == "" { if value == "" {
// Don't set an empty selector for backward compatibility. // Don't set an empty selector for backward compatibility.
// Since there is no way to get the difference between empty // Since there is no way to get the difference between empty
@ -454,7 +454,7 @@ func (r *Request) VersionedParams(obj runtime.Object, convertor runtime.ObjectCo
} }
filteredSelector, err := selector.Transform( filteredSelector, err := selector.Transform(
func(field, value string) (newField, newValue string, err error) { func(field, value string) (newField, newValue string, err error) {
return fieldMappings.filterField(r.apiVersion, r.resource, field, value) return fieldMappings.filterField(r.groupVersion, r.resource, field, value)
}) })
if err != nil { if err != nil {
r.err = fmt.Errorf("untransformable field selector: %v", err) r.err = fmt.Errorf("untransformable field selector: %v", err)

View File

@ -34,6 +34,7 @@ import (
apierrors "k8s.io/kubernetes/pkg/api/errors" apierrors "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util"
@ -45,8 +46,8 @@ import (
func TestRequestWithErrorWontChange(t *testing.T) { func TestRequestWithErrorWontChange(t *testing.T) {
original := Request{ original := Request{
err: errors.New("test"), err: errors.New("test"),
apiVersion: testapi.Default.Version(), groupVersion: *testapi.Default.GroupVersion(),
} }
r := original r := original
changed := r.Param("foo", "bar"). changed := r.Param("foo", "bar").
@ -177,7 +178,7 @@ func TestRequestParam(t *testing.T) {
} }
func TestRequestVersionedParams(t *testing.T) { func TestRequestVersionedParams(t *testing.T) {
r := (&Request{apiVersion: "v1"}).Param("foo", "a") r := (&Request{groupVersion: v1.SchemeGroupVersion}).Param("foo", "a")
if !reflect.DeepEqual(r.params, url.Values{"foo": []string{"a"}}) { if !reflect.DeepEqual(r.params, url.Values{"foo": []string{"a"}}) {
t.Errorf("should have set a param: %#v", r) t.Errorf("should have set a param: %#v", r)
} }
@ -193,7 +194,7 @@ func TestRequestVersionedParams(t *testing.T) {
} }
func TestRequestVersionedParamsFromListOptions(t *testing.T) { func TestRequestVersionedParamsFromListOptions(t *testing.T) {
r := &Request{apiVersion: "v1"} r := &Request{groupVersion: v1.SchemeGroupVersion}
r.VersionedParams(&unversioned.ListOptions{ResourceVersion: "1"}, api.Scheme) r.VersionedParams(&unversioned.ListOptions{ResourceVersion: "1"}, api.Scheme)
if !reflect.DeepEqual(r.params, url.Values{ if !reflect.DeepEqual(r.params, url.Values{
"resourceVersion": []string{"1"}, "resourceVersion": []string{"1"},
@ -261,7 +262,7 @@ func TestResultIntoWithErrReturnsErr(t *testing.T) {
func TestURLTemplate(t *testing.T) { func TestURLTemplate(t *testing.T) {
uri, _ := url.Parse("http://localhost") uri, _ := url.Parse("http://localhost")
r := NewRequest(nil, "POST", uri, "test", nil) r := NewRequest(nil, "POST", uri, unversioned.GroupVersion{Group: "test"}, nil)
r.Prefix("pre1").Resource("r1").Namespace("ns").Name("nm").Param("p0", "v0") r.Prefix("pre1").Resource("r1").Namespace("ns").Name("nm").Param("p0", "v0")
full := r.URL() full := r.URL()
if full.String() != "http://localhost/pre1/namespaces/ns/r1/nm?p0=v0" { if full.String() != "http://localhost/pre1/namespaces/ns/r1/nm?p0=v0" {
@ -322,7 +323,7 @@ func TestTransformResponse(t *testing.T) {
{Response: &http.Response{StatusCode: 200, Body: ioutil.NopCloser(bytes.NewReader(invalid))}, Data: invalid}, {Response: &http.Response{StatusCode: 200, Body: ioutil.NopCloser(bytes.NewReader(invalid))}, Data: invalid},
} }
for i, test := range testCases { for i, test := range testCases {
r := NewRequest(nil, "", uri, testapi.Default.Version(), testapi.Default.Codec()) r := NewRequest(nil, "", uri, *testapi.Default.GroupVersion(), testapi.Default.Codec())
if test.Response.Body == nil { if test.Response.Body == nil {
test.Response.Body = ioutil.NopCloser(bytes.NewReader([]byte{})) test.Response.Body = ioutil.NopCloser(bytes.NewReader([]byte{}))
} }
@ -1029,7 +1030,7 @@ func TestUintParam(t *testing.T) {
for _, item := range table { for _, item := range table {
u, _ := url.Parse("http://localhost") u, _ := url.Parse("http://localhost")
r := NewRequest(nil, "GET", u, "test", nil).AbsPath("").UintParam(item.name, item.testVal) r := NewRequest(nil, "GET", u, unversioned.GroupVersion{Group: "test"}, nil).AbsPath("").UintParam(item.name, item.testVal)
if e, a := item.expectStr, r.URL().String(); e != a { if e, a := item.expectStr, r.URL().String(); e != a {
t.Errorf("expected %v, got %v", e, a) t.Errorf("expected %v, got %v", e, a)
} }
@ -1200,5 +1201,5 @@ func testRESTClient(t testing.TB, srv *httptest.Server) *RESTClient {
} }
} }
baseURL.Path = testapi.Default.ResourcePath("", "", "") baseURL.Path = testapi.Default.ResourcePath("", "", "")
return NewRESTClient(baseURL, testapi.Default.GroupVersion().String(), testapi.Default.Codec(), 0, 0) return NewRESTClient(baseURL, *testapi.Default.GroupVersion(), testapi.Default.Codec(), 0, 0)
} }

View File

@ -22,6 +22,7 @@ import (
"strings" "strings"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util"
) )
@ -36,7 +37,7 @@ import (
type RESTClient struct { type RESTClient struct {
baseURL *url.URL baseURL *url.URL
// A string identifying the version of the API this client is expected to use. // A string identifying the version of the API this client is expected to use.
apiVersion string groupVersion unversioned.GroupVersion
// Codec is the encoding and decoding scheme that applies to a particular set of // Codec is the encoding and decoding scheme that applies to a particular set of
// REST resources. // REST resources.
@ -53,7 +54,7 @@ type RESTClient struct {
// NewRESTClient creates a new RESTClient. This client performs generic REST functions // 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 // such as Get, Put, Post, and Delete on specified paths. Codec controls encoding and
// decoding of responses from the server. // decoding of responses from the server.
func NewRESTClient(baseURL *url.URL, apiVersion string, c runtime.Codec, maxQPS float32, maxBurst int) *RESTClient { func NewRESTClient(baseURL *url.URL, groupVersion unversioned.GroupVersion, c runtime.Codec, maxQPS float32, maxBurst int) *RESTClient {
base := *baseURL base := *baseURL
if !strings.HasSuffix(base.Path, "/") { if !strings.HasSuffix(base.Path, "/") {
base.Path += "/" base.Path += "/"
@ -66,10 +67,10 @@ func NewRESTClient(baseURL *url.URL, apiVersion string, c runtime.Codec, maxQPS
throttle = util.NewTokenBucketRateLimiter(maxQPS, maxBurst) throttle = util.NewTokenBucketRateLimiter(maxQPS, maxBurst)
} }
return &RESTClient{ return &RESTClient{
baseURL: &base, baseURL: &base,
apiVersion: apiVersion, groupVersion: groupVersion,
Codec: c, Codec: c,
Throttle: throttle, Throttle: throttle,
} }
} }
@ -90,9 +91,9 @@ func (c *RESTClient) Verb(verb string) *Request {
c.Throttle.Accept() c.Throttle.Accept()
} }
if c.Client == nil { if c.Client == nil {
return NewRequest(nil, verb, c.baseURL, c.apiVersion, c.Codec) return NewRequest(nil, verb, c.baseURL, c.groupVersion, c.Codec)
} }
return NewRequest(c.Client, verb, c.baseURL, c.apiVersion, c.Codec) return NewRequest(c.Client, verb, c.baseURL, c.groupVersion, c.Codec)
} }
// Post begins a POST request. Short for c.Verb("POST"). // Post begins a POST request. Short for c.Verb("POST").
@ -121,6 +122,6 @@ func (c *RESTClient) Delete() *Request {
} }
// APIVersion returns the APIVersion this RESTClient is expected to use. // APIVersion returns the APIVersion this RESTClient is expected to use.
func (c *RESTClient) APIVersion() string { func (c *RESTClient) APIVersion() unversioned.GroupVersion {
return c.apiVersion return c.groupVersion
} }