From c8f3c946b00c00cd185961a4fa777806da94014e Mon Sep 17 00:00:00 2001 From: Alex Jones Date: Thu, 30 Mar 2023 12:49:02 +0100 Subject: [PATCH] fix: now supports different kubeconfig and kubectx Signed-off-by: Alex Jones --- cmd/root.go | 24 ++++++++++++++---------- pkg/kubernetes/kubernetes.go | 25 +++++++++++++------------ 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index 446250b..e4030c4 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 8d589aa..522b2c4 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() - if err != nil { - kubeconfig := - clientcmd.NewDefaultClientConfigLoadingRules().GetDefaultFilename() - config, err = clientcmd.BuildConfigFromFlags(masterURL, kubeconfig) - if err != nil { - return nil, err - } - } - clientSet, err := kubernetes.NewForConfig(config) + config := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( + &clientcmd.ClientConfigLoadingRules{ExplicitPath: kubeconfig}, + &clientcmd.ConfigOverrides{ + CurrentContext: kubecontext, + }) + // create the clientset + c, err := config.ClientConfig() if err != nil { return nil, err } + clientSet, err := kubernetes.NewForConfig(c) + if err != nil { + return nil, err + } + return &Client{ client: clientSet, }, nil