diff --git a/pkg/client/client.go b/pkg/client/client.go index a5a51c61400..f0693294250 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -140,7 +140,7 @@ func (c *Client) ServerVersion() (*version.Info, error) { // ServerAPIVersions retrieves and parses the list of API versions the server supports. func (c *Client) ServerAPIVersions() (*api.APIVersions, error) { - body, err := c.Get().AbsPath("/api").Do().Raw() + body, err := c.Get().UnversionedPath("").Do().Raw() if err != nil { return nil, err } diff --git a/pkg/client/request.go b/pkg/client/request.go index 7c57f033de9..a5467dac6f4 100644 --- a/pkg/client/request.go +++ b/pkg/client/request.go @@ -210,6 +210,23 @@ func (r *Request) NamespaceIfScoped(namespace string, scoped bool) *Request { return r } +// UnversionedPath strips the apiVersion from the baseURL before appending segments. +func (r *Request) UnversionedPath(segments ...string) *Request { + if r.err != nil { + return r + } + upath := path.Clean(r.baseURL.Path) + //TODO(jdef) this is a pretty hackish version test + if strings.HasPrefix(path.Base(upath), "v") { + upath = path.Dir(upath) + if upath == "." { + upath = "/" + } + } + r.path = path.Join(append([]string{upath}, segments...)...) + return r +} + // AbsPath overwrites an existing path with the segments provided. Trailing slashes are preserved // when a single segment is passed. func (r *Request) AbsPath(segments ...string) *Request { diff --git a/pkg/client/request_test.go b/pkg/client/request_test.go index ea7f104a434..4b476ec8091 100644 --- a/pkg/client/request_test.go +++ b/pkg/client/request_test.go @@ -1005,6 +1005,50 @@ func TestVerbs(t *testing.T) { } } +func TestUnversionedPath(t *testing.T) { + tt := []struct { + host string + prefix string + unversioned string + expectedPath string + }{ + {"", "", "", "/api"}, + {"", "", "versions", "/api/versions"}, + {"", "/", "", "/"}, + {"", "/versions", "", "/versions"}, + {"", "/api", "", "/api"}, + {"", "/api/vfake", "", "/api/vfake"}, + {"", "/api/vfake", "v1beta100", "/api/vfake/v1beta100"}, + {"", "/api", "/versions", "/api/versions"}, + {"", "/api", "versions", "/api/versions"}, + {"", "/a/api", "", "/a/api"}, + {"", "/a/api", "/versions", "/a/api/versions"}, + {"", "/a/api", "/versions/d/e", "/a/api/versions/d/e"}, + {"", "/a/api/vfake", "/versions/d/e", "/a/api/vfake/versions/d/e"}, + } + for i, tc := range tt { + c := NewOrDie(&Config{Host: tc.host, Prefix: tc.prefix}) + r := c.Post().Prefix("/alpha").UnversionedPath(tc.unversioned) + if r.path != tc.expectedPath { + t.Errorf("test case %d failed: unexpected path: %s, expected %s", i+1, r.path, tc.expectedPath) + } + } + for i, tc := range tt { + c := NewOrDie(&Config{Host: tc.host, Prefix: tc.prefix, Version: "v1"}) + r := c.Post().Prefix("/alpha").UnversionedPath(tc.unversioned) + if r.path != tc.expectedPath { + t.Errorf("test case %d failed: unexpected path: %s, expected %s", i+1, r.path, tc.expectedPath) + } + } + for i, tc := range tt { + c := NewOrDie(&Config{Host: tc.host, Prefix: tc.prefix, Version: "v1beta3"}) + r := c.Post().Prefix("/alpha").UnversionedPath(tc.unversioned) + if r.path != tc.expectedPath { + t.Errorf("test case %d failed: unexpected path: %s, expected %s", i+1, r.path, tc.expectedPath) + } + } +} + func TestAbsPath(t *testing.T) { expectedPath := "/bar/foo" c := NewOrDie(&Config{})