2024-01-11 20:26:47 +00:00
|
|
|
package loadbalancer
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/k3s-io/k3s/pkg/version"
|
|
|
|
"github.com/sirupsen/logrus"
|
2024-11-15 22:11:47 +00:00
|
|
|
"golang.org/x/net/proxy"
|
2024-01-11 20:26:47 +00:00
|
|
|
)
|
|
|
|
|
2024-11-15 22:11:47 +00:00
|
|
|
var originalDialer proxy.Dialer
|
2024-01-11 20:26:47 +00:00
|
|
|
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) {
|
2024-11-15 22:11:47 +00:00
|
|
|
originalDialer = defaultDialer
|
2024-01-11 20:26:47 +00:00
|
|
|
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() {
|
2024-11-15 22:11:47 +00:00
|
|
|
defaultDialer = originalDialer
|
2024-01-11 20:26:47 +00:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|