From 210f1a904dc2cc51a40ef357b4d56cb341e5f7d9 Mon Sep 17 00:00:00 2001 From: Pengfei Ni Date: Mon, 30 Dec 2019 03:13:47 +0000 Subject: [PATCH] Move client config to a separate package --- .../azure/clients/BUILD | 41 +++++++++ .../azure/clients/azure_client_config.go | 84 +++++++++++++++++++ .../azure/clients/azure_client_config_test.go | 68 +++++++++++++++ .../azure/clients/doc.go | 20 +++++ 4 files changed, 213 insertions(+) create mode 100644 staging/src/k8s.io/legacy-cloud-providers/azure/clients/BUILD create mode 100644 staging/src/k8s.io/legacy-cloud-providers/azure/clients/azure_client_config.go create mode 100644 staging/src/k8s.io/legacy-cloud-providers/azure/clients/azure_client_config_test.go create mode 100644 staging/src/k8s.io/legacy-cloud-providers/azure/clients/doc.go diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/clients/BUILD b/staging/src/k8s.io/legacy-cloud-providers/azure/clients/BUILD new file mode 100644 index 00000000000..7d742947cb1 --- /dev/null +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/clients/BUILD @@ -0,0 +1,41 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = [ + "azure_client_config.go", + "doc.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/legacy-cloud-providers/azure/clients", + importpath = "k8s.io/legacy-cloud-providers/azure/clients", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", + "//staging/src/k8s.io/legacy-cloud-providers/azure/retry:go_default_library", + "//vendor/github.com/Azure/go-autorest/autorest/adal:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) + +go_test( + name = "go_default_test", + srcs = ["azure_client_config_test.go"], + embed = [":go_default_library"], + deps = [ + "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", + "//vendor/github.com/stretchr/testify/assert:go_default_library", + ], +) diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/clients/azure_client_config.go b/staging/src/k8s.io/legacy-cloud-providers/azure/clients/azure_client_config.go new file mode 100644 index 00000000000..88aef868e00 --- /dev/null +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/clients/azure_client_config.go @@ -0,0 +1,84 @@ +// +build !providerless + +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package clients + +import ( + "github.com/Azure/go-autorest/autorest/adal" + "k8s.io/client-go/util/flowcontrol" + "k8s.io/legacy-cloud-providers/azure/retry" +) + +// ClientConfig contains all essential information to create an Azure client. +type ClientConfig struct { + Location string + SubscriptionID string + ResourceManagerEndpoint string + ServicePrincipalToken *adal.ServicePrincipalToken + RateLimitConfig *RateLimitConfig + Backoff *retry.Backoff + + // Depracated configures (retry.Backoff is preferred). + // Those configurations would be removed after all Azure clients are moved to new implementations. + CloudProviderBackoffRetries int + CloudProviderBackoffDuration int + ShouldOmitCloudProviderBackoff bool +} + +// WithRateLimiter returns ClientConfig with rateLimitConfig set. +func (cfg *ClientConfig) WithRateLimiter(rl *RateLimitConfig) *ClientConfig { + cfg.RateLimitConfig = rl + return cfg +} + +// RateLimitConfig indicates the rate limit config options. +type RateLimitConfig struct { + // Enable rate limiting + CloudProviderRateLimit bool `json:"cloudProviderRateLimit,omitempty" yaml:"cloudProviderRateLimit,omitempty"` + // Rate limit QPS (Read) + CloudProviderRateLimitQPS float32 `json:"cloudProviderRateLimitQPS,omitempty" yaml:"cloudProviderRateLimitQPS,omitempty"` + // Rate limit Bucket Size + CloudProviderRateLimitBucket int `json:"cloudProviderRateLimitBucket,omitempty" yaml:"cloudProviderRateLimitBucket,omitempty"` + // Rate limit QPS (Write) + CloudProviderRateLimitQPSWrite float32 `json:"cloudProviderRateLimitQPSWrite,omitempty" yaml:"cloudProviderRateLimitQPSWrite,omitempty"` + // Rate limit Bucket Size + CloudProviderRateLimitBucketWrite int `json:"cloudProviderRateLimitBucketWrite,omitempty" yaml:"cloudProviderRateLimitBucketWrite,omitempty"` +} + +// RateLimitEnabled returns true if CloudProviderRateLimit is set to true. +func RateLimitEnabled(config *RateLimitConfig) bool { + return config != nil && config.CloudProviderRateLimit +} + +// NewRateLimiter creates new read and write flowcontrol.RateLimiter from RateLimitConfig. +func NewRateLimiter(config *RateLimitConfig) (flowcontrol.RateLimiter, flowcontrol.RateLimiter) { + readLimiter := flowcontrol.NewFakeAlwaysRateLimiter() + writeLimiter := flowcontrol.NewFakeAlwaysRateLimiter() + + if config != nil && config.CloudProviderRateLimit { + readLimiter = flowcontrol.NewTokenBucketRateLimiter( + config.CloudProviderRateLimitQPS, + config.CloudProviderRateLimitBucket) + + writeLimiter = flowcontrol.NewTokenBucketRateLimiter( + config.CloudProviderRateLimitQPSWrite, + config.CloudProviderRateLimitBucketWrite) + } + + return readLimiter, writeLimiter +} diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/clients/azure_client_config_test.go b/staging/src/k8s.io/legacy-cloud-providers/azure/clients/azure_client_config_test.go new file mode 100644 index 00000000000..f06db05d988 --- /dev/null +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/clients/azure_client_config_test.go @@ -0,0 +1,68 @@ +// +build !providerless + +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package clients + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "k8s.io/client-go/util/flowcontrol" +) + +func TestWithRateLimiter(t *testing.T) { + config := &ClientConfig{} + assert.Nil(t, config.RateLimitConfig) + config.WithRateLimiter(&RateLimitConfig{CloudProviderRateLimit: true}) + assert.Equal(t, &RateLimitConfig{CloudProviderRateLimit: true}, config.RateLimitConfig) + config.WithRateLimiter(nil) + assert.Nil(t, config.RateLimitConfig) +} + +func TestRateLimitEnabled(t *testing.T) { + assert.Equal(t, false, RateLimitEnabled(nil)) + config := &RateLimitConfig{} + assert.Equal(t, false, RateLimitEnabled(config)) + config.CloudProviderRateLimit = true + assert.Equal(t, true, RateLimitEnabled(config)) +} + +func TestNewRateLimiter(t *testing.T) { + fakeRateLimiter := flowcontrol.NewFakeAlwaysRateLimiter() + readLimiter, writeLimiter := NewRateLimiter(nil) + assert.Equal(t, readLimiter, fakeRateLimiter) + assert.Equal(t, writeLimiter, fakeRateLimiter) + + rateLimitConfig := &RateLimitConfig{ + CloudProviderRateLimit: false, + } + readLimiter, writeLimiter = NewRateLimiter(rateLimitConfig) + assert.Equal(t, readLimiter, fakeRateLimiter) + assert.Equal(t, writeLimiter, fakeRateLimiter) + + rateLimitConfig = &RateLimitConfig{ + CloudProviderRateLimit: true, + CloudProviderRateLimitQPS: 3, + CloudProviderRateLimitBucket: 10, + CloudProviderRateLimitQPSWrite: 1, + CloudProviderRateLimitBucketWrite: 3, + } + readLimiter, writeLimiter = NewRateLimiter(rateLimitConfig) + assert.Equal(t, flowcontrol.NewTokenBucketRateLimiter(3, 10), readLimiter) + assert.Equal(t, flowcontrol.NewTokenBucketRateLimiter(1, 3), writeLimiter) +} diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/clients/doc.go b/staging/src/k8s.io/legacy-cloud-providers/azure/clients/doc.go new file mode 100644 index 00000000000..dbfc5f613f4 --- /dev/null +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/clients/doc.go @@ -0,0 +1,20 @@ +// +build !providerless + +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package clients contains a set of Azure ARM clients. +package clients // import "k8s.io/legacy-cloud-providers/azure/clients"