mirror of
https://github.com/rancher/steve.git
synced 2025-09-01 07:27:46 +00:00
Add support for modifying the created Factory clients (#602)
Add support for modifying the created Factory clients This adds a new functional-opt based mechanism for configuring the factory clients, and provides a new function for allowing consumers to provide the QPS and Burst values for configuring clients.
This commit is contained in:
@@ -15,6 +15,13 @@ import (
|
|||||||
"k8s.io/client-go/rest"
|
"k8s.io/client-go/rest"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// defaultQPS and defaultBurst are used to configure the rest.Config for
|
||||||
|
// factory created clients.
|
||||||
|
defaultQPS float32 = 10000
|
||||||
|
defaultBurst int = 100
|
||||||
|
)
|
||||||
|
|
||||||
type Factory struct {
|
type Factory struct {
|
||||||
impersonate bool
|
impersonate bool
|
||||||
tableClientCfg *rest.Config
|
tableClientCfg *rest.Config
|
||||||
@@ -47,10 +54,41 @@ func (a *addQuery) WrappedRoundTripper() http.RoundTripper {
|
|||||||
return a.next
|
return a.next
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewFactory(cfg *rest.Config, impersonate bool) (*Factory, error) {
|
type factoryOptions struct {
|
||||||
|
qps float32
|
||||||
|
burst int
|
||||||
|
}
|
||||||
|
|
||||||
|
func defaultFactoryOptions() *factoryOptions {
|
||||||
|
return &factoryOptions{
|
||||||
|
qps: defaultQPS,
|
||||||
|
burst: defaultBurst,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithQPSAndBurst configures the rest.Config used for creating the clients in
|
||||||
|
// the factory with the provided burst and qps configuration.
|
||||||
|
//
|
||||||
|
// See https://pkg.go.dev/k8s.io/client-go/rest#Config for more.
|
||||||
|
func WithQPSAndBurst(qps float32, burst int) FactoryOption {
|
||||||
|
return func(opts *factoryOptions) {
|
||||||
|
opts.qps = qps
|
||||||
|
opts.burst = burst
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FactoryOption is an option-func for configuring the newly created factory.
|
||||||
|
type FactoryOption func(*factoryOptions)
|
||||||
|
|
||||||
|
func NewFactory(cfg *rest.Config, impersonate bool, opts ...FactoryOption) (*Factory, error) {
|
||||||
clientCfg := rest.CopyConfig(cfg)
|
clientCfg := rest.CopyConfig(cfg)
|
||||||
clientCfg.QPS = 10000
|
options := defaultFactoryOptions()
|
||||||
clientCfg.Burst = 100
|
for _, opt := range opts {
|
||||||
|
opt(options)
|
||||||
|
}
|
||||||
|
|
||||||
|
clientCfg.QPS = options.qps
|
||||||
|
clientCfg.Burst = options.burst
|
||||||
|
|
||||||
watchClientCfg := rest.CopyConfig(clientCfg)
|
watchClientCfg := rest.CopyConfig(clientCfg)
|
||||||
watchClientCfg.Timeout = 30 * time.Minute
|
watchClientCfg.Timeout = 30 * time.Minute
|
||||||
|
32
pkg/client/factory_test.go
Normal file
32
pkg/client/factory_test.go
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
package client
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"k8s.io/client-go/rest"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestWithQPSAndBurst(t *testing.T) {
|
||||||
|
fo := defaultFactoryOptions()
|
||||||
|
|
||||||
|
assert.Equal(t, defaultQPS, fo.qps)
|
||||||
|
assert.Equal(t, defaultBurst, fo.burst)
|
||||||
|
|
||||||
|
WithQPSAndBurst(50, 20)(fo)
|
||||||
|
|
||||||
|
assert.Equal(t, float32(50.0), fo.qps)
|
||||||
|
assert.Equal(t, 20, fo.burst)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNewFactoryWithOptions(t *testing.T) {
|
||||||
|
cfg := &rest.Config{
|
||||||
|
QPS: 5.0,
|
||||||
|
Burst: 10,
|
||||||
|
}
|
||||||
|
f, err := NewFactory(cfg, false, WithQPSAndBurst(50, 20))
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
assert.Equal(t, float32(50.0), f.clientCfg.QPS)
|
||||||
|
assert.Equal(t, 20, f.clientCfg.Burst)
|
||||||
|
}
|
Reference in New Issue
Block a user