From 34d69f4497f70867089d432ed4bcb535587e95ea Mon Sep 17 00:00:00 2001 From: Zach Loafman Date: Wed, 25 May 2016 14:23:46 -0700 Subject: [PATCH] Revert "GCE provider: Rate limit all API calls" This reverts commit 9b5cdfb705a9ed53f5bb376133a17e6b5c051311. --- pkg/cloudprovider/providers/gce/gce.go | 56 +++++++++------------ pkg/cloudprovider/providers/gce/gce_test.go | 32 ------------ 2 files changed, 23 insertions(+), 65 deletions(-) diff --git a/pkg/cloudprovider/providers/gce/gce.go b/pkg/cloudprovider/providers/gce/gce.go index 87d69c11748..20505d7098e 100644 --- a/pkg/cloudprovider/providers/gce/gce.go +++ b/pkg/cloudprovider/providers/gce/gce.go @@ -76,15 +76,16 @@ const ( // GCECloud is an implementation of Interface, LoadBalancer and Instances for Google Compute Engine. type GCECloud struct { - service *compute.Service - containerService *container.Service - projectID string - region string - localZone string // The zone in which we are running - managedZones []string // List of zones we are spanning (for Ubernetes-Lite, primarily when running on master) - networkURL string - nodeTags []string // List of tags to use on firewall rules for load balancers - useMetadataServer bool + service *compute.Service + containerService *container.Service + projectID string + region string + localZone string // The zone in which we are running + managedZones []string // List of zones we are spanning (for Ubernetes-Lite, primarily when running on master) + networkURL string + nodeTags []string // List of tags to use on firewall rules for load balancers + useMetadataServer bool + operationPollRateLimiter flowcontrol.RateLimiter } type Config struct { @@ -112,16 +113,6 @@ func (g *GCECloud) GetComputeService() *compute.Service { return g.service } -type rateLimitedRoundTripper struct { - rt http.RoundTripper - limiter flowcontrol.RateLimiter -} - -func (rl *rateLimitedRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { - rl.limiter.Accept() - return rl.rt.RoundTrip(req) -} - func getProjectAndZone() (string, string, error) { result, err := metadata.Get("instance/zone") if err != nil { @@ -292,11 +283,6 @@ func CreateGCECloud(projectID, region, zone string, managedZones []string, netwo } client := oauth2.NewClient(oauth2.NoContext, tokenSource) - // Override the transport to make it rate-limited. - client.Transport = &rateLimitedRoundTripper{ - rt: client.Transport, - limiter: flowcontrol.NewTokenBucketRateLimiter(10, 100), // 10 qps, 100 bucket size. - } svc, err := compute.New(client) if err != nil { return nil, err @@ -325,16 +311,19 @@ func CreateGCECloud(projectID, region, zone string, managedZones []string, netwo glog.Infof("managing multiple zones: %v", managedZones) } + operationPollRateLimiter := flowcontrol.NewTokenBucketRateLimiter(10, 100) // 10 qps, 100 bucket size. + return &GCECloud{ - service: svc, - containerService: containerSvc, - projectID: projectID, - region: region, - localZone: zone, - managedZones: managedZones, - networkURL: networkURL, - nodeTags: nodeTags, - useMetadataServer: useMetadataServer, + service: svc, + containerService: containerSvc, + projectID: projectID, + region: region, + localZone: zone, + managedZones: managedZones, + networkURL: networkURL, + nodeTags: nodeTags, + useMetadataServer: useMetadataServer, + operationPollRateLimiter: operationPollRateLimiter, }, nil } @@ -415,6 +404,7 @@ func (gce *GCECloud) waitForOp(op *compute.Operation, getOperation func(operatio opName := op.Name return wait.Poll(operationPollInterval, operationPollTimeoutDuration, func() (bool, error) { start := time.Now() + gce.operationPollRateLimiter.Accept() duration := time.Now().Sub(start) if duration > 5*time.Second { glog.Infof("pollOperation: waited %v for %v", duration, opName) diff --git a/pkg/cloudprovider/providers/gce/gce_test.go b/pkg/cloudprovider/providers/gce/gce_test.go index 633025e681e..f9b980c9a48 100644 --- a/pkg/cloudprovider/providers/gce/gce_test.go +++ b/pkg/cloudprovider/providers/gce/gce_test.go @@ -17,15 +17,11 @@ limitations under the License. package gce import ( - "net/http" - "net/http/httptest" "reflect" "testing" compute "google.golang.org/api/compute/v1" - "k8s.io/kubernetes/pkg/util/flowcontrol" "k8s.io/kubernetes/pkg/util/rand" - utiltesting "k8s.io/kubernetes/pkg/util/testing" ) func TestGetRegion(t *testing.T) { @@ -264,31 +260,3 @@ func TestComputeUpdate(t *testing.T) { // } } } - -func TestRateLimitedRoundTripper(t *testing.T) { - handler := utiltesting.FakeHandler{StatusCode: 200} - server := httptest.NewServer(&handler) - defer server.Close() - - method := "GET" - path := "/foo/bar" - - req, err := http.NewRequest(method, server.URL+path, nil) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - // TODO(zmerlynn): Validate the rate limiter is actually getting called. - client := http.Client{ - Transport: &rateLimitedRoundTripper{ - rt: http.DefaultTransport, - limiter: flowcontrol.NewFakeAlwaysRateLimiter(), - }, - } - _, err = client.Do(req) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - handler.ValidateRequest(t, path, method, nil) -}