package start
import (
"strings"
"testing"
"github.com/openshift/origin/pkg/cmd/util"
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api"
)
func TestMasterURLNoPathAllowed(t *testing.T) {
masterArgs := NewDefaultMasterArgs()
masterArgs.MasterAddr.Set("http://example.com:9012/")
err := masterArgs.Validate()
if err == nil || !strings.Contains(err.Error(), "may not include a path") {
t.Errorf("expected %v, got %v", "may not include a path", err)
}
}
func TestMasterPublicURLNoPathAllowed(t *testing.T) {
masterArgs := NewDefaultMasterArgs()
masterArgs.MasterPublicAddr.Set("http://example.com:9012/")
err := masterArgs.Validate()
if err == nil || !strings.Contains(err.Error(), "may not include a path") {
t.Errorf("expected %v, got %v", "may not include a path", err)
}
}
func TestMasterPublicAddressDefaulting(t *testing.T) {
expected := "http://example.com:9012"
masterArgs := NewDefaultMasterArgs()
masterArgs.MasterAddr.Set(expected)
actual, err := masterArgs.GetMasterPublicAddress()
if err != nil {
t.Errorf("unexpected error: %v", err)
}
if expected != actual.String() {
t.Errorf("expected %v, got %v", expected, actual)
}
}
func TestMasterPublicAddressExplicit(t *testing.T) {
expected := "http://external.com:12445"
masterArgs := NewDefaultMasterArgs()
masterArgs.MasterAddr.Set("http://internal.com:9012")
masterArgs.MasterPublicAddr.Set(expected)
actual, err := masterArgs.GetMasterPublicAddress()
if err != nil {
t.Errorf("unexpected error: %v", err)
}
if expected != actual.String() {
t.Errorf("expected %v, got %v", expected, actual)
}
}
func TestAssetPublicAddressDefaulting(t *testing.T) {
master := "http://example.com:9011"
expected := "http://example.com:9011/console/"
masterArgs := NewDefaultMasterArgs()
masterArgs.MasterAddr.Set(master)
actual, err := masterArgs.GetAssetPublicAddress()
if err != nil {
t.Errorf("unexpected error: %v", err)
}
if expected != actual.String() {
t.Errorf("expected %v, got %v", expected, actual)
}
}
func TestKubernetesAddressDefaulting(t *testing.T) {
expected := "http://example.com:9012"
masterArgs := NewDefaultMasterArgs()
masterArgs.MasterAddr.Set(expected)
masterAddr, _ := masterArgs.GetMasterAddress()
actual, err := masterArgs.KubeConnectionArgs.GetKubernetesAddress(masterAddr)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if expected != actual.String() {
t.Fatalf("expected %v, got %v", expected, actual)
}
}
func TestEtcdAddressDefaulting(t *testing.T) {
expected := "https://example.com:4001"
master := "http://example.com:9012"
masterArgs := NewDefaultMasterArgs()
masterArgs.MasterAddr.Set(master)
actual, err := masterArgs.GetEtcdAddress()
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if expected != actual.String() {
t.Fatalf("expected %v, got %v", expected, actual)
}
}
func TestEtcdAddressUseListenScheme(t *testing.T) {
// Scheme from --listen arg
// Host from --master arg
// Port from default
expected := "http://example.com:4001"
masterArgs := NewDefaultMasterArgs()
masterArgs.MasterAddr.Set("https://example.com:9012")
masterArgs.ListenArg.ListenAddr.Set("http://0.0.0.0:8043")
actual, err := masterArgs.GetEtcdAddress()
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if expected != actual.String() {
t.Fatalf("expected %v, got %v", expected, actual)
}
}
func TestEtcdAddressExplicit(t *testing.T) {
expected := "http://external.com:12445"
masterArgs := NewDefaultMasterArgs()
masterArgs.MasterAddr.Set("http://internal.com:9012")
masterArgs.EtcdAddr.Set(expected)
actual, err := masterArgs.GetEtcdAddress()
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if expected != actual.String() {
t.Fatalf("expected %v, got %v", expected, actual)
}
}
func TestEtcdBindAddressDefault(t *testing.T) {
expected := "0.0.0.0:4001"
masterArgs := NewDefaultMasterArgs()
actual := masterArgs.GetEtcdBindAddress()
if expected != actual {
t.Fatalf("expected %v, got %v", expected, actual)
}
}
func TestEtcdPeerAddressDefault(t *testing.T) {
expected := "0.0.0.0:7001"
masterArgs := NewDefaultMasterArgs()
actual := masterArgs.GetEtcdPeerBindAddress()
if expected != actual {
t.Fatalf("expected %v, got %v", expected, actual)
}
}
func TestEtcdBindAddressDefaultToBind(t *testing.T) {
expected := "1.2.3.4:4001"
masterArgs := NewDefaultMasterArgs()
masterArgs.ListenArg.ListenAddr.Set("https://1.2.3.4:8080")
actual := masterArgs.GetEtcdBindAddress()
if expected != actual {
t.Fatalf("expected %v, got %v", expected, actual)
}
}
func TestMasterAddressDefaultingToBindValues(t *testing.T) {
defaultIP, err := util.DefaultLocalIP4()
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
expected := "http://" + defaultIP.String() + ":9012"
masterArgs := NewDefaultMasterArgs()
masterArgs.ListenArg.ListenAddr.Set("http://0.0.0.0:9012")
actual, err := masterArgs.GetMasterAddress()
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if expected != actual.String() {
t.Fatalf("expected %v, got %v", expected, actual)
}
}
func TestMasterAddressExplicit(t *testing.T) {
expected := "http://external.com:12445"
masterArgs := NewDefaultMasterArgs()
masterArgs.MasterAddr.Set(expected)
actual, err := masterArgs.GetMasterAddress()
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if expected != actual.String() {
t.Fatalf("expected %v, got %v", expected, actual)
}
}
func TestKubeClientForExternalKubernetesMasterWithNoConfig(t *testing.T) {
expected := "https://localhost:8443"
masterArgs := NewDefaultMasterArgs()
masterArgs.MasterAddr.Set(expected)
masterAddr, _ := masterArgs.GetMasterAddress()
actual, err := masterArgs.KubeConnectionArgs.GetKubernetesAddress(masterAddr)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if expected != actual.String() {
t.Fatalf("expected %v, got %v", expected, actual)
}
}
func TestKubeClientForNodeWithNoConfig(t *testing.T) {
expected := "https://localhost:8443"
masterArgs := NewDefaultMasterArgs()
masterArgs.MasterAddr.Set(expected)
masterAddr, _ := masterArgs.GetMasterAddress()
actual, err := masterArgs.KubeConnectionArgs.GetKubernetesAddress(masterAddr)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if expected != actual.String() {
t.Fatalf("expected %v, got %v", expected, actual)
}
}
func TestKubeClientForExternalKubernetesMasterWithConfig(t *testing.T) {
expectedServer := "https://some-other-server:1234"
expectedUser := "myuser"
masterArgs := NewDefaultMasterArgs()
masterArgs.KubeConnectionArgs.ClientConfigLoadingRules, masterArgs.KubeConnectionArgs.ClientConfig = makeKubeconfig(expectedServer, expectedUser)
masterAddr, _ := masterArgs.GetMasterAddress()
actual, err := masterArgs.KubeConnectionArgs.GetKubernetesAddress(masterAddr)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if expectedServer != actual.String() {
t.Fatalf("expected %v, got %v", expectedServer, actual)
}
}
func TestKubeClientForNodeWithConfig(t *testing.T) {
expectedServer := "https://some-other-server:1234"
expectedUser := "myuser"
nodeArgs := NewDefaultNodeArgs()
nodeArgs.KubeConnectionArgs.ClientConfigLoadingRules, nodeArgs.KubeConnectionArgs.ClientConfig = makeKubeconfig(expectedServer, expectedUser)
actual, err := nodeArgs.KubeConnectionArgs.GetKubernetesAddress(nil)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if expectedServer != actual.String() {
t.Fatalf("expected %v, got %v", expectedServer, actual)
}
}
func TestKubeClientForExternalKubernetesMasterWithErrorKubeconfig(t *testing.T) {
masterArgs := NewDefaultMasterArgs()
masterArgs.KubeConnectionArgs.ClientConfigLoadingRules, masterArgs.KubeConnectionArgs.ClientConfig = makeErrorKubeconfig()
// GetKubernetesAddress hits the invalid kubeconfig in the fallback chain
masterAddr, _ := masterArgs.GetMasterAddress()
_, err := masterArgs.KubeConnectionArgs.GetKubernetesAddress(masterAddr)
if err == nil {
t.Fatalf("expected error, got none")
}
}
func makeEmptyKubeconfig() (clientcmd.ClientConfigLoadingRules, clientcmd.ClientConfig) {
// Set a non-empty CommandLinePath to trigger loading
loadingRules := clientcmd.ClientConfigLoadingRules{}
loadingRules.ExplicitPath = "specified"
clientConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(
// Set empty loading rules to avoid missing file errors
&clientcmd.ClientConfigLoadingRules{},
&clientcmd.ConfigOverrides{},
)
return loadingRules, clientConfig
}
func makeErrorKubeconfig() (clientcmd.ClientConfigLoadingRules, clientcmd.ClientConfig) {
// Set a non-empty CommandLinePath to trigger loading
loadingRules := clientcmd.ClientConfigLoadingRules{}
loadingRules.ExplicitPath = "missing-file"
clientConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(
&loadingRules,
&clientcmd.ConfigOverrides{},
)
return loadingRules, clientConfig
}
func makeKubeconfig(server, user string) (clientcmd.ClientConfigLoadingRules, clientcmd.ClientConfig) {
// Set a non-empty CommandLinePath to trigger loading
loadingRules := clientcmd.ClientConfigLoadingRules{}
loadingRules.ExplicitPath = "specified"
clientConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(
// Set empty loading rules to avoid missing file errors
&clientcmd.ClientConfigLoadingRules{},
// Override the server and user in client config to simulate loading from a file
&clientcmd.ConfigOverrides{
ClusterInfo: clientcmdapi.Cluster{Server: server},
AuthInfo: clientcmdapi.AuthInfo{Username: user},
},
)
return loadingRules, clientConfig
}