mirror of https://github.com/k3s-io/k3s
* Fixes issue where proxy support only honored server address via K3S_URL, not CLI or config. * Fixes crash when agent proxy is enabled, but proxy env vars do not return a proxy URL for the server address (server URL is in NO_PROXY list). * Adds tests Signed-off-by: Brad Davidson <brad.davidson@rancher.com>pull/9228/head
parent
04ce0ac0a9
commit
470bcd1bff
@ -0,0 +1,156 @@
|
|||||||
|
package loadbalancer
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/k3s-io/k3s/pkg/version"
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
|
)
|
||||||
|
|
||||||
|
var defaultEnv map[string]string
|
||||||
|
var proxyEnvs = []string{version.ProgramUpper + "_AGENT_HTTP_PROXY_ALLOWED", "HTTP_PROXY", "HTTPS_PROXY", "NO_PROXY", "http_proxy", "https_proxy", "no_proxy"}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
logrus.SetLevel(logrus.DebugLevel)
|
||||||
|
}
|
||||||
|
|
||||||
|
func prepareEnv(env ...string) {
|
||||||
|
defaultDialer = &net.Dialer{}
|
||||||
|
defaultEnv = map[string]string{}
|
||||||
|
for _, e := range proxyEnvs {
|
||||||
|
if v, ok := os.LookupEnv(e); ok {
|
||||||
|
defaultEnv[e] = v
|
||||||
|
os.Unsetenv(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, e := range env {
|
||||||
|
k, v, _ := strings.Cut(e, "=")
|
||||||
|
os.Setenv(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func restoreEnv() {
|
||||||
|
for _, e := range proxyEnvs {
|
||||||
|
if v, ok := defaultEnv[e]; ok {
|
||||||
|
os.Setenv(e, v)
|
||||||
|
} else {
|
||||||
|
os.Unsetenv(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_UnitSetHTTPProxy(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
address string
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
setup func() error
|
||||||
|
teardown func() error
|
||||||
|
wantErr bool
|
||||||
|
wantDialer string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "Default Proxy",
|
||||||
|
args: args{address: "https://1.2.3.4:6443"},
|
||||||
|
wantDialer: "*net.Dialer",
|
||||||
|
setup: func() error {
|
||||||
|
prepareEnv(version.ProgramUpper+"_AGENT_HTTP_PROXY_ALLOWED=", "HTTP_PROXY=", "HTTPS_PROXY=", "NO_PROXY=")
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
teardown: func() error {
|
||||||
|
restoreEnv()
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Agent Proxy Enabled",
|
||||||
|
args: args{address: "https://1.2.3.4:6443"},
|
||||||
|
wantDialer: "*http_dialer.HttpTunnel",
|
||||||
|
setup: func() error {
|
||||||
|
prepareEnv(version.ProgramUpper+"_AGENT_HTTP_PROXY_ALLOWED=true", "HTTP_PROXY=http://proxy:8080", "HTTPS_PROXY=http://proxy:8080", "NO_PROXY=")
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
teardown: func() error {
|
||||||
|
restoreEnv()
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Agent Proxy Enabled with Bogus Proxy",
|
||||||
|
args: args{address: "https://1.2.3.4:6443"},
|
||||||
|
wantDialer: "*net.Dialer",
|
||||||
|
wantErr: true,
|
||||||
|
setup: func() error {
|
||||||
|
prepareEnv(version.ProgramUpper+"_AGENT_HTTP_PROXY_ALLOWED=true", "HTTP_PROXY=proxy proxy", "HTTPS_PROXY=proxy proxy", "NO_PROXY=")
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
teardown: func() error {
|
||||||
|
restoreEnv()
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Agent Proxy Enabled with Bogus Server",
|
||||||
|
args: args{address: "https://1.2.3.4:k3s"},
|
||||||
|
wantDialer: "*net.Dialer",
|
||||||
|
wantErr: true,
|
||||||
|
setup: func() error {
|
||||||
|
prepareEnv(version.ProgramUpper+"_AGENT_HTTP_PROXY_ALLOWED=true", "HTTP_PROXY=http://proxy:8080", "HTTPS_PROXY=http://proxy:8080", "NO_PROXY=")
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
teardown: func() error {
|
||||||
|
restoreEnv()
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Agent Proxy Enabled but IP Excluded",
|
||||||
|
args: args{address: "https://1.2.3.4:6443"},
|
||||||
|
wantDialer: "*net.Dialer",
|
||||||
|
setup: func() error {
|
||||||
|
prepareEnv(version.ProgramUpper+"_AGENT_HTTP_PROXY_ALLOWED=true", "HTTP_PROXY=http://proxy:8080", "HTTPS_PROXY=http://proxy:8080", "NO_PROXY=1.2.0.0/16")
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
teardown: func() error {
|
||||||
|
restoreEnv()
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Agent Proxy Enabled but Domain Excluded",
|
||||||
|
args: args{address: "https://server.example.com:6443"},
|
||||||
|
wantDialer: "*net.Dialer",
|
||||||
|
setup: func() error {
|
||||||
|
prepareEnv(version.ProgramUpper+"_AGENT_HTTP_PROXY_ALLOWED=true", "HTTP_PROXY=http://proxy:8080", "HTTPS_PROXY=http://proxy:8080", "NO_PROXY=*.example.com")
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
teardown: func() error {
|
||||||
|
restoreEnv()
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
defer tt.teardown()
|
||||||
|
if err := tt.setup(); err != nil {
|
||||||
|
t.Errorf("Setup for SetHTTPProxy() failed = %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err := SetHTTPProxy(tt.args.address)
|
||||||
|
t.Logf("SetHTTPProxy() error = %v", err)
|
||||||
|
if (err != nil) != tt.wantErr {
|
||||||
|
t.Errorf("SetHTTPProxy() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
|
}
|
||||||
|
if dialerType := fmt.Sprintf("%T", defaultDialer); dialerType != tt.wantDialer {
|
||||||
|
t.Errorf("Got wrong dialer type %s, wanted %s", dialerType, tt.wantDialer)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue