diff --git a/cmd/root.go b/cmd/root.go index 446250bee2..e4030c4c30 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -2,8 +2,10 @@ package cmd import ( "os" + "path/filepath" "github.com/k8sgpt-ai/k8sgpt/cmd/generate" + "k8s.io/client-go/util/homedir" "github.com/fatih/color" "github.com/k8sgpt-ai/k8sgpt/cmd/analyze" @@ -14,10 +16,10 @@ import ( ) var ( - cfgFile string - masterURL string - kubeconfig string - version string + cfgFile string + kubecontext string + kubeconfig string + version string ) // rootCmd represents the base command when called without any subcommands @@ -43,23 +45,25 @@ func Execute(v string) { func init() { cobra.OnInitialize(initConfig) - // Here you will define your flags and configuration settings. - // Cobra supports persistent flags, which, if defined here, - // will be global for your application. + var kubeconfigPath string + if home := homedir.HomeDir(); home != "" { + kubeconfigPath = filepath.Join(home, ".kube", "config") + } rootCmd.AddCommand(auth.AuthCmd) rootCmd.AddCommand(analyze.AnalyzeCmd) rootCmd.AddCommand(generate.GenerateCmd) rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.k8sgpt.yaml)") - rootCmd.PersistentFlags().StringVar(&masterURL, "master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.") - rootCmd.PersistentFlags().StringVar(&kubeconfig, "kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.") + rootCmd.PersistentFlags().StringVar(&kubecontext, "kubecontext", "", "Kubernetes context to use. Only required if out-of-cluster.") + rootCmd.PersistentFlags().StringVar(&kubeconfig, "kubeconfig", kubeconfigPath, "Path to a kubeconfig. Only required if out-of-cluster.") // Cobra also supports local flags, which will only run // when this action is called directly. // rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") //Initialise the kubeconfig - kubernetesClient, err := kubernetes.NewClient(masterURL, kubeconfig) + kubernetesClient, err := kubernetes.NewClient(kubecontext, kubeconfig) if err != nil { color.Red("Error initialising kubernetes client: %v", err) + os.Exit(1) } viper.Set("kubernetesClient", kubernetesClient) diff --git a/pkg/kubernetes/kubernetes.go b/pkg/kubernetes/kubernetes.go index 8d589aa392..522b2c4a98 100644 --- a/pkg/kubernetes/kubernetes.go +++ b/pkg/kubernetes/kubernetes.go @@ -2,7 +2,6 @@ package kubernetes import ( "k8s.io/client-go/kubernetes" - "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" ) @@ -14,21 +13,23 @@ func (c *Client) GetClient() *kubernetes.Clientset { return c.client } -func NewClient(masterURL string, kubeconfig string) (*Client, error) { +func NewClient(kubecontext string, kubeconfig string) (*Client, error) { - config, err := rest.InClusterConfig() + config := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( + &clientcmd.ClientConfigLoadingRules{ExplicitPath: kubeconfig}, + &clientcmd.ConfigOverrides{ + CurrentContext: kubecontext, + }) + // create the clientset + c, err := config.ClientConfig() if err != nil { - kubeconfig := - clientcmd.NewDefaultClientConfigLoadingRules().GetDefaultFilename() - config, err = clientcmd.BuildConfigFromFlags(masterURL, kubeconfig) - if err != nil { - return nil, err - } + return nil, err } - clientSet, err := kubernetes.NewForConfig(config) + clientSet, err := kubernetes.NewForConfig(c) if err != nil { return nil, err } + return &Client{ client: clientSet, }, nil