Merge pull request #126743 from neolit123/1.32-add-get-proxy-env-vars-test

kubeadm: sort the merged env vars and improve related tests
This commit is contained in:
Kubernetes Prow Robot 2024-08-26 05:40:50 +01:00 committed by GitHub
commit 385fd21d92
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 66 additions and 11 deletions

View File

@ -259,7 +259,7 @@ func createKubeProxyAddon(cfg *kubeadmapi.ClusterConfiguration, client clientset
} }
// Propagate the http/https proxy host environment variables to the container // Propagate the http/https proxy host environment variables to the container
env := &kubeproxyDaemonSet.Spec.Template.Spec.Containers[0].Env env := &kubeproxyDaemonSet.Spec.Template.Spec.Containers[0].Env
*env = append(*env, kubeadmutil.MergeKubeadmEnvVars(kubeadmutil.GetProxyEnvVars())...) *env = append(*env, kubeadmutil.MergeKubeadmEnvVars(kubeadmutil.GetProxyEnvVars(nil))...)
// Create the DaemonSet for kube-proxy or update it in case it already exists // Create the DaemonSet for kube-proxy or update it in case it already exists
return []byte(""), apiclient.CreateOrUpdateDaemonSet(client, kubeproxyDaemonSet) return []byte(""), apiclient.CreateOrUpdateDaemonSet(client, kubeproxyDaemonSet)

View File

@ -52,7 +52,7 @@ func GetStaticPodSpecs(cfg *kubeadmapi.ClusterConfiguration, endpoint *kubeadmap
// Get the required hostpath mounts // Get the required hostpath mounts
mounts := getHostPathVolumesForTheControlPlane(cfg) mounts := getHostPathVolumesForTheControlPlane(cfg)
if proxyEnvs == nil { if proxyEnvs == nil {
proxyEnvs = kubeadmutil.GetProxyEnvVars() proxyEnvs = kubeadmutil.GetProxyEnvVars(nil)
} }
componentHealthCheckTimeout := kubeadmapi.GetActiveTimeouts().ControlPlaneComponentHealthCheck componentHealthCheckTimeout := kubeadmapi.GetActiveTimeouts().ControlPlaneComponentHealthCheck

View File

@ -18,6 +18,7 @@ package util
import ( import (
"os" "os"
"sort"
"strings" "strings"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
@ -25,13 +26,17 @@ import (
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
) )
// GetProxyEnvVars builds a list of environment variables in order to use the right proxy // GetProxyEnvVars builds a list of environment variables in order to use the right proxy.
func GetProxyEnvVars() []kubeadmapi.EnvVar { // Passing nil for environment will make the function use the OS environment.
func GetProxyEnvVars(environment []string) []kubeadmapi.EnvVar {
envs := []kubeadmapi.EnvVar{} envs := []kubeadmapi.EnvVar{}
for _, env := range os.Environ() { if environment == nil {
environment = os.Environ()
}
for _, env := range environment {
pos := strings.Index(env, "=") pos := strings.Index(env, "=")
if pos == -1 { if pos == -1 {
// malformed environment variable, skip it. // Malformed environment variable, skip it.
continue continue
} }
name := env[:pos] name := env[:pos]
@ -59,5 +64,8 @@ func MergeKubeadmEnvVars(envList ...[]kubeadmapi.EnvVar) []v1.EnvVar {
for _, v := range m { for _, v := range m {
merged = append(merged, v) merged = append(merged, v)
} }
sort.Slice(merged, func(i, j int) bool {
return merged[i].Name < merged[j].Name
})
return merged return merged
} }

View File

@ -17,10 +17,9 @@ limitations under the License.
package util package util
import ( import (
"reflect"
"testing" "testing"
"github.com/stretchr/testify/assert"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
@ -40,10 +39,10 @@ func TestMergeKubeadmEnvVars(t *testing.T) {
name: "normal case without duplicated env", name: "normal case without duplicated env",
proxyEnv: []kubeadmapi.EnvVar{ proxyEnv: []kubeadmapi.EnvVar{
{ {
EnvVar: v1.EnvVar{Name: "Foo1", Value: "Bar1"}, EnvVar: v1.EnvVar{Name: "Foo2", Value: "Bar2"},
}, },
{ {
EnvVar: v1.EnvVar{Name: "Foo2", Value: "Bar2"}, EnvVar: v1.EnvVar{Name: "Foo1", Value: "Bar1"},
}, },
}, },
extraEnv: []kubeadmapi.EnvVar{ extraEnv: []kubeadmapi.EnvVar{
@ -82,9 +81,57 @@ func TestMergeKubeadmEnvVars(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
envs := MergeKubeadmEnvVars(test.proxyEnv, test.extraEnv) envs := MergeKubeadmEnvVars(test.proxyEnv, test.extraEnv)
if !assert.ElementsMatch(t, envs, test.mergedEnv) { if !reflect.DeepEqual(envs, test.mergedEnv) {
t.Errorf("expected env: %v, got: %v", test.mergedEnv, envs) t.Errorf("expected env: %v, got: %v", test.mergedEnv, envs)
} }
}) })
} }
} }
func TestGetProxyEnvVars(t *testing.T) {
var tests = []struct {
name string
environment []string
expected []kubeadmapi.EnvVar
}{
{
name: "environment with lowercase proxy vars",
environment: []string{
"http_proxy=p1",
"foo1=bar1",
"https_proxy=p2",
"foo2=bar2",
"no_proxy=p3",
},
expected: []kubeadmapi.EnvVar{
{EnvVar: v1.EnvVar{Name: "http_proxy", Value: "p1"}},
{EnvVar: v1.EnvVar{Name: "https_proxy", Value: "p2"}},
{EnvVar: v1.EnvVar{Name: "no_proxy", Value: "p3"}},
},
},
{
name: "environment with uppercase proxy vars",
environment: []string{
"HTTP_PROXY=p1",
"foo1=bar1",
"HTTPS_PROXY=p2",
"foo2=bar2",
"NO_PROXY=p3",
},
expected: []kubeadmapi.EnvVar{
{EnvVar: v1.EnvVar{Name: "HTTP_PROXY", Value: "p1"}},
{EnvVar: v1.EnvVar{Name: "HTTPS_PROXY", Value: "p2"}},
{EnvVar: v1.EnvVar{Name: "NO_PROXY", Value: "p3"}},
},
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
envs := GetProxyEnvVars(test.environment)
if !reflect.DeepEqual(envs, test.expected) {
t.Errorf("expected env: %v, got: %v", test.expected, envs)
}
})
}
}