diff --git a/environment/client_config.go b/environment/client_config.go index 04d4220b0a..aef33927ef 100644 --- a/environment/client_config.go +++ b/environment/client_config.go @@ -19,8 +19,10 @@ package environment import ( "flag" "fmt" + "log" "math" "os" + "strconv" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" @@ -45,9 +47,19 @@ func (c *ClientConfig) InitFlags(fs *flag.FlagSet) { fs.StringVar(&c.Kubeconfig, "kubeconfig", os.Getenv("KUBECONFIG"), "Path to a kubeconfig. Only required if out-of-cluster.") - fs.IntVar(&c.Burst, "kube-api-burst", 0, "Maximum burst for throttle.") + fs.IntVar(&c.Burst, "kube-api-burst", int(envVarOrDefault("KUBE_API_BURST", 0)), "Maximum burst for throttle.") - fs.Float64Var(&c.QPS, "kube-api-qps", 0, "Maximum QPS to the server from the client.") + fs.Float64Var(&c.QPS, "kube-api-qps", envVarOrDefault("KUBE_API_QPS", 0.0), "Maximum QPS to the server from the client.") +} + +func envVarOrDefault(key string, val float64) float64 { + var err error + if v := os.Getenv(key); v != "" { + if val, err = strconv.ParseFloat(v, 64); err != nil { + log.Fatal(err) + } + } + return val } func (c *ClientConfig) GetRESTConfig() (*rest.Config, error) { diff --git a/environment/client_config_test.go b/environment/client_config_test.go new file mode 100644 index 0000000000..b5f83b16f2 --- /dev/null +++ b/environment/client_config_test.go @@ -0,0 +1,50 @@ +/* +Copyright 2023 The Knative 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 environment + +import ( + "flag" + "strconv" + "testing" + + "github.com/google/go-cmp/cmp" +) + +func TestInitFlag(t *testing.T) { + t.Setenv("KUBE_API_BURST", "50") + t.Setenv("KUBE_API_QPS", "60.1") + t.Setenv("KUBECONFIG", "myconfig") + + c := new(ClientConfig) + c.InitFlags(flag.CommandLine) + + // Override kube-api-burst via command line option. + flag.CommandLine.Set("kube-api-burst", strconv.Itoa(100)) + + // Call parse() here as InitFlags does not call it. + flag.Parse() + + expect := &ClientConfig{ + Burst: 100, + QPS: 60.1, + Kubeconfig: "myconfig", + } + + if !cmp.Equal(c, expect) { + t.Errorf("ClientConfig mismatch: diff(-want,+got):\n%s", cmp.Diff(expect, c)) + } +}