mirror of
https://github.com/kubernetes/client-go.git
synced 2025-06-22 13:17:07 +00:00
client-go/rest: fix finalURLTemplate for url base == "/"
In some environments, where url base is "/", it can cause all paths to be presented in metrics with "{prefix}" as `groupIndex` is with the wrong index. To fix the behavior in such environments, it was added a conditional branch to check if the URL base is "/" and, thus, print the metrics with the correct path, for example "api/v1/nodes/{name}" instead of "{prefix}". Fixes: 99248b8fe1fe ("Rewrite finalURLTemplate used only for metrics because of dynamic client change") Signed-off-by: André Martins <aanm90@gmail.com> Kubernetes-commit: c039b02fa7281fc061455e23b6530ed8b4d19645
This commit is contained in:
parent
1eb2027cd5
commit
2396a52017
@ -511,13 +511,23 @@ func (r Request) finalURLTemplate() url.URL {
|
|||||||
}
|
}
|
||||||
r.params = newParams
|
r.params = newParams
|
||||||
url := r.URL()
|
url := r.URL()
|
||||||
segments := strings.Split(r.URL().Path, "/")
|
|
||||||
|
segments := strings.Split(url.Path, "/")
|
||||||
groupIndex := 0
|
groupIndex := 0
|
||||||
index := 0
|
index := 0
|
||||||
if r.URL() != nil && r.c.base != nil && strings.Contains(r.URL().Path, r.c.base.Path) {
|
trimmedBasePath := ""
|
||||||
groupIndex += len(strings.Split(r.c.base.Path, "/"))
|
if url != nil && r.c.base != nil && strings.Contains(url.Path, r.c.base.Path) {
|
||||||
|
p := strings.TrimPrefix(url.Path, r.c.base.Path)
|
||||||
|
if !strings.HasPrefix(p, "/") {
|
||||||
|
p = "/" + p
|
||||||
|
}
|
||||||
|
// store the base path that we have trimmed so we can append it
|
||||||
|
// before returning the URL
|
||||||
|
trimmedBasePath = r.c.base.Path
|
||||||
|
segments = strings.Split(p, "/")
|
||||||
|
groupIndex = 1
|
||||||
}
|
}
|
||||||
if groupIndex >= len(segments) {
|
if len(segments) <= 2 {
|
||||||
return *url
|
return *url
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -563,7 +573,7 @@ func (r Request) finalURLTemplate() url.URL {
|
|||||||
segments[index+3] = "{name}"
|
segments[index+3] = "{name}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
url.Path = path.Join(segments...)
|
url.Path = path.Join(trimmedBasePath, path.Join(segments...))
|
||||||
return *url
|
return *url
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -338,6 +338,7 @@ func TestResultIntoWithNoBodyReturnsErr(t *testing.T) {
|
|||||||
|
|
||||||
func TestURLTemplate(t *testing.T) {
|
func TestURLTemplate(t *testing.T) {
|
||||||
uri, _ := url.Parse("http://localhost/some/base/url/path")
|
uri, _ := url.Parse("http://localhost/some/base/url/path")
|
||||||
|
uriSingleSlash, _ := url.Parse("http://localhost/")
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
Request *Request
|
Request *Request
|
||||||
ExpectedFullURL string
|
ExpectedFullURL string
|
||||||
@ -485,6 +486,38 @@ func TestURLTemplate(t *testing.T) {
|
|||||||
ExpectedFullURL: "http://localhost/some/base/url/path/pre1/namespaces/namespaces/namespaces/namespaces/namespaces/namespaces/finalize",
|
ExpectedFullURL: "http://localhost/some/base/url/path/pre1/namespaces/namespaces/namespaces/namespaces/namespaces/namespaces/finalize",
|
||||||
ExpectedFinalURL: "http://localhost/%7Bprefix%7D",
|
ExpectedFinalURL: "http://localhost/%7Bprefix%7D",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// dynamic client with core group + namespace + resourceResource (with name) where baseURL is a single /
|
||||||
|
// /api/$RESOURCEVERSION/namespaces/$NAMESPACE/$RESOURCE/%NAME
|
||||||
|
Request: NewRequestWithClient(uriSingleSlash, "", ClientContentConfig{GroupVersion: schema.GroupVersion{Group: "test"}}, nil).Verb("DELETE").
|
||||||
|
Prefix("/api/v1/namespaces/ns/r2/name1"),
|
||||||
|
ExpectedFullURL: "http://localhost/api/v1/namespaces/ns/r2/name1",
|
||||||
|
ExpectedFinalURL: "http://localhost/api/v1/namespaces/%7Bnamespace%7D/r2/%7Bname%7D",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// dynamic client with core group + namespace + resourceResource (with name) where baseURL is 'some/base/url/path'
|
||||||
|
// /api/$RESOURCEVERSION/namespaces/$NAMESPACE/$RESOURCE/%NAME
|
||||||
|
Request: NewRequestWithClient(uri, "", ClientContentConfig{GroupVersion: schema.GroupVersion{Group: "test"}}, nil).Verb("DELETE").
|
||||||
|
Prefix("/api/v1/namespaces/ns/r3/name1"),
|
||||||
|
ExpectedFullURL: "http://localhost/some/base/url/path/api/v1/namespaces/ns/r3/name1",
|
||||||
|
ExpectedFinalURL: "http://localhost/some/base/url/path/api/v1/namespaces/%7Bnamespace%7D/r3/%7Bname%7D",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// dynamic client where baseURL is a single /
|
||||||
|
// /
|
||||||
|
Request: NewRequestWithClient(uriSingleSlash, "", ClientContentConfig{GroupVersion: schema.GroupVersion{Group: "test"}}, nil).Verb("DELETE").
|
||||||
|
Prefix("/"),
|
||||||
|
ExpectedFullURL: "http://localhost/",
|
||||||
|
ExpectedFinalURL: "http://localhost/",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// dynamic client where baseURL is a single /
|
||||||
|
// /version
|
||||||
|
Request: NewRequestWithClient(uriSingleSlash, "", ClientContentConfig{GroupVersion: schema.GroupVersion{Group: "test"}}, nil).Verb("DELETE").
|
||||||
|
Prefix("/version"),
|
||||||
|
ExpectedFullURL: "http://localhost/version",
|
||||||
|
ExpectedFinalURL: "http://localhost/version",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
for i, testCase := range testCases {
|
for i, testCase := range testCases {
|
||||||
r := testCase.Request
|
r := testCase.Request
|
||||||
|
Loading…
Reference in New Issue
Block a user