From 4b8995f0093369465f728e686416b52f8b10b0a8 Mon Sep 17 00:00:00 2001 From: James DeFelice Date: Wed, 3 Jun 2015 04:04:07 +0000 Subject: [PATCH] parse apiserver prefix from client config host spec, with unit test --- pkg/client/clientcmd/client_config.go | 8 +++++ pkg/client/clientcmd/client_config_test.go | 40 +++++++++++++++++++++- pkg/kubectl/cmd/config/config_test.go | 29 ++++++++++++++++ 3 files changed, 76 insertions(+), 1 deletion(-) diff --git a/pkg/client/clientcmd/client_config.go b/pkg/client/clientcmd/client_config.go index 21cae3d25b3..9d6039db14a 100644 --- a/pkg/client/clientcmd/client_config.go +++ b/pkg/client/clientcmd/client_config.go @@ -18,6 +18,7 @@ package clientcmd import ( "io" + "net/url" "os" "github.com/imdario/mergo" @@ -85,6 +86,13 @@ func (config DirectClientConfig) ClientConfig() (*client.Config, error) { clientConfig := &client.Config{} clientConfig.Host = configClusterInfo.Server + if u, err := url.ParseRequestURI(clientConfig.Host); err == nil && u.Opaque == "" && len(u.Path) > 1 { + clientConfig.Prefix = u.Path + u.Path = "" + u.RawQuery = "" + u.Fragment = "" + clientConfig.Host = u.String() + } clientConfig.Version = configClusterInfo.APIVersion // only try to read the auth information if we are secure diff --git a/pkg/client/clientcmd/client_config_test.go b/pkg/client/clientcmd/client_config_test.go index 4a5820caaf7..786c8b51b7d 100644 --- a/pkg/client/clientcmd/client_config_test.go +++ b/pkg/client/clientcmd/client_config_test.go @@ -141,11 +141,49 @@ func TestCreateClean(t *testing.T) { } matchStringArg(config.Clusters["clean"].Server, clientConfig.Host, t) + matchStringArg("", clientConfig.Prefix, t) matchStringArg(config.Clusters["clean"].APIVersion, clientConfig.Version, t) matchBoolArg(config.Clusters["clean"].InsecureSkipTLSVerify, clientConfig.Insecure, t) matchStringArg(config.AuthInfos["clean"].Token, clientConfig.BearerToken, t) } +func TestCreateCleanWithPrefix(t *testing.T) { + tt := []struct { + server string + host string + prefix string + }{ + {"https://anything.com:8080/foo/bar", "https://anything.com:8080", "/foo/bar"}, + {"http://anything.com:8080/foo/bar", "http://anything.com:8080", "/foo/bar"}, + {"http://anything.com:8080/foo/bar/", "http://anything.com:8080", "/foo/bar/"}, + {"http://anything.com:8080/", "http://anything.com:8080/", ""}, + {"http://anything.com:8080//", "http://anything.com:8080", "//"}, + {"anything.com:8080/foo/bar", "anything.com:8080/foo/bar", ""}, + {"anything.com:8080", "anything.com:8080", ""}, + {"anything.com", "anything.com", ""}, + {"anything", "anything", ""}, + {"", "http://localhost:8080", ""}, + } + + for _, tc := range tt { + config := createValidTestConfig() + + cleanConfig := config.Clusters["clean"] + cleanConfig.Server = tc.server + config.Clusters["clean"] = cleanConfig + + clientBuilder := NewNonInteractiveClientConfig(*config, "clean", &ConfigOverrides{}) + + clientConfig, err := clientBuilder.ClientConfig() + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + + matchStringArg(tc.host, clientConfig.Host, t) + matchStringArg(tc.prefix, clientConfig.Prefix, t) + } +} + func TestCreateCleanDefault(t *testing.T) { config := createValidTestConfig() clientBuilder := NewDefaultClientConfig(*config, &ConfigOverrides{}) @@ -187,7 +225,7 @@ func matchBoolArg(expected, got bool, t *testing.T) { func matchStringArg(expected, got string, t *testing.T) { if expected != got { - t.Errorf("Expected %v, got %v", expected, got) + t.Errorf("Expected %q, got %q", expected, got) } } diff --git a/pkg/kubectl/cmd/config/config_test.go b/pkg/kubectl/cmd/config/config_test.go index e91752132fd..bd0bfa4912e 100644 --- a/pkg/kubectl/cmd/config/config_test.go +++ b/pkg/kubectl/cmd/config/config_test.go @@ -108,6 +108,35 @@ func TestSetIntoExistingStruct(t *testing.T) { test.run(t) } +func TestSetWithPathPrefixIntoExistingStruct(t *testing.T) { + expectedConfig := newRedFederalCowHammerConfig() + cc := expectedConfig.Clusters["cow-clusters"] + cinfo := &cc + cinfo.Server = "http://cow.org:8080/foo/baz" + expectedConfig.Clusters["cow-cluster"] = *cinfo + test := configCommandTest{ + args: []string{"set", "clusters.cow-cluster.server", "http://cow.org:8080/foo/baz"}, + startingConfig: newRedFederalCowHammerConfig(), + expectedConfig: expectedConfig, + } + + test.run(t) + + dc := clientcmd.NewDefaultClientConfig(expectedConfig, &clientcmd.ConfigOverrides{}) + dcc, err := dc.ClientConfig() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + expectedHost := "http://cow.org:8080" + if expectedHost != dcc.Host { + t.Fatalf("expected client.Config.Host = %q instead of %q", expectedHost, dcc.Host) + } + expectedPrefix := "/foo/baz" + if expectedPrefix != dcc.Prefix { + t.Fatalf("expected client.Config.Prefix = %q instead of %q", expectedPrefix, dcc.Prefix) + } +} + func TestUnsetStruct(t *testing.T) { expectedConfig := newRedFederalCowHammerConfig() delete(expectedConfig.AuthInfos, "red-user")