/* Copyright 2017 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package config import ( "flag" "fmt" "os" "os/user" "path/filepath" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" ) var ( kubeconfig, masterURL string log = logf.KBLog.WithName("client").WithName("config") ) func init() { // TODO: Fix this to allow double vendoring this library but still register flags on behalf of users flag.StringVar(&kubeconfig, "kubeconfig", "", "Paths to a kubeconfig. Only required if out-of-cluster.") flag.StringVar(&masterURL, "master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. "+ "Only required if out-of-cluster.") } // GetConfig creates a *rest.Config for talking to a Kubernetes apiserver. // If --kubeconfig is set, will use the kubeconfig file at that location. Otherwise will assume running // in cluster and use the cluster provided kubeconfig. // // Config precedence // // * --kubeconfig flag pointing at a file // // * KUBECONFIG environment variable pointing at a file // // * In-cluster config if running in cluster // // * $HOME/.kube/config if exists func GetConfig() (*rest.Config, error) { // If a flag is specified with the config location, use that if len(kubeconfig) > 0 { return clientcmd.BuildConfigFromFlags(masterURL, kubeconfig) } // If an env variable is specified with the config locaiton, use that if len(os.Getenv("KUBECONFIG")) > 0 { return clientcmd.BuildConfigFromFlags(masterURL, os.Getenv("KUBECONFIG")) } // If no explicit location, try the in-cluster config if c, err := rest.InClusterConfig(); err == nil { return c, nil } // If no in-cluster config, try the default location in the user's home directory if usr, err := user.Current(); err == nil { if c, err := clientcmd.BuildConfigFromFlags( "", filepath.Join(usr.HomeDir, ".kube", "config")); err == nil { return c, nil } } return nil, fmt.Errorf("could not locate a kubeconfig") } // GetConfigOrDie creates a *rest.Config for talking to a Kubernetes apiserver. // If --kubeconfig is set, will use the kubeconfig file at that location. Otherwise will assume running // in cluster and use the cluster provided kubeconfig. // // Will log an error and exit if there is an error creating the rest.Config. func GetConfigOrDie() *rest.Config { config, err := GetConfig() if err != nil { log.Error(err, "unable to get kubeconfig") os.Exit(1) } return config }