mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-22 19:31:44 +00:00
Merge pull request #112772 from liggitt/discovery-redirect
Avoid following redirects in aggregator availability controller
This commit is contained in:
commit
7c64250cd0
@ -264,6 +264,9 @@ func (c *AvailableConditionController) sync(key string) error {
|
|||||||
Transport: restTransport,
|
Transport: restTransport,
|
||||||
// the request should happen quickly.
|
// the request should happen quickly.
|
||||||
Timeout: 5 * time.Second,
|
Timeout: 5 * time.Second,
|
||||||
|
CheckRedirect: func(req *http.Request, via []*http.Request) error {
|
||||||
|
return http.ErrUseLastResponse
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
apiService := originalAPIService.DeepCopy()
|
apiService := originalAPIService.DeepCopy()
|
||||||
|
@ -258,11 +258,12 @@ func TestSync(t *testing.T) {
|
|||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
|
|
||||||
apiServiceName string
|
apiServiceName string
|
||||||
apiServices []*apiregistration.APIService
|
apiServices []*apiregistration.APIService
|
||||||
services []*v1.Service
|
services []*v1.Service
|
||||||
endpoints []*v1.Endpoints
|
endpoints []*v1.Endpoints
|
||||||
forceDiscoveryFail bool
|
backendStatus int
|
||||||
|
backendLocation string
|
||||||
|
|
||||||
expectedAvailability apiregistration.APIServiceCondition
|
expectedAvailability apiregistration.APIServiceCondition
|
||||||
}{
|
}{
|
||||||
@ -270,6 +271,7 @@ func TestSync(t *testing.T) {
|
|||||||
name: "local",
|
name: "local",
|
||||||
apiServiceName: "local.group",
|
apiServiceName: "local.group",
|
||||||
apiServices: []*apiregistration.APIService{newLocalAPIService("local.group")},
|
apiServices: []*apiregistration.APIService{newLocalAPIService("local.group")},
|
||||||
|
backendStatus: http.StatusOK,
|
||||||
expectedAvailability: apiregistration.APIServiceCondition{
|
expectedAvailability: apiregistration.APIServiceCondition{
|
||||||
Type: apiregistration.Available,
|
Type: apiregistration.Available,
|
||||||
Status: apiregistration.ConditionTrue,
|
Status: apiregistration.ConditionTrue,
|
||||||
@ -282,6 +284,7 @@ func TestSync(t *testing.T) {
|
|||||||
apiServiceName: "remote.group",
|
apiServiceName: "remote.group",
|
||||||
apiServices: []*apiregistration.APIService{newRemoteAPIService("remote.group")},
|
apiServices: []*apiregistration.APIService{newRemoteAPIService("remote.group")},
|
||||||
services: []*v1.Service{newService("foo", "not-bar", testServicePort, testServicePortName)},
|
services: []*v1.Service{newService("foo", "not-bar", testServicePort, testServicePortName)},
|
||||||
|
backendStatus: http.StatusOK,
|
||||||
expectedAvailability: apiregistration.APIServiceCondition{
|
expectedAvailability: apiregistration.APIServiceCondition{
|
||||||
Type: apiregistration.Available,
|
Type: apiregistration.Available,
|
||||||
Status: apiregistration.ConditionFalse,
|
Status: apiregistration.ConditionFalse,
|
||||||
@ -302,7 +305,8 @@ func TestSync(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}},
|
}},
|
||||||
endpoints: []*v1.Endpoints{newEndpointsWithAddress("foo", "bar", testServicePort, testServicePortName)},
|
endpoints: []*v1.Endpoints{newEndpointsWithAddress("foo", "bar", testServicePort, testServicePortName)},
|
||||||
|
backendStatus: http.StatusOK,
|
||||||
expectedAvailability: apiregistration.APIServiceCondition{
|
expectedAvailability: apiregistration.APIServiceCondition{
|
||||||
Type: apiregistration.Available,
|
Type: apiregistration.Available,
|
||||||
Status: apiregistration.ConditionFalse,
|
Status: apiregistration.ConditionFalse,
|
||||||
@ -315,6 +319,7 @@ func TestSync(t *testing.T) {
|
|||||||
apiServiceName: "remote.group",
|
apiServiceName: "remote.group",
|
||||||
apiServices: []*apiregistration.APIService{newRemoteAPIService("remote.group")},
|
apiServices: []*apiregistration.APIService{newRemoteAPIService("remote.group")},
|
||||||
services: []*v1.Service{newService("foo", "bar", testServicePort, testServicePortName)},
|
services: []*v1.Service{newService("foo", "bar", testServicePort, testServicePortName)},
|
||||||
|
backendStatus: http.StatusOK,
|
||||||
expectedAvailability: apiregistration.APIServiceCondition{
|
expectedAvailability: apiregistration.APIServiceCondition{
|
||||||
Type: apiregistration.Available,
|
Type: apiregistration.Available,
|
||||||
Status: apiregistration.ConditionFalse,
|
Status: apiregistration.ConditionFalse,
|
||||||
@ -328,6 +333,7 @@ func TestSync(t *testing.T) {
|
|||||||
apiServices: []*apiregistration.APIService{newRemoteAPIService("remote.group")},
|
apiServices: []*apiregistration.APIService{newRemoteAPIService("remote.group")},
|
||||||
services: []*v1.Service{newService("foo", "bar", testServicePort, testServicePortName)},
|
services: []*v1.Service{newService("foo", "bar", testServicePort, testServicePortName)},
|
||||||
endpoints: []*v1.Endpoints{newEndpoints("foo", "bar")},
|
endpoints: []*v1.Endpoints{newEndpoints("foo", "bar")},
|
||||||
|
backendStatus: http.StatusOK,
|
||||||
expectedAvailability: apiregistration.APIServiceCondition{
|
expectedAvailability: apiregistration.APIServiceCondition{
|
||||||
Type: apiregistration.Available,
|
Type: apiregistration.Available,
|
||||||
Status: apiregistration.ConditionFalse,
|
Status: apiregistration.ConditionFalse,
|
||||||
@ -341,6 +347,7 @@ func TestSync(t *testing.T) {
|
|||||||
apiServices: []*apiregistration.APIService{newRemoteAPIService("remote.group")},
|
apiServices: []*apiregistration.APIService{newRemoteAPIService("remote.group")},
|
||||||
services: []*v1.Service{newService("foo", "bar", testServicePort, testServicePortName)},
|
services: []*v1.Service{newService("foo", "bar", testServicePort, testServicePortName)},
|
||||||
endpoints: []*v1.Endpoints{newEndpointsWithAddress("foo", "bar", testServicePort, "wrongName")},
|
endpoints: []*v1.Endpoints{newEndpointsWithAddress("foo", "bar", testServicePort, "wrongName")},
|
||||||
|
backendStatus: http.StatusOK,
|
||||||
expectedAvailability: apiregistration.APIServiceCondition{
|
expectedAvailability: apiregistration.APIServiceCondition{
|
||||||
Type: apiregistration.Available,
|
Type: apiregistration.Available,
|
||||||
Status: apiregistration.ConditionFalse,
|
Status: apiregistration.ConditionFalse,
|
||||||
@ -354,6 +361,7 @@ func TestSync(t *testing.T) {
|
|||||||
apiServices: []*apiregistration.APIService{newRemoteAPIService("remote.group")},
|
apiServices: []*apiregistration.APIService{newRemoteAPIService("remote.group")},
|
||||||
services: []*v1.Service{newService("foo", "bar", testServicePort, testServicePortName)},
|
services: []*v1.Service{newService("foo", "bar", testServicePort, testServicePortName)},
|
||||||
endpoints: []*v1.Endpoints{newEndpointsWithAddress("foo", "bar", testServicePort, testServicePortName)},
|
endpoints: []*v1.Endpoints{newEndpointsWithAddress("foo", "bar", testServicePort, testServicePortName)},
|
||||||
|
backendStatus: http.StatusOK,
|
||||||
expectedAvailability: apiregistration.APIServiceCondition{
|
expectedAvailability: apiregistration.APIServiceCondition{
|
||||||
Type: apiregistration.Available,
|
Type: apiregistration.Available,
|
||||||
Status: apiregistration.ConditionTrue,
|
Status: apiregistration.ConditionTrue,
|
||||||
@ -362,12 +370,41 @@ func TestSync(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "remote-bad-return",
|
name: "remote-bad-return",
|
||||||
apiServiceName: "remote.group",
|
apiServiceName: "remote.group",
|
||||||
apiServices: []*apiregistration.APIService{newRemoteAPIService("remote.group")},
|
apiServices: []*apiregistration.APIService{newRemoteAPIService("remote.group")},
|
||||||
services: []*v1.Service{newService("foo", "bar", testServicePort, testServicePortName)},
|
services: []*v1.Service{newService("foo", "bar", testServicePort, testServicePortName)},
|
||||||
endpoints: []*v1.Endpoints{newEndpointsWithAddress("foo", "bar", testServicePort, testServicePortName)},
|
endpoints: []*v1.Endpoints{newEndpointsWithAddress("foo", "bar", testServicePort, testServicePortName)},
|
||||||
forceDiscoveryFail: true,
|
backendStatus: http.StatusForbidden,
|
||||||
|
expectedAvailability: apiregistration.APIServiceCondition{
|
||||||
|
Type: apiregistration.Available,
|
||||||
|
Status: apiregistration.ConditionFalse,
|
||||||
|
Reason: "FailedDiscoveryCheck",
|
||||||
|
Message: `failing or missing response from`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "remote-redirect",
|
||||||
|
apiServiceName: "remote.group",
|
||||||
|
apiServices: []*apiregistration.APIService{newRemoteAPIService("remote.group")},
|
||||||
|
services: []*v1.Service{newService("foo", "bar", testServicePort, testServicePortName)},
|
||||||
|
endpoints: []*v1.Endpoints{newEndpointsWithAddress("foo", "bar", testServicePort, testServicePortName)},
|
||||||
|
backendStatus: http.StatusFound,
|
||||||
|
backendLocation: "/test",
|
||||||
|
expectedAvailability: apiregistration.APIServiceCondition{
|
||||||
|
Type: apiregistration.Available,
|
||||||
|
Status: apiregistration.ConditionFalse,
|
||||||
|
Reason: "FailedDiscoveryCheck",
|
||||||
|
Message: `failing or missing response from`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "remote-304",
|
||||||
|
apiServiceName: "remote.group",
|
||||||
|
apiServices: []*apiregistration.APIService{newRemoteAPIService("remote.group")},
|
||||||
|
services: []*v1.Service{newService("foo", "bar", testServicePort, testServicePortName)},
|
||||||
|
endpoints: []*v1.Endpoints{newEndpointsWithAddress("foo", "bar", testServicePort, testServicePortName)},
|
||||||
|
backendStatus: http.StatusNotModified,
|
||||||
expectedAvailability: apiregistration.APIServiceCondition{
|
expectedAvailability: apiregistration.APIServiceCondition{
|
||||||
Type: apiregistration.Available,
|
Type: apiregistration.Available,
|
||||||
Status: apiregistration.ConditionFalse,
|
Status: apiregistration.ConditionFalse,
|
||||||
@ -394,10 +431,10 @@ func TestSync(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
if !tc.forceDiscoveryFail {
|
if tc.backendLocation != "" {
|
||||||
w.WriteHeader(http.StatusOK)
|
w.Header().Set("Location", tc.backendLocation)
|
||||||
}
|
}
|
||||||
w.WriteHeader(http.StatusForbidden)
|
w.WriteHeader(tc.backendStatus)
|
||||||
}))
|
}))
|
||||||
defer testServer.Close()
|
defer testServer.Close()
|
||||||
|
|
||||||
|
@ -392,7 +392,7 @@ func TestAggregatedAPIServerRejectRedirectResponse(t *testing.T) {
|
|||||||
if strings.HasSuffix(r.URL.Path, "tryRedirect") {
|
if strings.HasSuffix(r.URL.Path, "tryRedirect") {
|
||||||
http.Redirect(w, r, redirectedURL+"/redirectTarget", http.StatusMovedPermanently)
|
http.Redirect(w, r, redirectedURL+"/redirectTarget", http.StatusMovedPermanently)
|
||||||
} else {
|
} else {
|
||||||
http.Redirect(w, r, redirectedURL, http.StatusMovedPermanently)
|
w.WriteHeader(http.StatusOK)
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
defer redirectServer.Close()
|
defer redirectServer.Close()
|
||||||
|
Loading…
Reference in New Issue
Block a user