add UnversionedPath() to fix ServerAPIVersions()

This commit is contained in:
James DeFelice 2015-06-09 17:23:42 +00:00
parent 79bb4eda46
commit b5583db1d2
3 changed files with 62 additions and 1 deletions

View File

@ -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
}

View File

@ -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 {

View File

@ -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{})