Skip to content

Commit

Permalink
use the upstream construction for kubeconfig evaluation
Browse files Browse the repository at this point in the history
  • Loading branch information
deads2k committed Apr 12, 2018
1 parent 27ae008 commit 04b10a4
Show file tree
Hide file tree
Showing 13 changed files with 20 additions and 158 deletions.
37 changes: 0 additions & 37 deletions pkg/client/cmd/clientcmd.go

This file was deleted.

5 changes: 0 additions & 5 deletions pkg/client/config/loader.go

This file was deleted.

5 changes: 2 additions & 3 deletions pkg/cmd/infra/router/clientcmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import (

kclientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"

"github.com/openshift/origin/pkg/client/config"
"github.com/openshift/origin/pkg/cmd/flagtypes"
"github.com/openshift/origin/pkg/cmd/util"
)
Expand Down Expand Up @@ -199,8 +198,8 @@ func (cfg *Config) bindEnv() error {

func DefaultClientConfig(flags *pflag.FlagSet) kclientcmd.ClientConfig {
loadingRules := kclientcmd.NewDefaultClientConfigLoadingRules()
flags.StringVar(&loadingRules.ExplicitPath, config.OpenShiftConfigFlagName, "", "Path to the config file to use for CLI requests.")
cobra.MarkFlagFilename(flags, config.OpenShiftConfigFlagName)
flags.StringVar(&loadingRules.ExplicitPath, kclientcmd.OpenShiftKubeConfigFlagName, "", "Path to the config file to use for CLI requests.")
cobra.MarkFlagFilename(flags, kclientcmd.OpenShiftKubeConfigFlagName)

// set our explicit defaults
defaultOverrides := &kclientcmd.ConfigOverrides{ClusterDefaults: kclientcmdapi.Cluster{Server: os.Getenv("KUBERNETES_MASTER")}}
Expand Down
3 changes: 1 addition & 2 deletions pkg/oc/admin/diagnostics/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (
kclientcmd "k8s.io/client-go/tools/clientcmd"
clientcmdapi "k8s.io/client-go/tools/clientcmd/api"

"github.com/openshift/origin/pkg/client/config"
"github.com/openshift/origin/pkg/oc/admin/diagnostics/diagnostics/util"
)

Expand All @@ -33,7 +32,7 @@ func (o DiagnosticsOptions) detectClientConfig() (expected bool, detected bool)
return false, false
}
o.Logger().Notice("CED2011", "Determining if client configuration exists for client/cluster diagnostics")
confFlagName := config.OpenShiftConfigFlagName
confFlagName := kclientcmd.OpenShiftKubeConfigFlagName
confFlagValue := o.ClientFlags.Lookup(confFlagName).Value.String()
successfulLoad := false

Expand Down
4 changes: 2 additions & 2 deletions pkg/oc/admin/diagnostics/diagnostics.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ import (

kutilerrors "k8s.io/apimachinery/pkg/util/errors"
"k8s.io/apimachinery/pkg/util/sets"
kclientcmd "k8s.io/client-go/tools/clientcmd"
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"

"github.com/openshift/origin/pkg/client/config"
"github.com/openshift/origin/pkg/cmd/flagtypes"
poddiag "github.com/openshift/origin/pkg/oc/admin/diagnostics/diagnostics/client/pod/in_pod"
networkpoddiag "github.com/openshift/origin/pkg/oc/admin/diagnostics/diagnostics/cluster/network/in_pod"
Expand Down Expand Up @@ -223,7 +223,7 @@ func (o *DiagnosticsOptions) bindCommonFlags(flags *flag.FlagSet) {
func (o *DiagnosticsOptions) bindClientFlags(flags *flag.FlagSet) {
o.ClientFlags = flag.NewFlagSet("client", flag.ContinueOnError) // hide the extensive set of client flags
o.Factory = osclientcmd.New(o.ClientFlags) // that would otherwise be added to this command
flags.AddFlag(o.ClientFlags.Lookup(config.OpenShiftConfigFlagName))
flags.AddFlag(o.ClientFlags.Lookup(kclientcmd.OpenShiftKubeConfigFlagName))
flags.AddFlag(o.ClientFlags.Lookup("context")) // TODO: find k8s constant
flags.StringVar(&o.ClientClusterContext, options.FlagClusterContextName, "", "Client context to use for cluster administrator")
flags.BoolVar(&o.PreventModification, options.FlagPreventModificationName, false, "If true, may be set to prevent diagnostics making any changes via the API")
Expand Down
2 changes: 1 addition & 1 deletion pkg/oc/admin/prune/images.go
Original file line number Diff line number Diff line change
Expand Up @@ -763,7 +763,7 @@ func getClientAndMasterVersions(client discovery.DiscoveryInterface, timeout tim

select {
case err, closed := <-done:
if strings.HasSuffix(fmt.Sprintf("%v", err), "connection refused") || clientcmd.IsConfigurationMissing(err) || kclientcmd.IsConfigurationInvalid(err) {
if strings.HasSuffix(fmt.Sprintf("%v", err), "connection refused") || kclientcmd.IsEmptyConfig(err) || kclientcmd.IsConfigurationInvalid(err) {
return nil, nil, err
}
if closed && err != nil {
Expand Down
3 changes: 1 addition & 2 deletions pkg/oc/bootstrap/docker/up.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ import (
kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"

userv1client "github.com/openshift/client-go/user/clientset/versioned"
osclientcmd "github.com/openshift/origin/pkg/client/cmd"
cmdutil "github.com/openshift/origin/pkg/cmd/util"
"github.com/openshift/origin/pkg/cmd/util/variable"
oauthclientinternal "github.com/openshift/origin/pkg/oauth/generated/internalclientset"
Expand Down Expand Up @@ -228,7 +227,7 @@ func (c *ClusterUpConfig) Complete(cmd *cobra.Command, out io.Writer) error {
// Get the default client config for login
var err error
flags := pflag.NewFlagSet("", pflag.ContinueOnError)
c.defaultClientConfig, err = osclientcmd.DefaultClientConfig(flags).RawConfig()
c.defaultClientConfig, err = kcmdutil.DefaultClientConfig(flags).RawConfig()
if err != nil {
if !os.IsNotExist(err) {
return err
Expand Down
2 changes: 1 addition & 1 deletion pkg/oc/cli/cmd/version.go
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ func (o VersionOptions) RunVersion() error {

select {
case err, closed := <-done:
if strings.HasSuffix(fmt.Sprintf("%v", err), "connection refused") || clientcmd.IsConfigurationMissing(err) || kclientcmd.IsConfigurationInvalid(err) {
if strings.HasSuffix(fmt.Sprintf("%v", err), "connection refused") || kclientcmd.IsEmptyConfig(err) || kclientcmd.IsConfigurationInvalid(err) {
return nil
}
if closed && err != nil {
Expand Down
3 changes: 1 addition & 2 deletions pkg/oc/cli/cmd/wrappers.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ import (
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"

cmdconfig "github.com/openshift/origin/pkg/client/config"
cmdutil "github.com/openshift/origin/pkg/cmd/util"
"github.com/openshift/origin/pkg/oc/cli/cmd/create"
"github.com/openshift/origin/pkg/oc/cli/describe"
Expand Down Expand Up @@ -738,7 +737,7 @@ func NewCmdConfig(parentName, name string, f *clientcmd.Factory, out, errOut io.
pathOptions := &kclientcmd.PathOptions{
GlobalFile: kclientcmd.RecommendedHomeFile,
EnvVar: kclientcmd.RecommendedConfigPathEnvVar,
ExplicitFileFlag: cmdconfig.OpenShiftConfigFlagName,
ExplicitFileFlag: kclientcmd.OpenShiftKubeConfigFlagName,

GlobalFileSubpath: path.Join(kclientcmd.RecommendedHomeDir, kclientcmd.RecommendedFileName),

Expand Down
6 changes: 2 additions & 4 deletions pkg/oc/cli/config/loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,18 @@ import (

kclientcmd "k8s.io/client-go/tools/clientcmd"
kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"

"github.com/openshift/origin/pkg/client/config"
)

func NewPathOptions(cmd *cobra.Command) *kclientcmd.PathOptions {
return NewPathOptionsWithConfig(kcmdutil.GetFlagString(cmd, config.OpenShiftConfigFlagName))
return NewPathOptionsWithConfig(kcmdutil.GetFlagString(cmd, kclientcmd.OpenShiftKubeConfigFlagName))
}

func NewPathOptionsWithConfig(configPath string) *kclientcmd.PathOptions {
return &kclientcmd.PathOptions{
GlobalFile: kclientcmd.RecommendedHomeFile,

EnvVar: kclientcmd.RecommendedConfigPathEnvVar,
ExplicitFileFlag: config.OpenShiftConfigFlagName,
ExplicitFileFlag: kclientcmd.OpenShiftKubeConfigFlagName,

LoadingRules: &kclientcmd.ClientConfigLoadingRules{
ExplicitPath: configPath,
Expand Down
101 changes: 5 additions & 96 deletions pkg/oc/cli/util/clientcmd/factory_client_access.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,24 @@ package clientcmd

import (
"errors"
"fmt"
"io/ioutil"
"net/http"
"os"
"path/filepath"
"regexp"
"strconv"
"strings"
"time"

"github.com/golang/glog"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
"k8s.io/kubernetes/pkg/api/legacyscheme"

osclientcmd "github.com/openshift/origin/pkg/client/cmd"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/discovery"
"k8s.io/client-go/kubernetes"
restclient "k8s.io/client-go/rest"
kclientcmd "k8s.io/client-go/tools/clientcmd"
kclientcmdapi "k8s.io/client-go/tools/clientcmd/api"
"k8s.io/client-go/util/homedir"
kapi "k8s.io/kubernetes/pkg/apis/core"
kclientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
Expand Down Expand Up @@ -59,12 +52,14 @@ type ClientAccessFactory interface {
}

func NewClientAccessFactory(optionalClientConfig kclientcmd.ClientConfig) ClientAccessFactory {
// if we call this factory construction method, we want the openshift style config loading
kclientcmd.UseOpenShiftKubeConfigValues = true
kclientcmd.ErrEmptyConfig = kclientcmd.NewErrConfigurationMissing()

flags := pflag.NewFlagSet("", pflag.ContinueOnError)
clientConfig := optionalClientConfig
if optionalClientConfig == nil {
// TODO: there should be two client configs, one for OpenShift, and one for Kubernetes
clientConfig = osclientcmd.DefaultClientConfig(flags)
clientConfig = defaultingClientConfig{clientConfig}
clientConfig = kcmdutil.DefaultClientConfig(flags)
}
factory := &ring0Factory{
clientConfig: clientConfig,
Expand Down Expand Up @@ -389,92 +384,6 @@ func (f *ring0Factory) EditorEnvs() []string {
return []string{"OC_EDITOR", "EDITOR"}
}

// defaultingClientConfig detects whether the provided config is the default, and if
// so returns an error that indicates the user should set up their config.
type defaultingClientConfig struct {
nested kclientcmd.ClientConfig
}

// RawConfig calls the nested method
func (c defaultingClientConfig) RawConfig() (kclientcmdapi.Config, error) {
return c.nested.RawConfig()
}

// Namespace calls the nested method, and if an empty config error is returned
// it checks for the same default as kubectl - the value of POD_NAMESPACE or
// "default".
func (c defaultingClientConfig) Namespace() (string, bool, error) {
namespace, ok, err := c.nested.Namespace()
if err == nil {
return namespace, ok, nil
}
if !kclientcmd.IsEmptyConfig(err) {
return "", false, err
}

// This way assumes you've set the POD_NAMESPACE environment variable using the downward API.
// This check has to be done first for backwards compatibility with the way InClusterConfig was originally set up
if ns := os.Getenv("POD_NAMESPACE"); ns != "" {
return ns, true, nil
}

// Fall back to the namespace associated with the service account token, if available
if data, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/namespace"); err == nil {
if ns := strings.TrimSpace(string(data)); len(ns) > 0 {
return ns, true, nil
}
}

return metav1.NamespaceDefault, false, nil
}

// ConfigAccess implements ClientConfig
func (c defaultingClientConfig) ConfigAccess() kclientcmd.ConfigAccess {
return c.nested.ConfigAccess()
}

type errConfigurationMissing struct {
err error
}

func (e errConfigurationMissing) Error() string {
return fmt.Sprintf("%v", e.err)
}

func IsConfigurationMissing(err error) bool {
switch err.(type) {
case errConfigurationMissing:
return true
}
return kclientcmd.IsContextNotFound(err)
}

// ClientConfig returns a complete client config
func (c defaultingClientConfig) ClientConfig() (*restclient.Config, error) {
cfg, err := c.nested.ClientConfig()
if err == nil {
return cfg, nil
}

if !kclientcmd.IsEmptyConfig(err) {
return nil, err
}

// TODO: need to expose inClusterConfig upstream and use that
if icc, err := restclient.InClusterConfig(); err == nil {
glog.V(4).Infof("Using in-cluster configuration")
return icc, nil
}

return nil, errConfigurationMissing{fmt.Errorf(`Missing or incomplete configuration info. Please login or point to an existing, complete config file:
1. Via the command-line flag --config
2. Via the KUBECONFIG environment variable
3. In your home directory as ~/.kube/config
To view or setup config directly use the 'config' command.`)}
}

// computeDiscoverCacheDir takes the parentDir and the host and comes up with a "usually non-colliding" name.
func computeDiscoverCacheDir(parentDir, host string) string {
// strip the optional scheme from host if its there:
Expand Down
3 changes: 2 additions & 1 deletion test/cmd/config.sh
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ os::cmd::expect_success_and_not_text 'oc get bc' 'does not exist'

os::cmd::expect_failure_and_text 'env -u KUBERNETES_SERVICE_HOST oc get buildconfigs --context="test"' 'context was not found for specified context: test'
os::cmd::expect_failure_and_text 'env -u KUBERNETES_SERVICE_HOST oc get buildconfigs --cluster="test"' 'no server found for cluster "test"'
os::cmd::expect_failure_and_text 'env -u KUBERNETES_SERVICE_HOST oc get buildconfigs --user="test"' 'auth info "test" does not exist'
# need some level of default (both upstream and here) to get the pretty auth message because you fail on namespace first.
os::cmd::expect_failure_and_text 'KUBERNETES_MASTER=anything env -u KUBERNETES_SERVICE_HOST oc get buildconfigs --user="test"' 'auth info "test" does not exist'

os::cmd::expect_failure_and_text 'oc get bc --config=missing' 'missing: no such file or directory'

Expand Down
4 changes: 2 additions & 2 deletions test/integration/login_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ import (

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/tools/clientcmd"
kclientcmd "k8s.io/client-go/tools/clientcmd"

authorizationclient "github.com/openshift/origin/pkg/authorization/generated/internalclientset"
"github.com/openshift/origin/pkg/client/config"
"github.com/openshift/origin/pkg/cmd/server/bootstrappolicy"
newproject "github.com/openshift/origin/pkg/oc/admin/project"
"github.com/openshift/origin/pkg/oc/cli/cmd"
Expand Down Expand Up @@ -149,7 +149,7 @@ func newLoginOptions(server string, username string, password string, insecure b
func defaultClientConfig(flags *pflag.FlagSet) clientcmd.ClientConfig {
loadingRules := &clientcmd.ClientConfigLoadingRules{ExplicitPath: ""}

flags.StringVar(&loadingRules.ExplicitPath, config.OpenShiftConfigFlagName, "", "Path to the config file to use for CLI requests.")
flags.StringVar(&loadingRules.ExplicitPath, kclientcmd.OpenShiftKubeConfigFlagName, "", "Path to the config file to use for CLI requests.")

overrides := &clientcmd.ConfigOverrides{}
overrideFlags := clientcmd.RecommendedConfigOverrideFlags("")
Expand Down

0 comments on commit 04b10a4

Please sign in to comment.